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 文件。这个文件可以直接上传到应用商店或安装到设备上。
相关推荐
bnnnnnnnn2 小时前
看完就懂、懂完就敢讲的「原型与原型链」终极八卦!
前端·javascript·面试
byte轻骑兵2 小时前
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
面试·职场和发展
Tirson Yang3 小时前
西安java面试总结1
java·面试
Sherry0073 小时前
从 HTTP/1.1 到 HTTP/3:一场为性能而生的协议演进之旅
网络协议·面试
塞尔维亚大汉4 小时前
鸿蒙开发面试真题:鸿蒙操作系统的微内核架构有哪些优势?
面试·harmonyos
工呈士4 小时前
Webpack 剖析与策略
前端·面试·webpack
前端小巷子7 小时前
浏览器的组成部分与工作原理
前端·javascript·面试
想用offer打牌7 小时前
一站式讲解本地缓存Caffeine😯
后端·面试
励碼8 小时前
美团完整面经
java·面试·职场和发展·sass·美团
GoldenaArcher8 小时前
Fullstack 面试复习笔记:HTML / CSS 基础梳理
笔记·面试·html