ART深入浅出4--了解Dex文件格式(1)

本文详细介绍了Android的Dex文件格式,包括理解dex指令特点、字符串池的存储方式以及Dex文件中的各种表,如TypeIds、FieldIds等。通过对Dex文件结构的解析,帮助读者更好地理解Android应用的编译原理。
摘要由CSDN通过智能技术生成

本文基于Android 7.1,不过因为从BSP拿到的版本略有区别,所以本文提到的源码未必与读者找到的源码完全一致。本文在提供源码片断时,将按照 <源码相对android工程的路径>:<行号> <类名> <函数名> 的方式,如果行号对不上,请参考类名和函数名来找到对应的源码。

可以参考我之前写过的文章:http://blog.csdn.net/doon/article/details/51691627

理解dex文件的基本格式

理解dex指令特点

要理解dex文件,首先要dex的指令特点。dex被称为是基于寄存器的虚拟机指令。这里的寄存器,不是指物理寄存器,而是指虚拟机虚拟出的寄存器。而且不同于有我们熟悉的编译性语言(如C/C++),dex指令在运行时,只需要寄存器,不需要堆栈。dex指令有如下特点:

  1. 一个函数拥有一组独立的寄存器 将每个函数的寄存器数量是不固定的,标记为V0~Vn-1,最多可以有65535个
  2. 一个函数的虚拟寄存器可以划分为三部分:
    1. 自变量区:保存的是函数内部用到的自变量
    2. 参数输入区:保存的是输入的参数值
    3. 输出参数区:被用于保存被调用函数的参数。因为输出参数区只用作参数输出,所以在虚拟机实现的时候,通常把调用函数的输出参数区与被调用函数的输入参数区重叠
  3. 假设一个函数有M个参数,那么参数将占据 Vn-m ~ Vn-1,剩余部分将被内部变量占据
  4. 假如一个函数有自变量a,b,且a,b的作用域不重叠,那么它们可以占据同一个寄存器Vi

如下图:
Dex寄存器图

字符串池

字符串在java和dex中都是非常重要的。不仅在编程中包含大量的常量字符,而且,java的类名、方法名、成员名等都是以字符串的形式保存下来的。
那么,字符串在dex中如何存储呢?了解java class文件结构的朋友一定也听说过,在class文件中有一个字符串池,保存了源码中存在的各种字符串以及各种名称。同样的,在dex文件中,也可以看到这样的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值