DEX格式

Dex保存了一组类及其关联的附件数据

数据类型

android文件系统格式 安卓的文件格式_android

小端序 低字节存储在最低的内存地址处
大端序 高字节存储在最低的内存地址处

LEB128

LEB128(“Little-Endian Base 128”)是用于任意带符号或无符号整数的可变长度编码。 该格式借鉴了DWARF3规范。 在.dex文件中,LEB128仅用于编码32位整形数。

每个LEB128编码值由一到五个字节组成,它们一起表示一个32位的值。 每个字节的最高有效位除序列中的最后一个字节外,其最高有效位零。 每个字节的剩余7位是有效载荷,第一个字节中的数量最低有效7位,第二个字节中的下一个七位,依此类推。 在带符号LEB128(sleb128)的情况下,序列中最后一个字节的最重要的有效负载符号扩展以产生最终值。 在无符号情况下(uleb128),任何未明确表示的位都被解释为0。

示例

android文件系统格式 安卓的文件格式_android_02


编码的每个字节有效部分只有低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示例

android文件系统格式 安卓的文件格式_字符串_03