APK构建流程
2020-03-04 本文已影响0人
瑜小贤
1.总述 apk打包总体流程
apk打包流程2.工具列表
工具 | 描述 |
---|---|
aapt | Android资源打包工具 |
aidl | Android接口描述语言转化为跨进程通信.java文件的工具 |
javac | Java编译器 |
proguard | 代码混淆工具 |
dx/d8 | 转化.class文件为Dalvik VM能识别的.dex文件 |
apkbuilder | 打包生成apk包 |
jarsigner | 签名工具 |
zipalign | 字节码对齐优化工具 |
3.资源文件编译
aapt:Android Asset Packaging Tool 资源合并流程 资源文件编译生成res资源,AndroidManifest文件,assets资源
- 生成R.java文件。赋予每一个非assets资源一个ID值,以常量的形式定义于R.java文件中
public final class R {
private R()
public static final class anim{...}
public static final class attr{...}
public static final class bool{...}
public static final class color{...}
public static final class dimen{...}
public static final class drawable{...}
public static final class id{...}
public static final class integer{...}
public static final class layout{...}
public static final class string{...}
public static final class style{...}
}
例
R.string.appname = 0x7f07006b
package_id(资源包) -- 0x7f
style_id(String类型) -- 07
index_id(当前类型中的序号) -- 006b
-
生成resources.arsc文件,用来描述那些具有ID值的资源的配置信息,它的内容就相当于是一个资源索引表。包含了所有的id值的数据集合。在该文件中,如果某个id对应的是string,那么该文件会直接包含该值,如果id对应的资源是某个layout或者drawable资源,那么该文件会存入对应资源的路径。
可以通过Analyze apk功能查看resource.arsc的文件结构:
resource.arsc文件结构
4. aidl文件编译
- aidl工具解析接口定义文件,然后生成响应的Java代码接口供程序调用。如果在项目没有使用到aidl文件,则可以跳过这一步。
- 输入:aidl后缀的文件,位于工程src/main/aidl目录
- 输出:可用于进程通信的C/S端java代码,位于build/generated/source/aidl/
5. java源码编译
- R.java和aidl生成的java文件,再加上工程的源代码,使用javac编译生成class文件
- 输入:java源码文件夹(另外还包括了aapt生成的R.java,aidl生成的java文件,以及BuildConfig.java)
- 输出:对于gradle编译,生成的class文件保存在build/intermediates/classes/
6. proguard代码混淆
- javac完成代码编译后,一般还会对源码进行混淆,类似于加密,目的是增加反编译的难度,同时也将代码名称进行缩短,减少代码占用体积
- 输入:编译后的.class文件,混淆规则配置文件proguard-rules.pro
- 输出:被混淆后的.class文件,混淆前后的映射文件
7. 转换为DEX文件
- dx工具生成可供Android系统虚拟机可以执行的classes.dex文件。dx会将class转换为Dalvik字节码,生成常量池,消除冗余数据等
- 输入:所有的.class文件
-
输出:classes.dex文件
dex输入输出图示
8.打包apk文件
- 打包生成apk文件。旧的apkbuilder脚本已经废弃,现在通过sdklib.jar的ApkBuilder类进行打包
- 输入:.ap_资源包文件,class.dex文件,未变异的资源文件(asset资源等),libs等文件
- 输出:apk文件
9.签名apk文件
- 对apk文件进行签名,签名后才能在设备上进行安装
- 输入:上一步中生成的.apk文件、签名文件(Debug or Release Keystore)
- 输出:签名后的apk文件
10.zipalign优化
- zipalign对签名后的apk文件进行对齐处理,使apk中所有资源文件距离文件起始偏移为4字节的整数倍,从而在通过内存映射访问apk文件时会更快,同事也减少了在设备上运行时的内存消耗
- 输入:签名后的apk文件
- 输出:对齐优化的apk文件
APK典型文件包含
- AndroidManifest.xml 程序全局配置文件
- classes.dex Dalvik字节码
- resources.arsc 资源索引表
- META-INF 该目录下存放的是签名信息
- res 该目录存放资源文件
- assets 该目录可以存放一些配置或资源文件