APK的构建过程
- STEP1:打包资源文件
- STEP2:处理AIDL文件
- STEP3:.java文件转换为.class文件
- STEP4:.class文件转换为classes.dex文件
- STEP5:打包生成APK文件
- STEP6: 对APK文件进行签名
- 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.arsc
和res.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 文件。这个文件可以直接上传到应用商店或安装到设备上。
- 对齐 :