为什么dex文件比class文件更适合移动端?
首先说明移动端的局限性
- 文件结构
- 内存有限
- 安装包体积不宜太大
- 频繁I/O操作会带来卡顿
Class文件
将.class文件直接打开会看到其物理结构。一个字节占用一个单元,存放一些字节码指令。
字节码文件的逻辑结构
- 文件头。存储文件基础信息
- 魔数。告诉虚拟机,这是一个可接受的Class文件,固定值为0xCAFEBABE
- 主版本号
- 次版本号
- 常量池。资源仓库,占用内存较大
- 常量池计数。计数从1开始,所以常量的数量是计数-1
- 类信息。
- 访问修饰限定符
- this class
- super class
- 接口计数
- 接口
- 字段表。成员变量、类变量等
- 字段表计数
- 字段
- 方法表。
- 属性信息。
dex文件
由多个.class文件通过Dx -dex工具转换成一个.dex文件
dex文件的逻辑结构
- 文件头
- string_ids
- type_ids
- proto_ids
- fieid_ids
- method_ids
- 类定义
- 数据
xx_ids为索引区,类定义与数据为数据区
class文件对比dex文件
.class:
- 每个类都有独立的常量池,导致代码冗余
- 每个类属于一个文件
- 基于栈的字节码
.dex:
- 常量记录在数据区,所有类都通过索引获取常量的值,相同的常量可以合并,大大降低了代码冗余
- 所有类在同一文件中,即使是multidex,文件总数也远小于class文件
- 基于虚拟寄存器的字节码