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次数
使用 Hugo 构建
主题 StackJimmy 设计