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文件的依赖库以及一些辅助效果