DEX格式
Dex保存了一组类及其关联的附件数据
数据类型
小端序 低字节存储在最低的内存地址处
大端序 高字节存储在最低的内存地址处
LEB128
LEB128(“Little-Endian Base 128”)是用于任意带符号或无符号整数的可变长度编码。 该格式借鉴了DWARF3规范。 在.dex文件中,LEB128仅用于编码32位整形数。
每个LEB128编码值由一到五个字节组成,它们一起表示一个32位的值。 每个字节的最高有效位除序列中的最后一个字节外,其最高有效位零。 每个字节的剩余7位是有效载荷,第一个字节中的数量最低有效7位,第二个字节中的下一个七位,依此类推。 在带符号LEB128(sleb128)的情况下,序列中最后一个字节的最重要的有效负载符号扩展以产生最终值。 在无符号情况下(uleb128),任何未明确表示的位都被解释为0。
示例
编码的每个字节有效部分只有低7bits,每个字节的最高bit用来指示是否是最后一个字节。1表示还有后续字节,0表示结束
用LEB128编码的正数,会根据数字的大小改变所占字节数。
Dex文件布局
4字节或单字节对齐
名称 | 格式 | 说明 |
Header | Header_item | 头部信息: 魔数(Dex035) checksum(除魔数和此字段的剩余文件部分的adler32校验和) signature(除魔数、校验和以及此字段剩余文件内容的SHA-1 hash值) file_size(文件大小) header_size(头部块大小) endian_tag(指示文件的字节顺序) … 后面各个表对应的大小和偏移量 头部大小固定为0x70 |
string_ids | string_id_item[] | 字符串标识符列表。 这些是用于该文件的所有字符串的标识符,用于内部命名(例如,类型描述符)或由代码引用的常量对象。 此列表必须按字符串内容排序,使用UTF-16代码点值(不是以区域设置敏感方式),并且不得包含任何重复的条目。 |
type_ids | type_id_item[] | 类型标识符列表。 这些是由该文件引用的所有类型(类,数组或原始类型)的标识符,无论是否在文件中定义。 此列表必须由string_id索引排序,并且不得包含任何重复的条目。 |
proto_ids | proto_id_item[] | 方法原型标识符列表。 这些是此文件引用的所有原型的标识符。 此列表必须按返回类型(按type_id索引)主顺序排序,然后通过参数列表(字典排序,由type_id索引排序的各个参数)进行排序。 列表不能包含任何重复的条目。 |
field_ids | field_id_item[] | 字段标识符列表。 这些是由该文件引用的所有字段的标识符,无论是否在文件中定义。 此列表必须排序,其中定义类型(按type_id索引)是主要顺序,字段名称(通过string_id索引)是中间顺序,类型(按type_id索引)是次要顺序。 列表不能包含任何重复的条目。 |
method_ids | method_id_item[] | 方法标识符列表。 这些是由该文件引用的所有方法的标识符,无论是否在文件中定义。 该列表必须进行排序,其中定义类型(按type_id索引)是主要顺序,方法名称(通过string_id索引)是中间顺序,方法原型(通过proto_id索引)是次要顺序。 列表不能包含任何重复的条目。 |
class_defs | class_def_item[] | 类定义列表。 必须对这些类进行排序,使得给定类的超类和实现的接口出现在引用类之前的列表中。 此外,对于同名类的定义在列表中不止一次出现是无效的。 |
call_site_ids | method_handle_item[] | 方法处理列表。 该文件所引用的所有方法句柄的列表,无论是否在文件中定义。 此列表未排序,并且可能包含将在逻辑上对应于不同方法句柄实例的重复项。 |
data | ubyte[] | 数据区,包含上表列出的所有支持数据。 不同的项目具有不同的对齐要求,并且如果需要,在每个项目之前插入填充字节以实现正确的对准。 |
link_data | ubyte[] | 静态链接文件中使用的数据。 本节中的数据格式未经本文档的说明。 此部分在未链接的文件中为空,运行时实现可能会使用它们,因为它们是合适的。 |
class_def_item示例