以下基于 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文件是Android系统的可执行文件,包含应用程序的全部 *** 作指令以及运行时数据。
由于dalvik是一种针对嵌入式设备而特殊设计的java虚拟机,所以dex文件与标准的class文件在结构设计上有着本质的区别。
当java程序编译成class后,还需要使用dex工具将所有的class文件整合到一个dex文件,目的是其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加经凑,dex文件是传统jar文件大小的50%左右。
dex将原来class每个文件都有的共有信息合成一体,这样减少了class的冗余。
从宏观上来说dex的文件结果很简单,实际上是由多个不同结构的数据体以首尾相接的方式拼接而成。
扩展资料:
Android的系统架构和其 *** 作系统一样,采用了分层的架构。
从架构图看,Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。
dex文件的作用:
dex文件的作用是记录整个工程(通常是一个Android工程)的所有类文件的信息。
dex文件的结构:
8位字节的二进制流文件;各个数据紧密排列,无间隙,减少了文件体积,加快加载速度;整个工程的类信息都存放在一个dex文件中(不考虑dex分包的情况下);同样地,可以通过010Editor来查看dex文件信息。
参考资料:百度百科-Android
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)