虚拟机对于 Dex 文件的解析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚拟机对于 Dex 文件的解析相关的知识,希望对你有一定的参考价值。
参考技术A以下基于 android_4.0.4源码进行分析。
先丢一张虚拟机用到的数据结构。我们的起点在
native private static int openDexFile(String sourceName, String outputName, int flags) throws IOException @ DexFile.java
重点 1
重点 2
@DvmDex.cpp
//根据 DexFile 的信息填充 DvmDex
static DvmDex* allocateAuxStructres(DexFile* pDexFile)
DvmDex* pDvmDex;
const DexHeader* pHeader;
u4 stringCount, classCount, methodCount, fileCount;
pDvmDex = (DvmDex*) calloc(1, sizeof(DvmDex));
pDvmDex->pDexFile = pDexFile;
pDvmDex->pHeader = pDexFile->pHeader;
pHeader = pDvmDex->pHeader;
stringCount = pHeader->stringIdsSize;
classCount = pHeader->typeIdsSize;
methodCount = pHeader->methodIdsSize;
filedCount = pHeader->fileIdsSize;
//根据实际的数量分配内存
pDvmDex->pResStrings = (struct StringObject ) calloc(stringCount, sizeof(struct stringObject ));
pDvmDex->pResClasses = (struct ClassObject ) calloc(ClassObject, sizeof(struct ClassObject ));
pDvmDex->pResMethods = (struct Method ) calloc(methodCount, sizeof(struct Method ));
pDvmDex->pResFilds = (struct Field ) calloc(fieldCount, sizeof(struct Field ));
...
pDvmDex->pInterfaceCache = dvmAllocAtomicCache(DEX_INTERFACE_CACHE_SIZE);
* 从上面看出来,DvmDex 包含 DexFile,DexFile 包含 DexHeader。通过解析 DexHeader,将常量池,方法区,字段等信息在内存的首地址存入 DexFile;然后通过 DexFile 的信息在 DvmDex 中分配合适的内存。于是 Dex 文件便初步解析完成了,并且保存在了内存。在进行类加载的时候,一个类的信息在内存中以 ClassObject 的结构保存。同时在 DexFile 中有一个 ClassLookup* pClassLookup 作为一个哈希表作为缓存保存已经加载了的类。
另外native private static int openDexFile(String sourceName, String outputName, int flags)的返回值是一个 int。明显这个 int 是对应 native 中一个对象的句柄。那么来看 Dalvik_dalvik_system_DexFile_openDexFile()@dalvik_system_DexFile.cpp 中的返回值是 DexOrJar。
于是在 DexFile 中的 cookie 保存的便是这个 DexOrJar 的地址。
https://github.com/Wi1ls/DexParse
以上是关于虚拟机对于 Dex 文件的解析的主要内容,如果未能解决你的问题,请参考以下文章
Java 虚拟机原理Dalvik 虚拟机 ( 打包 Jar 文件和 Dex 文件 | 反编译 Dex 文件 | 分析 Dex 文件反编译结果 )