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

数据段的开始位置。


更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android之——利用系统权限实现手机重启(获取系统权限签名详解)
  6. 实现Unity和Android进行交互
  7. Android(安卓)AIDL IPC机制详解
  8. 用android ksoap2 上传、下载数据
  9. Java采用JNI调用VC++生成的dll(Java与C++交互)

随机推荐

  1. Android(安卓)的Handle之postDelayed方法
  2. Android(安卓)Tunnel Mode
  3. Android:res之layer-list的用法
  4. 【Android】自定义蒙层
  5. android 设计
  6. android 平台USB wifi驱动移植及使用
  7. 自动完成文本框(AutoCompleteTextView)
  8. 适配Android(安卓)7.0出现读取外部存储问
  9. iOS & Android(安卓)摄像头渲染比较
  10. 【Android多媒体】Android5.0 NuPlayer多