Dex文件及Dalvik字节码格式解析

Dex文件介绍

Dex文件是Dalvik的可执行文件,Dalvik是针对嵌入式设备设计的java虚拟机,所以Dex文件和Class文件的结构上有很大区别。为了更好的利用嵌入式你设备的资源,Dalvik在java程序编译后,还需要用dx工具将编译产生的数个Class文件整合成一个Dex文件。这样其中的各个类就可以共享数据,减少冗余,使文件结构更加紧凑。

一个设备在执行Dex文件之前,需要优化该Dex文件并生成对应的Odex文件,然后该Odex文件被Dalvik执行。Odex文件本质是个Dex文件,只是针对目标平台做了相关优化,包括对内部字节码进行一系列处理,主要为字节码验证,替换优化及空方法消除。

这里写图片描述

Dex文件结构解析

名称含义
headerDex文件头部,记录Dex文件的相关属性
string_ids字符串数据索引,记录了各个字符处在数据区的地址偏移量
type_ids类型数据索引,记录了各个类型的字符串索引
proto_ids原型数据索引,记录了方法声明的字符串、返回类型字符串、参数列表
field_ids字段数据索引,记录所属类、声明类型及方法名等信息
method_ids类方法索引,记录方法所属类名、方法声明及该方法名等信息
class_ids类定义数据,记录了指定类各类信息,包括接口、超类、类数据偏移量等
data数据区,保存着各个类的真实数据
link_data连接数据区

字节码各部分数据详解

  • header
    header是Dex文件的文件头,简单的记录了Dex文件的一些基本信息,及大致数据分布。header的总长度是固定的0x70,其中每一信息项所占的内存空间也是相对固定的,这样做的好处,虚拟机在处理目标Dex文件初期,可以不考虑Dex文件的多样性,根据规定读取文件头,就可以获取Dex文件的大致信息。
    Dex文件头部信息:
字段名偏移量长度描述
magic0x08“魔数”,格式如”/dex/n035/0”
Cheaksum0x84校验码
signature0xC20SHA-1签名
File_size0x204Dex文件的长度
Header_size0x244文件头长度,009版本=0x5C,035版本=0x70
Endian_tag0x284标示字节顺序的常量
Link_size0x2C4链接桥的大小,若0则为静态链接
Link_off0x304链接段的开始位置
Map_off0x344Map数据基址
String_ids_size0x384字符串列表中的字符串个数
String_ids_off0x3C4字符串列表基址
Type_ids_size0x404类列表里的类型个数
Type_ids_off0x444类列表基址
Proto_ids_size0x484原型列表里的原型个数
Proto_ids_off0x4C4原型列表里的字段个数
Field_ids_size0x504字段列表里的字段个数
Field_ids_off0x544字段列表的基址
Method_ids_size0x584方法列表里的方法个数
Method_ids_off0x5C4方法列表基址
Class_ids_size0x604类定义表中的类的个数
Class_ids_off0x644类定义表基址
Data_ids_size0x684数据段大小,必须以4字节对其
Data_ids_off0x6C4数据段基址

源码位于 /dalvik/libdex/DexFile.h:DexHeader

这里写图片描述


  • string_ids
    这一区域存储的是Dex文件字符串资源的索引信息,该索引信息是目标字符串在Dex文件数据区所在的真实物理偏移量。

源码位于/dalvik/libdex/DexFile.h:DexStringId
这里写图片描述

stringDataOff记录了目标字符串在Dex文件中的实际偏移量,虚拟机想读取该字符串时,只需将Dex文件在内存中的起始地址加上stringDataOff所指的偏移量,就是该字符串在内存中的实际物理地址。
在Dex文件中,每个每个字符串对应一个DexStringId,大小4B。另外虚拟机通过DexHeader中的String_ids_size获得当前Dex文件中的字符串的总数,通过乘法就可对该索引资源进行访问。

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值