什么是 dex 文件
他是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。
由于dalvik是一种针对嵌入式设备而特殊设计的java虚拟机,所以dex文件与标准的class文件在结构设计上有着本质的区别
当java程序编译成class后,还需要使用dx工具将所有的class文件整合到一个dex文件,目的是其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加经凑,实验表明,dex文件是传统jar文件大小的50%左右
可以看见:
dex将原来class每个文件都有的共有信息合成一体,这样减少了class的冗余
数据结构
类型
含义
u1
unit8_t,1字节无符号数
u2
unit16_t,2字节无符号数
u4
unit32_t,4字节无符号数
u8
unit64_t,8字节无符号数
sleb128
有符号LEB128,可变长度1~5
uleb128
无符号LEB128,
uleb128p1
无符号LEB128值加1,
dex文件结构
首先从宏观上来说 dex 的文件结构很简单,实际上是由多个不同结构的数据体以首尾相接的方式拼接而成。如下图:
数据名称
解释
header
dex文件头部,记录整个dex文件的相关属性
string_ids
字符串数据索引,记录了每个字符串在数据区的偏移量
type_ids
类似数据索引,记录了每个类型的字符串索引
proto_ids
原型数据索引,记录了方法声明的字符串,返回类型字符串,参数列表
field_ids
字段数据索引,记录了所属类,类型以及方法名
method_ids
类方法索引,记录方法所属类名,方法声明以及方法名等信息
class_defs
类定义数据索引,记录指定类各类信息,包括接口,超类,类数据偏移量
data
数据区,保存了各个类的真是数据
link_data
连接数据区
header
简单记录了dex文件的一些基本信息,以及大致的数据分布。长度固定为0x70,其中每一项信息所占用的内存空间也是固定的,好处是虚拟机在处理dex时不用考虑dex文件的多样性
字段名称
偏移值
长度
说明
magic
0x0
8
魔术字段,值为"de