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),会在此阶段进行代码混淆、优化和缩减。
- Java/Kotlin 编译器将
- 原因:
- Android 系统使用 Dalvik 虚拟机或 ART 运行时来执行应用代码,而它们不能直接运行 Java 字节码(
.class
文件)。 - DEX 文件是 Android 系统专用的字节码格式,优化了存储和执行效率。
- 如果启用了代码优化(如 ProGuard 或 R8),还会减少 APK 体积并提高安全性(通过混淆代码)。
- Android 系统使用 Dalvik 虚拟机或 ART 运行时来执行应用代码,而它们不能直接运行 Java 字节码(
- 输出:一个或多个
.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 文件和签名密钥。
- 工具:
jarsigner
或apksigner
。 - 过程:
- 生成签名密钥(如果尚未生成):
- 使用
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字节码是什么时候转成机器码的