dex文件是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。
当java程序编译成class后,还需要使用dx工具将所有的class文件整合到一个dex文件,目的是其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加经凑,实验表明,dex文件是传统jar文件大小的50%左右。
dex 文件可以分为3个模块,头文件
、索引区
、数据区
。头文件概况的描述了整个 dex 文件的分布,包括每一个索引区的大小跟偏移。索引区表示每个数据的标识,索引区主要是指向数据区的偏移。
四字节对齐
,优点:apk 运行快,RAM 内存减小。打包流程
资源文件
通过 aapt 工具
生产 R.java 文件,xx.aidl 文件
通过 aidl 工具
生成 java 文件;java 编译工具
并并编译成 class 文件
;dx.bat
工具把 class 文件生产 dex 文件
;apk 包
;签名
,就成为可以运行的 apk 包。文件头区域决定了该怎样来读取这个文件。具体的格式如下表(在文件中排列的顺序就是下面表格中的顺序):
id 区存储着字符串,type,prototype,field, method 资源的真正数据在文件中的偏移量,我们可以根据 id 区的偏移量去找到该 id 对应的真实数据。
这个区块是一个偏移量列表,每个偏移量对应了一个真正的字符串资源,每个偏移量占32位。我们可以通过偏移量找到对应的实际字符串数据。具体格式如下:
最终这个偏移的位置应该是落在数据区的。找到这个偏移量的位置后,根据下面的格式就可以读取出这个字符串资源的具体数据:
这个区块是一个索引列表,索引的值对应字符串id区域偏移量列表中的某一项。数据格式如下:
如果我们要找到某个类型的值,需要先根据类型id列表中的索引值去字符串id列表中找到对应的项,这一项存储的偏移量对应的字符串资源就是这个类型的字符串描述。
这个区块是一个方法原型 id 列表,数据格式为:
这个区块存储着原型 id 列表,数据格式为:
这个区块存储着方法 id 列表,数据格式为: 这个区块存储着原型 id 列表,数据格式为:
这个区域存储的是类定义的列表,具体的数据结构如下: