Android Dex文件格式简介

来源:互联网 发布:杜兰特夺冠知乎 编辑:程序博客网 时间:2024/04/29 22:40

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示例

这里写图片描述

更详细的说明参考:
官方解释
中文博客解释

0 0
原创粉丝点击