apk打包过程

Table of Contents

写完安卓代码之后,我们的代码是怎么变成 apk 包的呢?

1. 编译代码(DEX 文件生成)

  • 输入:Java/Kotlin 源码。
  • 工具:Java/Kotlin 编译器,D8/R8 编译器。
  • 过程
    • Java/Kotlin 编译器将.java.kt文件编译为.class文件。
    • D8/R8 编译器将.class文件转换为 Android 虚拟机(Dalvik/ART)可执行的 DEX(Dalvik Executable)文件。
    • 如果启用了代码优化(如 ProGuard 或 R8),会在此阶段进行代码混淆、优化和缩减。
  • 原因
    • Android 系统使用 Dalvik 虚拟机或 ART 运行时来执行应用代码,而它们不能直接运行 Java 字节码(.class文件)。
    • DEX 文件是 Android 系统专用的字节码格式,优化了存储和执行效率。
    • 如果启用了代码优化(如 ProGuard 或 R8),还会减少 APK 体积并提高安全性(通过混淆代码)。
  • 输出:一个或多个.dex文件(通常为classes.dex)。

2. 打包资源

  • 输入:资源文件(如图片、布局文件、字符串等)和AndroidManifest.xml
  • 工具:AAPT(Android Asset Packaging Tool)或 AAPT2。
  • 过程
    • 将资源文件编译为二进制格式(如res/目录下的 XML 文件会被编译为二进制格式)。
    • 生成资源 ID(R.java文件),供代码引用资源。
    • 将编译后的资源和AndroidManifest.xml打包到一个临时文件中(通常是resources.arsc和二进制资源文件)。
  • 原因
    • 资源文件需要被编译为二进制格式,以减少文件大小并提高加载速度。
    • 生成资源 ID(R.java文件),使代码能够通过 ID 引用资源,而不是直接使用文件名,这样可以避免资源冲突。
    • 打包资源是为了将所有资源集中管理,方便 Android 系统在运行时快速查找和加载。
  • 输出:编译后的资源文件和resources.arsc(资源索引表)。

3. 生成未签名的 APK

  • 输入:DEX 文件、编译后的资源文件、AndroidManifest.xml、库文件(如.so文件)等。
  • 工具:APK Builder(通常由 Gradle 或命令行工具调用)。
  • 过程
    • 将所有文件(包括 DEX 文件、资源文件、清单文件、原生库等)打包到一个未签名的 APK 文件中。
    • 这个 APK 文件还不能直接安装,因为它没有签名。
  • 原因
    • 将所有应用组件(代码、资源、清单文件等)打包到一个文件中,方便分发和安装。
    • 未签名的 APK 是一个中间产物,还不能直接安装,因为它缺少开发者的数字签名。
  • 输出:未签名的 APK 文件。

4. 签名 APK

  • 输入:未签名的 APK 文件和签名密钥。
  • 工具jarsignerapksigner
  • 过程
    • 生成签名密钥(如果尚未生成):
      • 使用keytool生成密钥库(Keystore):
        keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-alias
        
    • 签名 APK
      • 使用jarsigner签名:
        jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 -keystore my-release-key.jks my-app-unsigned.apk my-key-alias
        
      • 或者使用apksigner签名(推荐):
        apksigner sign --ks my-release-key.jks --out my-app-signed.apk my-app-unsigned.apk
        
    • 签名后,APK 文件会包含开发者的数字签名,确保其完整性和来源可信。
  • 原因
    • 身份验证:签名可以证明 APK 的来源,确保它是由特定的开发者发布的。
    • 完整性校验:签名可以防止 APK 被篡改。如果 APK 被修改,签名将失效,系统会拒绝安装。
    • 系统要求:Android 系统要求所有 APK 必须经过签名才能安装(除了调试版本)。
  • 输出:已签名的 APK 文件。

5. 对齐优化(zipalign)

  • 输入:已签名的 APK 文件。
  • 工具zipalign
  • 过程
    • 对 APK 文件进行字节对齐优化,使其在设备上运行时能够更高效地访问资源。
    • 对齐操作会将 APK 中的资源文件按 4 字节边界对齐。
    • 使用以下命令对齐: bash zipalign -v 4 my-app-signed.apk my-app-final.apk
  • 原因
    • 提高性能:对齐后的资源文件可以更快地被 Android 系统加载,减少内存占用。
    • 优化存储:对齐后的 APK 文件在设备上占用的存储空间更少。
    • 系统要求:Google Play 等应用商店要求 APK 必须经过对齐优化才能发布。
  • 输出:优化后的 APK 文件。

6. 最终 APK

经过上述步骤后,就生成了一个完整的、可直接安装使用的 APK 文件。

明天了解一下class字节码是什么时候转成机器码的​