解构现代Android构建:从源码到APK与App Bundle的演进之旅

612 阅读3分钟

一句话总结:

APK打包就像「给手机做一份便当」——把代码、图片、配置文件等食材整理好,通过现代化的厨具(AGP)进行烹饪(编译、优化),最后打包成一份精致的便当盒(APK),或者一份可定制的便当套餐(App Bundle),并贴上防伪封条(签名)保证安全。


现代Android打包流程(由Android Gradle插件AGP驱动)

1. 资源处理(AAPT2)

  • 工具AAPT2 (Android Asset Packaging Tool 2)

  • 做什么:这是一个两阶段过程,效率更高。

    1. 编译(Compile) :将每个资源文件(如XML布局、图片)编译成中间二进制格式(.flat)。
    2. 链接(Link) :合并所有编译后的资源,处理资源依赖,生成resources.arsc(资源索引表)和R.java文件。
  • 类比:将各种食材进行预处理和标准化,方便后续烹饪。

2. 代码编译与优化(kotlinc/javac + R8)

  • 工具kotlinc/javacR8

  • 做什么

    1. 编译kotlincjavac 将你的Kotlin和Java源代码编译成标准的Java字节码(.class文件)。

    2. 压缩、混淆、优化与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(动态分发)

    1. 你将AAB上传到Google Play。
    2. 当用户下载你的App时,Google Play会根据用户的设备信息(如CPU架构、屏幕大小、语言),动态生成一个最优化的基础APK和若干配置APK,用户只需下载对自己设备有用的部分。
  • 核心优势极大地减小了用户下载和安装的App体积,提升了用户体验。


总结:从开发者到用户的完整路径

  1. 开发者: 编写代码和资源 -> 使用Android Studio (Gradle) 构建 -> 生成已签名的 AAB 文件。
  2. 发布: 将 AAB 上传到 Google Play Console。
  3. Google Play: 接收 AAB -> 运用 Dynamic Delivery -> 为不同用户设备生成并分发定制化的、最优的 APK 文件。

这个流程不仅高效、安全,更重要的是通过AAB和动态分发,为最终用户提供了最佳的体验。