安卓打包流程
上图打包流程分析:
1、应用资源文件(布局,图片)使用aapt(资源处理工具)进行处理(布局等文件生成R.java包含资源唯一ID,静态资源文件不做处理)。
2、aidl接口、应用的java代码、R.java文件进行编译生成Class文件(字节码文件)
3、然后使用dx工具将生成的class文件和三方库、其他class文件进行翻译、重构、解释、压缩等处理,变成dex文件
4、使用apkbuilder工具进行dex文件,其他静态资源文件等进行打包成APK文件
5、使用签名工具jarSinger对打包成的APK进行签名
6、最后对签名后的APK文件进行优化(字节对齐,加快定位资源索引的速度,增加应用运行效率,将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。对齐的作用主要是为了减少运行时内存的使用。)
aapt工具
全称 Android Asset Packaging Tool
res下的资源都会被编译成一个资源索引文件resource.arsc以及一个R.java类。asset下的资源不会编译,直接压缩进apk
作用:查看和处理apk中的资源文件,可通过其加深对apk文件结构的理解。
1、查看包名、版本号、权限等信息
2、查看资源列表
3、查看apk配置信息
4、编译安卓资源文件
dx工具
将class文件和jar包进行编译优化打包成dex文件。(AGP3.0.1之后使用的是D8)
为什么要打包成dex文件?
Dalvik 是 Google 设计的用于 Android平台的运行时环境,适合移动环境下内存和处理器速度有限的系统。但Dalvik虚拟机不支持直接执行字节码,因此需要对class文件进行进行翻译、重构、解释、压缩等处理(由 dx 进行进行该过程),生成 Dex 文件。
^: 掌握dex文件结构,能够帮助其他技术开发:APK 的瘦身、热修复、插件化、应用加固、Android 逆向工程、64 K 方法数限制。
D8/R8工具
dex 编译器和混淆压缩工具
java ——》class——》D8——》R8——》Dex
apkbuilder/zipflinger工具
将manifest文件、resources文件、dex文件、assets文件等等打包成一个压缩包,也就是apk文件。(AGP3.6.0后使用zipflinger)
jarsign工具
JDK提供的签名工具为jarsigner,安卓专门的签名工具为apksigner。
jarsigner:只能进行v1签名
apksigner:可以进行v2、v3、v4签名
zipalign工具
对apk
中未压缩的数据进行4字节对齐,对齐的主要过程是将APK
包中所有的资源文件距离文件起始偏移为4字节整数倍,对齐后就可以使用mmap
函数读取文件,可以像读取内存一样对普通文件进行操作。如果没有4字节对齐,就必须显式的读取,这样比较缓慢并且会耗费额外的内存。
- 如果使用的是
apksigner
,只能在为APK
文件签名之前执行zipalign
。 - 如果使用的是
jarsigner
,只能在为APK
文件签名之后执行zipalign
。