android系统里,通过复杂的编译过程,会把java源代码生成dex文件,然后在虚拟机里就会加载这个文件运行。那么这个文件的格式是什么样的呢?为什么android不直接使用class文件,而采用这个不一样文件呢?其实它是针对嵌入式系统优化的结果,比如dex文件采用的指令码,并不是java的标准虚拟机指令,而是自己独立成一套。如果有自己的编译系统,可以不生成class文件,直接生成dex文件。还有dex文件是共用很多类名称、常量字符串,导致它的体积比较小,运行效率比较高。归根到底,就是它采用了基于寄存器的虚拟机实现。


接着来分析Dex的文件头,如下:


偏移

大小

说明

magic

8

魔数占4个字节,版本占4个字节。

checksum

4

检验码

signature

20

SHA-1签名

file_size

4

文件总长有多少个字节

header_size

4

文件头的长度。

endian_tag

4

标识字节顺序的常量。

uintENDIAN_CONSTANT = 0x12345678;

uintREVERSE_ENDIAN_CONSTANT = 0x78563412;

根据这个常量可以判断文件是否交换了字节顺序。

缺省情况下,使用小端格式。

link_size

4

连接段的大小,如果为0就表示是静态连接。

link_off

4

连接段的开始位置,从本文件头开始算起。如果连接段的大小为0,这里也是0

map_off

4

map数据开始位置。

string_ids_size

4

字符串列表的字符串个数。

string_ids_off

4

字符串列表的开始位置。

type_ids_size

4

类型列表里类型个数。

type_ids_off

4

类型列表开始位置。

proto_ids_size

4

原型列表个数。

proto_ids_off

4

原型列表开始位置。

field_ids_size

4

字段列表个数。

field_ids_off

4

字段列表开始位置。

method_ids_size

4

方法列表个数。

method_ids_off

4

方法列表的开始位置。

class_defs_size

4

类定义的个数。

class_defs_off

4

类定义列表开始位置。

data_size

4

数据段的大小,必须以4字节对齐。

data_off

4

数据段的开始位置。


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐