扫盲系列 - APK 打包流程
介绍
APK 就是 Android Package 。 APK 文件,其实就是一个压缩包,解压后就会发现他内部主要就是资源文件和class.dex,这个class.dex 就是 Android 系统 Dalvik 虚拟机可执行的文件,
一个 APK 解压后的
- AndroidManifest.xml:对应源代码中的AndroidManifest.xml文件,但这里已经编译过了,文件内容已经不同了
- assert目录: 对应源代码中的 assert 目录,是直接复制过来的
- class.dex: 包含所有 Java 文件对应的字节码
- lib 目录: 对应源代码中的 libs 目录,包含 so 文件
- META_INF 目录: 包含CERT.RSA、CERT.SF、MANIFEST.MF等, 保存了各个资源文件的 SHA1 值,用于校验资源文件是否被篡改,从而防止二次打包时资源文件被替换。
- res目录: 对应源代码中的 res 目录,包含了各种图片, xml 文件
- resources.arsc:包含了各个资源文件的映射, 可以理解为索引, 通过该文件能找到对应的资源文件信息。
APK的打包流程
1.打包资源文件,生成R.java文件
通过 AAPT 工具,项目中的AndroidManifest.xml和布局文件 xml 都会编译,生成相应的R.java 文件 和 resources.arsc文件
- AAPT : the Android Assert Package Tool, Android 资源打包工具 , 位于 android-sdk/build-tools目录下面
2.处理 AIDL 文件,生成相应的 Java 文件
通过 AIDL 工具解析接口定义文件,然后生成相应的 Java 代码接口供程序调用
如果项目中没有 AIDL 文件,可以跳过这一步。
- AIDL: Android Interface Definition Language, Android 接口描述语言。位于 android-sdk/build-tools 目录下
3.编译项目源码,生成 class 文件
通过 JAVAC 工具(java 编译器),把项目中的所有 Java 文件,包括R.java 和.aidl文件编译成.class文件。
生成的.class 文件位于工程的bin/class 目录下
- Javac 工具: 位于 javasdk/bin 下面,
4.转换所有的 class 文件,生成class.dex文件
通过 dx 工具,生成供 Android 系统 Dalvik 虚拟机执行的class.dex文件,任何第三方的 Libraries 和.class文件,都会被转成成.dex文件
- dx工具: 将 Java 字节码转换成 Dalvik 字节码,压缩常量池,消除冗余信息。位于 android-sdk/build-tools 目录
5.打包生成 APK 文件
所有没编译的资源(如 image 等),编译过的资源和.dex文件,都会被 apkbuilder 工具 打包到最终的.apk 文件中
- apkbuilder工具: 位于 android-sdk/tools目录,是一个脚本文件,实际调用的是android-sdk/tools/lib/sdklib.jar文件中的com.android.sdklib.build.ApkbuilderMain类。
6.对 APK 进行签名
通过 jarsigner 工具 对 APK 文件进行签名。因为只有被签名的文件才能安装到设备上。
- jarsigner 工具 ,位于 android-sdk/build-tools 目录下
在开发过程中,主要用到的的就是两种签名,
- 调试用的debug.keystore,它主要用于调试,在 AndroidStudio 或者 Eclipse 直接 run 以后安装到设备上使用的就是这个签名。
- 正式版本的keystore
7.对签名后的 APK 进行对齐处理
通过 zipalign 工具 对 APK 进行对齐处理。对齐的作用就是减少运行时内存的使用
主要过程就是将 APK 包中的资源文件距离文件起始距离为 4 字节的倍数,这样通过内存映射访问的 apk 文件时速度更快。
- zipalign 工具:位于android-sdk/build-tools 目录
第 1 , 2 , 4 , 6 , 7 步使用的工具都在 android-sdk/build-tools 下面
流程图
搬运地址:
既已览卷至此,何不品评一二: