Dex文件基本结构
Dex文件基本结构
Dex文件介绍
含义:专门位移动端开发的一种可执行文件格式
优点:比class文件体积小,真内存小,加载速度快,堆栈加载速度快,类查找快等,更适合手机
生成://javac c\b\a\HelloWorld.java
//dx –dex –output = c\b\a\HelloWorld.dex c\b\a\HelloWorld.class//这是旧版本的Android SDK写法
反编译smali
https://source.android.com/docs/core/runtime/instruction-formats?hl=zh-cn
https://source.android.com/docs/core/runtime/dex-format?hl=zh-cn
其他名词解释:
odex(5.0引入)、oat(elf,包含 odex内容)、vdex(8.0引入)
png文件格式的
生成代码如下图
注意下生成.dex的代码:1、要根据Android SDK的版本选择不同的命令
2、输出目录要合法(gdp要善于利用)
"D:\Android SDK\build-tools\35.0.0\d8.bat" --release --output D:\ideaprojects\untitled\src D:\ideaprojects\untitled\src\Main.class |
用GDA可查看.dex文件的字节码
odex:Odex 文件是对应于 .dex
文件的一种优化版本,它会提前编译和优化 Dalvik 字节码,以加快应用程序的加载速度和执行效率。
oat:OAT 文件中包含了经过优化的本地机器代码,这些代码相比于解释执行的字节码(.dex
文件),在执行时可以更快速和高效。这种预先编译的方式可以显著提高应用程序的启动速度、响应速度和运行效率。
vdex:VDex文件包含了经过优化和验证的DEX文件的内容。在应用程序安装或首次运行时,系统会将原始的DEX文件转换为VDex文件。这种优化不仅包括了对DEX文件中字节码的优化,还包括了对DEX文件中数据的验证和校验。
dex文件结构
Dex Header:对整个文件进行描述
索引表:记录信息
Proto索引表:类似存放函数签名
Field索引表:成员变量
数据区:存储数据
Map块:告诉我们有哪些索引方式
具体作用:
Leb128(Little-Endian Base 128)
u表示unsigned,s表示signed,p1是dalvik独有的编码格式(后面说明),是一种变长的整数压缩编码形式,通常由1-5byte组成,由一个int值再机器中占有4Byte。为了实现变长存储,节省空间,在Leb128格式中每个byte的最高位作为后续byte是否有效的标志位,1表示还有后续字节,0表示结束,后面7bits是有效数据,所有一个整数最大需要5byte存储
Uleb128
将无符号整数写成二进制形式,从低位到高位每个7bits作为一个整体组合成一个组,最高字节不足7bit,用0填充到7bit,在每组最高位填入是否有高字节的标识,构成一个完整的字节,然后将所有字节小端序排列
- 大端序(Big-Endian)将数据的低位字节存放在内存的高位地址,高位字节存放在低位地址。这种排列方式与数据用字节表示时的书写顺序一致,符合人类的阅读习惯。
- 小端序(Little-Endian),将一个多位数的低位放在较小的地址处,高位放在较大的地址处,则称小端序。小端序与人类的阅读习惯相反,但更符合计算机读取内存的方式,因为CPU读取内存中的数据时,是从低地址向高地址方向进行读取的。