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