一句话总结:
APK打包就像「给手机做一份便当」——把代码、图片、配置文件等食材整理好,通过现代化的厨具(AGP)进行烹饪(编译、优化),最后打包成一份精致的便当盒(APK),或者一份可定制的便当套餐(App Bundle),并贴上防伪封条(签名)保证安全。
现代Android打包流程(由Android Gradle插件AGP驱动)
1. 资源处理(AAPT2)
-
工具:AAPT2 (Android Asset Packaging Tool 2)
-
做什么:这是一个两阶段过程,效率更高。
- 编译(Compile) :将每个资源文件(如XML布局、图片)编译成中间二进制格式(
.flat)。 - 链接(Link) :合并所有编译后的资源,处理资源依赖,生成
resources.arsc(资源索引表)和R.java文件。
- 编译(Compile) :将每个资源文件(如XML布局、图片)编译成中间二进制格式(
-
类比:将各种食材进行预处理和标准化,方便后续烹饪。
2. 代码编译与优化(kotlinc/javac + R8)
-
工具:
kotlinc/javac和 R8 -
做什么:
-
编译:
kotlinc和javac将你的Kotlin和Java源代码编译成标准的Java字节码(.class文件)。 -
压缩、混淆、优化与Dex化:R8编译器接管所有
.class文件和库依赖。- 压缩(Shrinking) :移除无用的类、方法和字段。
- 混淆(Obfuscation) :重命名类和成员,使代码难以被逆向工程。
- 优化(Optimization) :分析并重写代码,提升运行性能。
- Dex化(Dexing) :将优化后的Java字节码转换为Android虚拟机(ART)可执行的
.dex文件。R8整合了ProGuard和D8的功能,是现代构建流程的核心。
-
-
类比:用高级厨艺烹饪主菜,不仅做熟,还去掉了多余的油脂(压缩),并用秘方调味(优化),让菜品更精炼。
3. 打包(ApkBuilder / ZipFlinger)
- 做什么:将上一步生成的
.dex文件、处理好的资源(resources.arsc等)、原生库(.so文件)以及AndroidManifest.xml等所有内容,打包成一个或多个APK文件。
4. 签名(apksigner)
-
工具:apksigner
-
做什么:使用你的私钥(
.keystore文件)对APK进行签名。- 现代签名方案:
apksigner支持V2、V3、V4签名方案,它们对整个APK文件进行校验,比传统的V1方案更安全、校验速度更快,是Google Play所要求的。
- 现代签名方案:
-
类比:给便当盒贴上品牌防伪封条,保证来源可靠且未被拆封。
注意:zipalign 是一种内存对齐优化,用于提升App运行效率,它必须在签名之前(针对V2+方案)执行。
现代发布核心:Android App Bundle (AAB)
APK是最终安装到手机上的文件,但现代开发中我们上传到Google Play的却是 AAB (.aab) 文件。
-
什么是AAB?
- 它是一个发布格式,包含了应用的所有编译代码和资源,但它本身不能直接安装。
-
工作原理:Dynamic Delivery(动态分发)
- 你将AAB上传到Google Play。
- 当用户下载你的App时,Google Play会根据用户的设备信息(如CPU架构、屏幕大小、语言),动态生成一个最优化的基础APK和若干配置APK,用户只需下载对自己设备有用的部分。
-
核心优势:极大地减小了用户下载和安装的App体积,提升了用户体验。
总结:从开发者到用户的完整路径
- 开发者: 编写代码和资源 -> 使用Android Studio (Gradle) 构建 -> 生成已签名的 AAB 文件。
- 发布: 将 AAB 上传到 Google Play Console。
- Google Play: 接收 AAB -> 运用 Dynamic Delivery -> 为不同用户设备生成并分发定制化的、最优的 APK 文件。
这个流程不仅高效、安全,更重要的是通过AAB和动态分发,为最终用户提供了最佳的体验。