Android培训班(60)dex文件格式
<!--@page{margin:2cm}td p{margin-bottom:0cm}p{margin-bottom:0.21cm}-->在android系统里,通过复杂的编译过程,会把java源代码生成dex文件,然后在虚拟机
在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 | 数据段的开始位置。 |
更多推荐
所有评论(0)