Android Apk Build 打包构建流程

APK的构建过程

  1. STEP1:打包资源文件
  2. STEP2:处理AIDL文件
  3. STEP3:.java文件转换为.class文件
  4. STEP4:.class文件转换为classes.dex文件
  5. STEP5:打包生成APK文件
  6. STEP6: 对APK文件进行签名
  7. STEP7:对签名后的APK文件进行对齐处理

Android 应用的打包是一个将源代码和资源文件转换成可供设备安装和运行的 APK (Android Package Kit) 文件的过程。这个过程严谨且步骤分明,主要可以分为以下七个核心步骤:

APK 构建流程详解

STEP 1: 打包资源文件 (Packaging Resources) 📦

  • 工具 : AAPT2 (Android Asset Packaging Tool 2)

  • 过程 : 这个阶段处理项目中的所有资源文件,例如 res 目录下的布局文件 (.xml)、图片 (.png, .jpg)、字符串 (strings.xml) 等。

    • 编译 : AAPT2 会编译所有的资源文件。XML 文件会被解析和编译成二进制格式,图片等资源会被优化和压缩。
    • 生成 R.java : AAPT2 会生成一个 R.java 文件。这个文件为每个资源提供了一个唯一的静态整型 ID。代码中就是通过这些 ID 来访问相应资源的,例如 R.string.app_name
    • 产物 : 生成一个名为 resources.arsc 的资源索引表和一个包含已编译资源的 .zip 文件(通常是 res.zip)。

STEP 2: 处理 AIDL 文件 (Processing AIDL) 🤝

  • 工具 : aidl

  • 过程: AIDL (Android Interface Definition Language) 用于定义客户端和服务端进行进程间通信 (IPC) 的接口。

    • 转换 : aidl 工具会解析 .aidl 接口文件,并生成相应的 .java 接口代码。这个生成的 Java 文件包含一个名为 Stub 的抽象内部类,它实现了接口中的方法,并处理了底层的数据序列化和跨进程通信的细节。
    • 应用场景: 如果你的应用需要与其他应用或服务进行通信,就需要用到 AIDL。如果项目中没有使用 AIDL,这一步会被跳过。

STEP 3: .java 文件转换为 .class 文件 (Java Compilation) ☕

  • 工具 : javac (Java Compiler)

  • 过程: 这是标准的 Java 编译过程。

    • 编译 : javac 编译器会将项目中的所有 Java 源代码(包括 R.java 和 AIDL 生成的 .java 文件)编译成 JVM (Java Virtual Machine) 可以执行的 .class 字节码文件。
    • 产物 : 生成一系列的 .class 文件。

STEP 4: .class 文件转换为 classes.dex 文件 (DEXing) ➡️

  • 工具 : D8 (取代了旧的 DX)

  • 过程 : Android 设备并不直接使用 Java 字节码,而是使用专为移动设备优化的 Dalvik Executable (.dex) 格式。

    • 转换 : D8 工具会将所有的 .class 文件(包括第三方库的 .class 文件)转换成一个或多个 classes.dex 文件。
    • 优化 : D8 在转换过程中会进行多种优化,例如代码的合并、重构,以减小文件体积并提升运行效率。这个过程也被称为 "desugaring",它能让你在旧版 Android 系统上使用新的 Java 语言特性。
    • 产物 : classes.dex 文件,包含了应用的所有代码。

STEP 5: 打包生成 APK 文件 (APK Packaging) 🗳️

  • 工具 : APK Packager

  • 过程: 这个步骤将前面生成的所有文件打包成一个初始的 APK 文件。

    • 整合 : 将 classes.dex 文件、编译后的资源文件 (resources.arscres.zip)、so 库、assets 目录下的原生资源以及 AndroidManifest.xml 等所有内容打包到一个压缩包中。
    • 产物: 一个未签名的 APK 文件。这个文件已经具备了 APK 的基本结构,但还不能被安装和运行。

STEP 6: 对 APK 文件进行签名 (Signing) ✒️

  • 工具 : apksigner

  • 过程: 为了保证 APK 的来源真实性和完整性(即未被篡改),每个 APK 都必须经过数字签名。

    • 签名 : 使用一个私钥 (keystore 文件) 对未签名的 APK 文件进行签名。签名后会在 APK 的 META-INF 目录下生成几个文件(如 MANIFEST.MF, CERT.SF, CERT.RSA)。

    • 目的:

      • 身份验证: 确认应用的开发者身份。
      • 安全更新: 只有使用相同密钥签名的 APK 才能作为应用的更新版本被系统接受。
      • 权限授予 : 某些系统权限(如 signature 级别的权限)只授予具有相同签名的应用。
    • 产物: 一个已签名的 APK 文件。

STEP 7: 对齐处理 (Aligning) Align️

  • 工具 : zipalign

  • 过程: 这是 APK 发布前的最后一步优化。

    • 对齐 : zipalign 会优化已签名的 APK 文件。它通过特定的字节对齐方式(通常是 4 字节对齐)来重新排列 APK 中的未压缩数据(如图片、原生库等)。
    • 目的 : 让 Android 系统可以通过 mmap (memory-map) 的方式直接读取文件内容,而不需要将它们从 APK 中解压出来。这能显著减少应用的内存消耗,并加快应用的启动和运行速度。
    • 注意 : 必须在签名之后执行 zipalign。如果在签名之前执行,签名过程会破坏已经对齐的数据。
    • 产物: 最终的可发布、已签名、已对齐的 APK 文件。这个文件可以直接上传到应用商店或安装到设备上。
相关推荐
Lee川11 小时前
优雅进化的JavaScript:从ES6+新特性看现代前端开发范式
javascript·面试
Lee川14 小时前
从异步迷雾到优雅流程:JavaScript异步编程与内存管理的现代化之旅
javascript·面试
晴殇i16 小时前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
绝无仅有17 小时前
Redis过期删除与内存淘汰策略详解
后端·面试·架构
绝无仅有17 小时前
Redis大Key问题排查与解决方案全解析
后端·面试·架构
AAA梅狸猫18 小时前
Looper.loop() 循环机制
面试
AAA梅狸猫18 小时前
Handler基本概念
面试
Wect18 小时前
浏览器缓存机制
前端·面试·浏览器
掘金安东尼19 小时前
Fun with TypeScript Generics:玩转 TS 泛型
前端·javascript·面试
掘金安东尼19 小时前
Next.js 企业级落地
前端·javascript·面试