使用命令行工具构建Android APK的完整流程与工具顺序是什么?
基于AAPT2的Android APK纯命令行构建完整流程
以下为完全适配官方主流AAPT2工具链的分步构建流程,无需依赖旧版AAPT的打包能力:
1. 资源编译(AAPT2 compile阶段)
将项目res目录下的所有资源文件编译为二进制.flat中间文件:
aapt2 compile path/to/project/res/**/* -o compiled_res/
输出的所有.flat文件将存储在compiled_res目录中。
2. 资源链接(AAPT2 link阶段)
把编译后的.flat资源文件与Manifest、Android SDK平台依赖链接,生成仅包含资源的基础APK、供代码引用的R.java文件:
aapt2 link compiled_res/*.flat \ --manifest path/to/project/AndroidManifest.xml \ --androidjar path/to/sdk/platforms/android-33/android.jar \ -o base_res.apk \ --java gen/ \ --proguard proguard_rules.txt
- 输出
base_res.apk:仅包含编译后资源、Manifest的基础APK包 - 输出
gen/R.java:资源索引类,后续代码编译需要引用 - 可选输出
proguard_rules.txt:资源相关的混淆规则
3. 业务代码编译
将项目源代码、生成的R.java、AIDL生成的接口文件统一编译为Java字节码:
javac -classpath path/to/sdk/platforms/android-33/android.jar \ -d classfiles/ \ path/to/project/src/**/*.java \ gen/**/*.java
如果项目包含Kotlin代码,需要先调用kotlinc将Kotlin代码编译为字节码,再和Java编译结果合并。
4. 字节码转Dex(D8工具)
将所有编译生成的Class文件、第三方依赖Jar包转换为Dalvik字节码classes.dex:
d8 --output ./ \ classfiles/**/*.class \ path/to/project/libs/**/*.jar \ --lib path/to/sdk/platforms/android-33/android.jar
如果应用方法数超过65535,D8会自动生成classes2.dex、classes3.dex等多Dex文件。
5. 合并APK内容
APK本身是标准ZIP格式,直接用zip命令将Dex文件、so动态库、assets资源等合并到之前生成的base_res.apk中:
# 合并所有Dex文件 zip -uj base_res.apk classes*.dex # 合并so动态库(如果有) zip -ur base_res.apk path/to/project/libs/ # 合并assets资源(如果有) zip -ur base_res.apk path/to/project/assets/
6. 对齐优化(Zipalign工具)
对APK内的未压缩数据做4字节对齐,减少运行时内存占用:
zipalign -f -p 4 base_res.apk unsigned_aligned.apk
注意:使用Apksigner做v2及以上签名时,必须在签名前执行对齐操作,否则签名会失效。
7. APK签名(Apksigner工具)
对对齐后的APK进行签名,未签名的APK无法安装到Android设备:
apksigner sign \ --ks your_keystore.jks \ --ks-key-alias your_key_alias \ --out signed_final.apk \ unsigned_aligned.apk
执行命令后按照提示输入密钥库密码、密钥密码即可完成签名。
8. 签名验证(可选)
验证最终APK的签名是否有效:
apksigner verify -v signed_final.apk
如果输出签名验证通过的信息,说明APK构建完成,可以正常安装使用。
内容的提问来源于stack exchange,提问作者JANO
相关产品推荐
相关产品推荐

