Android多项目Gradle配置构建顺序 Release触发Debug构建异常
问题背景
现有项目包含JNI库模块、依赖JNI产物的AAR模块、依赖AAR产物的APK模块,项目结构如下:
Project ├─app ├─jni_library └─aar_library
需要实现按固定顺序串行执行Gradle构建:
- 构建
jni_library模块 - 构建依赖
jni_library产物的aar_library模块 - 构建依赖
aar_library产物的app(APK)模块
当前使用环境为Gradle 6.1.1、Android Gradle Plugin 4.0,之前尝试通过在各模块build.gradle中配置preBuild任务依赖指定构建顺序,出现构建Release版本时错误触发Debug构建的异常,原有错误配置如下:build.gradle (:app)
debug { preBuild.dependsOn("aar_library:assembleDebug") } release { preBuild.dependsOn("aar_library:assembleDebug") }
build.gradle (:aar_library)
debug { preBuild.dependsOn("jni_library:assembleDebug") } release { preBuild.dependsOn("jni_library:assembleDebug") }
问题原因
原有配置的核心错误是在Release构建类型的配置块中,硬编码依赖了对应模块的assembleDebug任务,导致无论执行什么构建变体,只要触发preBuild就会强制拉起Debug版本的构建任务,和当前执行的变体不匹配。
正确配置方案
不要在单个buildType块内硬编码固定变体的任务依赖,通过遍历变体的方式,让当前模块的preBuild任务自动依赖上游模块同变体的assemble任务,即可实现按顺序串行构建,且不会出现跨变体触发构建的问题。
- 首先确认
settings.gradle中已正确引入所有模块:
include ':app', ':jni_library', ':aar_library'
- 在
aar_library模块的build.gradle文件中(和android块同级,不要写在buildType内部)添加如下配置,建立和jni_library的变体匹配依赖:
android.libraryVariants.all { variant -> // 自动获取当前构建变体名称,首字母大写匹配assemble任务命名规则 def targetVariant = variant.name.capitalize() preBuild.dependsOn ":jni_library:assemble${targetVariant}" }
- 在
app模块的build.gradle文件中(和android块同级)添加如下配置,建立和aar_library的变体匹配依赖:
android.applicationVariants.all { variant -> def targetVariant = variant.name.capitalize() preBuild.dependsOn ":aar_library:assemble${targetVariant}" }
配置说明
- 该配置会自动匹配当前执行的构建任务变体:执行
assembleRelease时,会按顺序触发jni_library:assembleRelease、aar_library:assembleRelease,最后执行app模块的Release构建,不会触发Debug版本的冗余构建;执行Debug构建时同理自动匹配对应Debug变体任务。 - 如果项目配置了productFlavor多渠道,该写法可以自动适配所有渠道+构建类型的组合变体,不需要单独为每个渠道编写依赖规则。
- 注意不要把依赖配置写在buildType块内部,避免出现任务名硬编码导致的变体不匹配问题。
内容的提问来源于stack exchange,提问作者박현우
相关产品推荐
相关产品推荐

