如何在Gradle中实现Android非关联模块间BuildVariant同步?
嘿,这个场景我之前刚好折腾过!要让没有直接依赖的app和data模块同步Build Variant,其实用Gradle脚本就能轻松搞定,完全符合你想要的「选app的Build Type,data自动跟着同步,domain保持debug」的需求,下面给你分步讲清楚:
核心思路
因为app和data模块没有直接依赖关系,没法通过默认的依赖变体关联来实现,所以我们要通过Gradle的脚本逻辑,手动绑定两个模块的变体选择——监听app模块的变体变化,强制data模块启用对应的同类型变体。
方法一:根项目Gradle统一绑定变体
我个人更推荐这种方式,在根项目的build.gradle里添加全局逻辑,这样不用修改多个模块的脚本:
gradle.projectsEvaluated { // 获取app模块的所有应用变体 def appVariants = project(':app').android.applicationVariants // 获取data模块的所有库变体 def dataVariants = project(':data').android.libraryVariants appVariants.all { appVariant -> // 拿到当前app变体的Build Type名称(比如你说的env1Debug) def targetBuildType = appVariant.buildType.name // 遍历data模块的所有变体,只保留和app匹配的那个 dataVariants.all { dataVariant -> dataVariant.setEnabled(dataVariant.buildType.name == targetBuildType) } } }
这段代码会在所有项目评估完成后执行,自动把data模块的变体和app模块绑定——你选app的env1Debug,data就自动启用env1Debug,其他变体直接禁用,不会出现在Build Variants面板里。
方法二:在data模块里过滤变体
如果你不想修改根项目的脚本,也可以直接在data模块的build.gradle里添加过滤逻辑:
android { // 你的其他配置(compileSdk、defaultConfig等) variantFilter { variant -> // 获取app模块当前选中的Build Type def appSelectedBuildType = project(':app').android.applicationVariants.find { it.selected }.buildType.name // 只保留和app一致的变体 if (variant.buildType.name != appSelectedBuildType) { setIgnore(true) } } }
这个方法的逻辑是直接过滤data模块的变体,只显示和app当前选中Build Type匹配的那个,效果和方法一一样。
关于domain模块的说明
完全不用管它!因为你的需求是让domain保持debug,Android Studio默认就会给library模块使用debug变体,除非你手动修改,所以这个模块不会受到上面脚本的影响,刚好符合你的预期。
验证效果
配置完脚本后,点击Android Studio右上角的Build Variants面板试试:
- 当你把app模块切换到
env1Debug,data模块会自动同步为env1Debug - domain模块会一直保持
debug不变
完美匹配你想要的行为!
内容的提问来源于stack exchange,提问作者rafaelasguerra

