Android 可执行文件

来源:互联网 发布:sql left join where 编辑:程序博客网 时间:2024/06/01 09:42
简介

可执行文件是操作系统的基础,它反映着系统的运行机制,Android系统的可执行文件也是如此。

Apk

Apk是Android Package的缩写,实际上Apk文件就是一个zip压缩包,使用zip格式解压缩软件对apk文件进行解压,会发现它由一些图片资源与其它文件

组成,并且每个apk文件中包含一个classes.dex,它是Dalvik可执行文件。

dex 文件格式

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

Dex文件头主要包括校验和以及其他结构的偏移地址和长度信息。

字段名称偏移值长度描述magic0x08'Magic'值,即魔数字段,格式如”dex/n035/0”,其中的035表示结构的版本。checksum0x84校验码。signature0xC20SHA-1签名。file_size0x204Dex文件的总长度。header_size0x244文件头长度,009版本=0x5C,035版本=0x70。endian_tag0x284标识字节顺序的常量,根据这个常量可以判断文件是否交换了字节顺序,缺省情况下=0x78563412。link_size0x2C4连接段的大小,如果为0就表示是静态连接。link_off0x304连接段的开始位置,从本文件头开始算起。如果连接段的大小为0,这里也是0。map_off0x344map数据基地址。string_ids_size0x384字符串列表的字符串个数。string_ids_off0x3C4字符串列表表基地址。type_ids_size0x404类型列表里类型个数。type_ids_off0x444类型列表基地址。proto_ids_size0x484原型列表里原型个数。proto_ids_off0x4C4原型列表基地址。field_ids_size0x504字段列表里字段个数。field_ids_off0x544字段列表基地址。method_ids_size0x584方法列表里方法个数。method_ids_off0x5C4方法列表基地址。class_defs_size0x604类定义类表中类的个数。class_defs_off0x644类定义列表基地址。data_size0x684数据段的大小,必须以4字节对齐。data_off0x6C4数据段基地址

odex文件格式

odex是OptimizedDEX的缩写,表示经过优化的dex文件。

odex有两种存在的方式:一种是从apk程序中提取出来的,与apk文件存放在同一目录且文件后缀为odex的文件,这类odex文件多是Android ROM的系统程序;

另一种是dalvik-cache缓存文件,这类Odex文件仍然以dex作为后缀,存放在cache/dalvik-cache目录下,保存的形式为“apk路径@apk名@classes.dex”。


dex文件的验证

Android提供了一个专门验证与优化dex文件的工具dexopt,该软件是开源的,可以下载到源码,验证过程如下:


小结

了解了dex、odex文件格式,对Android程序本身有更深层次的认识。当然也可以通过修改dex中的执行路径从而破解程序,因为Android应用程序的代码都存储在dex文件中。

相关下载

实例以及工具源码下载