Android Dex文件格式简介

本文介绍了DEX文件格式的基础知识,包括其采用的小端序、LEB128编码方式,以及DEX文件的整体布局。详细阐述了从头信息到各种ID列表的数据结构,如字符串、类型、方法等标识符列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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字节或单字节对齐

名称格式说明
HeaderHeader_item头部信息:
魔数(Dex035)
checksum(除魔数和此字段的剩余文件部分的adler32校验和)
signature(除魔数、校验和以及此字段剩余文件内容的SHA-1 hash值)
file_size(文件大小)
header_size(头部块大小)
endian_tag(指示文件的字节顺序)

后面各个表对应的大小和偏移量
头部大小固定为0x70
string_idsstring_id_item[]字符串标识符列表。 这些是用于该文件的所有字符串的标识符,用于内部命名(例如,类型描述符)或由代码引用的常量对象。 此列表必须按字符串内容排序,使用UTF-16代码点值(不是以区域设置敏感方式),并且不得包含任何重复的条目。
type_idstype_id_item[]类型标识符列表。 这些是由该文件引用的所有类型(类,数组或原始类型)的标识符,无论是否在文件中定义。 此列表必须由string_id索引排序,并且不得包含任何重复的条目。
proto_idsproto_id_item[]方法原型标识符列表。 这些是此文件引用的所有原型的标识符。 此列表必须按返回类型(按type_id索引)主顺序排序,然后通过参数列表(字典排序,由type_id索引排序的各个参数)进行排序。 列表不能包含任何重复的条目。
field_idsfield_id_item[]字段标识符列表。 这些是由该文件引用的所有字段的标识符,无论是否在文件中定义。 此列表必须排序,其中定义类型(按type_id索引)是主要顺序,字段名称(通过string_id索引)是中间顺序,类型(按type_id索引)是次要顺序。 列表不能包含任何重复的条目。
method_idsmethod_id_item[]方法标识符列表。 这些是由该文件引用的所有方法的标识符,无论是否在文件中定义。 该列表必须进行排序,其中定义类型(按type_id索引)是主要顺序,方法名称(通过string_id索引)是中间顺序,方法原型(通过proto_id索引)是次要顺序。 列表不能包含任何重复的条目。
class_defsclass_def_item[]类定义列表。 必须对这些类进行排序,使得给定类的超类和实现的接口出现在引用类之前的列表中。 此外,对于同名类的定义在列表中不止一次出现是无效的。
call_site_idsmethod_handle_item[]方法处理列表。 该文件所引用的所有方法句柄的列表,无论是否在文件中定义。 此列表未排序,并且可能包含将在逻辑上对应于不同方法句柄实例的重复项。
dataubyte[]数据区,包含上表列出的所有支持数据。 不同的项目具有不同的对齐要求,并且如果需要,在每个项目之前插入填充字节以实现正确的对准。
link_dataubyte[]静态链接文件中使用的数据。 本节中的数据格式未经本文档的说明。 此部分在未链接的文件中为空,运行时实现可能会使用它们,因为它们是合适的。

class_def_item示例

这里写图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值