文章目录
- 前言
- 1. 资源打包(通过 AAPT)
- 2. 处理 AIDL 文件
- 3. Java 源代码编译
- 4. Dex 转换
- 5. APK 打包
- 6. APK 签名
- 7. APK 对齐
- 总结
前言
Android APK 打包过程包括多个关键步骤,每个环节都提供了不同的操作机会。开发者可以在这些步骤中进行自定义,优化构建,调试,或增加特定的功能。以下是大致的流程和可以进行的操作:
1、资源打包(通过 AAPT 工具)
生成资源索引文件 R.java。
打包资源文件为二进制格式 resources.arsc。
保留部分非二进制资源原始文件(如 res/raw 和图片)。
2、处理 AIDL 文件
将 .aidl 文件转换为 Java 接口文件。
3、Java 源代码编译
编译 R.java、Java 接口文件及其他源代码为 .class 文件。
4、DEX 转换
使用 dx 或 d8 工具将 .class 文件转换为 Android 特有的 .dex 格式。
5、APK 打包
使用 apkbuilder 工具将资源、DEX 文件和 assets 文件合并为 APK。
6、APK 签名
使用 jarsigner 工具为 APK 进行数字签名(Debug 或 Release 签名)。
7、APK 对齐优化
使用 zipalign 工具对 APK 文件进行字节对齐优化。
来自官网的一幅图
1. 资源打包(通过 AAPT)
AAPT 是 Android 资源处理的核心工具,主要任务包括资源索引生成、资源二进制化和资源文件的合并。
操作点:
-
优化资源文件:
1、删除无用的资源,减小 APK 文件体积。
2、压缩图片资源(如使用 WebP 格式替代 PNG)。
3、合并或精简多语言资源文件,仅保留必要的语言。 -
资源动态加载:
在必要时,将部分资源动态下载,而非打包进 APK。
优化工具:
使用 aaptOptions 配置压缩级别,进一步减少资源大小。
android {aaptOptions {cruncherEnabled false // 关闭冗余图片处理useNewCruncher false // 使用旧版图片压缩器}
}
2. 处理 AIDL 文件
AIDL 用于定义跨进程通信(IPC)的接口。编译过程将其转化为 Java 接口文件。
优化建议:
- 合理规划 AIDL 接口,避免频繁调用引起性能问题。
- 简化接口方法和参数,减少序列化与反序列化开销。
3. Java 源代码编译
将所有 Java 源代码编译成 .class 文件,包括 R.java 和 AIDL 接口文件。
优化建议:
1. 代码混淆:
使用 R8(ProGuard 替代者)优化代码,移除无用类和方法,保护源码。
2. 代码精简:
- 减少重复代码。
- 避免在代码中包含调试信息或日志。
启用代码混淆和压缩:
android {buildTypes {release {minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}
}
4. Dex 转换
使用 dx 或 d8 将 .class 文件转换为 .dex 格式,这是 Android 虚拟机的执行格式。
优化建议:
1. 启用多 DEX 支持:
当方法引用数超过 65536 时,启用 MultiDex:
android {defaultConfig {multiDexEnabled true}
}
2. 优化字节码:
使用 R8 进行字节码优化,进一步减少方法数和类数量 (R8 是默认启用的)。
5. APK 打包
将资源文件、classes.dex 和 assets 合并生成 APK 文件。
优化建议:
- 删除调试文件:
避免将测试用例或日志文件打包进 assets。 - 自定义构建:
针对不同的构建类型(Debug/Release),调整打包资源和代码逻辑。
6. APK 签名
签名是确保 APK 安全性和完整性的关键步骤。
优化建议:
- 自动化签名:
配置 signingConfigs,简化签名流程:
android {signingConfigs {release {storeFile file("release.keystore")storePassword "password"keyAlias "alias"keyPassword "key-password"}}buildTypes {release {signingConfig signingConfigs.release}}
}
7. APK 对齐
zipalign 是 Android 提供的工具,用于优化 APK 的字节对齐,提高运行时性能。
为什么需要字节对齐?
因为操作系统读取文件时,通常按“块”(如 4 字节、8 字节)为单位进行。如果资源的起始位置不是这些块的整数倍,操作系统就需要执行多次额外操作去加载它,而对齐后的数据可以直接加载,省时省力。
优化建议:
- 在 Gradle 脚本中启用对齐:
android {buildTypes {release {zipAlignEnabled true}}
}
总结
通过对 APK 打包流程的逐步优化,可以实现以下目标:
- 减小 APK 体积:优化资源和字节码。
- 提升运行效率:通过 zipalign 和资源精简,提高加载性能。
- 增强安全性:使用代码混淆与签名保护应用。