Android可执行文件

Android程序的生成

通常分为7步

  • 打包资源,生成R.java文件

打包资源的工具aapt位于android-sdk\platform-tools目录下

  • 处理aidl文件,生成相应的java文件,对没有使用到aidl的android工程这一步可以跳过

使用到的工具为aidl,位于android-sdk\platform-tools目录下

  • 编译工程源码,生成相应的class文件

这一步调用javac编译工程src目录下所有的java源文件,生成的class文件位于工程的bin\classes目录下

  • 转换所有的class文件,生成classes.dex文件

android系统Dalvik虚拟机的可执行文件为DEX格式,程序运行所需的classes.dex就是在这一步生成的,使用到的工具为dx,位于android-sdk\platform-tools

  • 打包生成APK文件

打包的工具为apkbuilder,位于android-sdk\tools目录

  • 对APK文件进行签名

Android的应用程序需要签名才能在Android设备上安装,在编译调试时候会使用一个debug.keystore对apk签名,另一种是打包发布时候进行签名,需要提供一个符合android开发文档中要求的签名

  • 对签名后的APK文件进行对齐处理

使用工具zipalign,位于android-sdk\tools目录,主要工作就是将apk包进行对齐处理,使得apk包中所有资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时速度会更快

dex文件格式

数据类型

类型 含义
u1 等同于unit8_t,表示1字节的无符号数
u2 等同于unit16_t,表示2字节的无符号数
u4 等同于unit32_t,表示4字节的无符号数
u8 等同于unit64_t,表示8字节的无符号数
sleb128 有符号LEB128,可变字节1~5字节
uleb128 无符号LEB128,可变字节1~5字节
sleb128p1 无符号LEB128值加1,可变字节1~5字节

dex文件整体结构

dex文件的整体结构比较简单,它是由多个结构组合而成的,一共有7个部分组成:

dex header——指定了dex文件的一些属性,并记录了其他6各部分数据结构在dex文件中的物理偏移

string_ids到class_def结构可以理解为“索引结构区”

data:真实的数据存放区

link_data:静态链接数据区

odex文件

odex文件的结构可以理解为dex文件的一个超集,它在dex文件头部添加了一些数据,然后在dex文件尾部添加了dex文件的依赖库以及一些辅助效果

0%