Gradle 6.7中如何判断当前构建产物为APK还是AAB?
问题解答
1. Gradle 6.7是否内置机制判断构建产物是AAB还是APK?
Gradle 6.7本身没有直接的内置属性来区分当前构建的是AAB还是APK,但搭配对应的Android Gradle Plugin(AGP 4.2.x,Gradle 6.7的推荐适配版本),可以通过任务类型/任务名称间接判断——因为APK和AAB对应的Gradle任务体系完全分离:
- APK构建对应
assemble*、install*、run*系列任务 - AAB构建对应
bundle*系列任务
2. 多构建场景下的最优判断方案
核心逻辑是通过识别当前执行的Gradle任务特征区分产物类型,以下是适配所有构建方式的具体实现:
通用Gradle配置方案
在模块级build.gradle中添加如下逻辑,通过任务名称前缀判断是否为AAB构建:
// 定义全局属性标记当前是否构建AAB ext.isBuildingBundle = gradle.startParameter.taskNames.any { it.startsWith("bundle") // 匹配bundleDebug、bundleRelease等任务 } android { // ...其他配置 applicationVariants.all { variant -> if (ext.isBuildingBundle) { // 配置Play Asset Delivery逻辑:指定大资源通过PAD引入 variant.assets.srcDirs -= file("src/main/large-assets") // 这里补充PAD相关配置代码 } else { // 配置资源打包进APK的逻辑:将大资源直接打包 variant.assets.srcDirs += file("src/main/large-assets") } } }
分场景细节说明
- Android Studio调试/运行:点击Run按钮时,Gradle执行
installDebug或runDebug任务,不会触发bundle*任务,isBuildingBundle自动为false,走APK打包逻辑。 - Generate Signed Bundle/APK(GUI操作):
- 选择“Android App Bundle”时,AS触发
bundleRelease/bundleDebug任务,isBuildingBundle为true,走PAD逻辑; - 选择“APK”时,触发
assembleRelease/assembleDebug任务,走APK打包逻辑。
- 选择“Android App Bundle”时,AS触发
- 命令行构建:
- 执行
./gradlew bundleRelease→ 触发bundle任务,走PAD逻辑; - 执行
./gradlew assembleRelease/./gradlew installDebug→ 触发APK相关任务,走APK打包逻辑。
- 执行
特殊情况处理
如果执行混合任务(比如同时执行clean和bundleRelease),上述逻辑依然有效——gradle.startParameter.taskNames会包含所有指定任务,只要其中存在bundle*任务,就会标记为AAB构建。
内容的提问来源于stack exchange,提问作者JDL
相关产品推荐
相关产品推荐

