什么是DEX
DEX概念
Dalvik Executable File , DEX是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。在程序编译过程中, java 源文件先被编译成class文件,然后通过dx工具将多个class文件整合为一个dex文件。这样的文件结构使得各个类能够共享数据,充分减少了存储空间,提升了运行效率
DEX作用
当java程序编译成class后,还需要使用dx工具将所有的class文件整合到一个dex文件,目的是其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加经凑,实验表明,dex文件是传统jar文件大小的50%左右


使用 010或者 winHex 可以查看dex文件的格式和内容

DEX文件结构分布

DEX的数据结构
类型 | 含义 |
u1 | unit8_t,1字节无符号数 |
u2 | unit16_t,2字节无符号数 |
u4 | uint32_t,4字节无符号数 |
u8 | unit64_t,8字节无符号数 |
sleb128 | 有符号LEB128,可变长度1~5 |
uleb128 | 无符号LEB128 |
uleb128p1 | 无符号LEB128值加1 |
表示1到8个字节的无符号数,后面三个是dex特有的数据结构
DEX文件结构
数据名称 | 解释 |
header | dex文件头部,记录整个dex文件的相关属性 |
string_ ids | 字符串数据索引,记录 了每个字符串在数据区的偏移量 |
type_ids | 类似数据索引,记录了每个类型的字符串索引 |
proto_ids | 原型数据索引,记录了方法声明的字符串,返回类型字符串,参数列表 |
field_ids | 字段数据索引,记录了所属类,类型以及方法名 |
method_ids | 类方法索引,记录方法所属类名,方法声明以及方法名等信息 |
class_defs | 类定义数据索引,记录指定类各类信息,包括接口,超类,类数据偏移量 |
data | 数据区,保存了各个类的真实数据 |
link_data | 连接数据区 |
header
header是DEX文件头,包含magic字段、alder32校验值、SHA-1哈希值、string_ids的个数以及便宜地址等。DEX文件的头结构很固定,占用0x70个字节。
具体定义代码如下:

header代码定义:

Header的大小固定为0x70,便宜地址从0x00到0x70,提取信息如下

DEX文件结构之详解
### string ids
string ids_ :这些是用于该文件的所有字符串的标识符,用于内部命名(如:类型描述)或代码引|用的常量对象。此列表必须按字符串内容排序,使用UTF-16代码点值,并且不能包含任何重复的条目。
### type ids
type ids_ :这些是由该文件引 |用的所有类型(类,数组或原始类型)的标识符,无论是否在文件中定义,这个数据结构中存放的数据主要是描述dex中所有的类型,比如类类型,基本类型等信息。type ids区索引了dex文件里的所有数据类型,包括 class类型, 数组类型
( array types )和基本类型(primitive types)。此列表必须由 string id索|排序,并且不得包含任何重复的条目。
### class defs
class defs_ 必须对这些类进行排序,使得给定类的超类和实现的接口出现在引|用类之前的列表中。此外,对于同名类的定义在列表中不止一次出现是无效的。
## data
data_ : 数据区,包含上表列出的所有支持数据。不同的项目具有不同的对齐要求,并且如果需要,在每个项目之前插入填充字节以实现正确的对准。
### link data
link data :静态链接文件中使用的数据。本节中的数据格式未经本文档的说明。此部分在末链接的文件中为空,运行时实现可能会使用它们。