Android培训班(60)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

数据段的开始位置。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值