Android打包apk流程
android应用的打包流程是将代码、资源文件、清单文件等编译和压缩成可在设备上安装的APK/AAB文件的过程。以下是详细步骤:
一、主要流程
1. 编写代码与资源管理
- 创建
/src
目录存放Kotlin/Java源码 - 在
/res
目录添加资源 - 配置
AndroidManifest.xml
(声明组件、权限等)。
2. 依赖管理
- 在build.gradle中添加所需依赖库
3. 编译过程
- 编译代码: kotlin源码 →
.class
字节码(javac/kotlinc) - 转换为Dex:
.class
文件→.dex
文件(d8
/dx
工具),用于Android的ART虚拟机 - 编译资源:
AAPT2
编译资源文件(res/
→ 二进制格式),生成R.java
和临时资源包(.flat
)
4.打包与签名
- 合并资源: AAPT2链接编译后的资源,生成resources.arsc(资源索引表)和优化后的res/目录
- 打包成APK:APK Builder将以下文件合并为未签名的APK:
- 编译后的字节码(
.dex
) - 资源文件(
res/
+resources.arsc
) AndroidManifest.xml
- 原生库(
.so
,若有JNI)
- 编译后的字节码(
- 签名APK:使用签名证书(keystore)进行V1/V2/V3签名(通过
apksigner
或Gradle配置)
5.优化与对齐
- ZIP对齐:
zipalign
优化APK文件结构(4字节对齐),减少运行时内存占用 - 生成最终的APK:输出
app-release.apk
二、名词解释
1. 临时资源包
在AAPT2(Android Asset Packaging Tool 2
)的资源预编译阶段会生成.flat文件,这些文件是中间产物
- 独立编译:AAPT2将
/res
目录下的每个资源文件单独编译成二进制格式的.flat
文件 - 支持增量编译:若只修改了单个资源文件,只需重新编译该文件的.flat文件,避免全量编译,加快构建速度
- 分阶段处理
- 编译阶段:资源→
.flat
文件 - 链接阶段:合并所有
.flat
文件 → 生成resources.arsc
和最终的res/
目录
- 编译阶段:资源→
- 优势
- 提升大型项目的编译速度
- 支持资源混淆
- 更严格的资源验证
2. 对齐
- 内存对齐:解决CPU访问效率问题(
数据项首地址 % n == 0
),但会增加数据结构大小 - 文件对齐(zipalign):解决内存映射效率的问题(
文件偏移 % 4096 == 0
),通过消除跨页碎片减少运行时内存占用 - 内存页机制
- 系统内存管理以**页(通常4KB)**为单位
- 对齐后,每次文件读取 = 整数倍内存页 → 减少I/O次数