dex文件 - 简书

浅谈 Android Dex 文件

        dex文件是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。
  当java程序编译成class后,还需要使用dx工具将所有的class文件整合到一个dex文件,目的是其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加经凑,实验表明,dex文件是传统jar文件大小的50%左右

dex文件转换成java dex文件格式_字符串

1、文件布局

  dex 文件可以分为3个模块,头文件索引区数据区。头文件概况的描述了整个 dex 文件的分布,包括每一个索引区的大小跟偏移。索引区表示每个数据的标识,索引区主要是指向数据区的偏移。

dex文件转换成java dex文件格式_数据格式_02

dex文件转换成java dex文件格式_字符串_03

dex文件转换成java dex文件格式_android_04

  • 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 包。

文件头

文件头区域决定了该怎样来读取这个文件。具体的格式如下表(在文件中排列的顺序就是下面表格中的顺序):

dex文件转换成java dex文件格式_dex文件转换成java_05

id 区

id 区存储着字符串,type,prototype,field, method 资源的真正数据在文件中的偏移量,我们可以根据 id 区的偏移量去找到该 id 对应的真实数据。

字符串 id 区域

这个区块是一个偏移量列表,每个偏移量对应了一个真正的字符串资源,每个偏移量占32位。我们可以通过偏移量找到对应的实际字符串数据。具体格式如下:

dex文件转换成java dex文件格式_字符串_06

最终这个偏移的位置应该是落在数据区的。找到这个偏移量的位置后,根据下面的格式就可以读取出这个字符串资源的具体数据:

类型 id 区

这个区块是一个索引列表,索引的值对应字符串id区域偏移量列表中的某一项。数据格式如下:

dex文件转换成java dex文件格式_dex文件转换成java_07

如果我们要找到某个类型的值,需要先根据类型id列表中的索引值去字符串id列表中找到对应的项,这一项存储的偏移量对应的字符串资源就是这个类型的字符串描述。

方法原型 id 区

这个区块是一个方法原型 id 列表,数据格式为:

dex文件转换成java dex文件格式_android_08

成员 id 区

这个区块存储着原型 id 列表,数据格式为:

dex文件转换成java dex文件格式_dex文件转换成java_09

方法 id 区

这个区块存储着方法 id 列表,数据格式为: 这个区块存储着原型 id 列表,数据格式为:

dex文件转换成java dex文件格式_android_10

类定义区

这个区域存储的是类定义的列表,具体的数据结构如下:

dex文件转换成java dex文件格式_偏移量_11