如何在Gradle Kotlin DSL中配置多模块Android项目的Flavor
解决方案
问题根源在于模块间的Flavor维度不匹配,导致Gradle无法自动关联:app和:data的对应Variant。以下是统一配置并解决依赖冲突的步骤:
1. 统一BuildSrc中的枚举定义
确保EndpointFlavor枚举的维度名称完全统一(注意大小写一致),并完善字段内容:
enum class EndpointFlavor( val key: String, val applicationIdSuffix: String, val endpointUrl: String, ) { Dev("dev", ".dev", "\"https://dev.example.com\""), Acc("acc", ".acc", "\"https://acc.example.com\""), Prod("prod", "", "\"https://prod.example.com\""); companion object { // 统一维度名称,所有模块必须使用这个值 const val dimension = "endpoint" } }
2. 配置:app模块
在:app中基于枚举创建Flavor,设置applicationIdSuffix,并正常依赖:data:
// app/build.gradle.kts android { buildFeatures { buildConfig = true // 可选,若需要在app中用BuildConfig则开启 } flavorDimensions.add(EndpointFlavor.dimension) productFlavors { EndpointFlavor.values().forEach { flavor -> create(flavor.key) { dimension = EndpointFlavor.dimension applicationIdSuffix = flavor.applicationIdSuffix } } } } dependencies { // Gradle会自动匹配与当前app Variant对应的data Variant implementation(project(":data")) }
3. 配置:data模块
在:data中使用完全相同的Flavor维度和枚举定义,生成包含endpoint的BuildConfig:
// data/build.gradle.kts android { buildFeatures { buildConfig = true // 必须开启,才能生成BuildConfig字段 } flavorDimensions.add(EndpointFlavor.dimension) productFlavors { EndpointFlavor.values().forEach { flavor -> create(flavor.key) { dimension = EndpointFlavor.dimension buildConfigField("String", "endpointUrl", flavor.endpointUrl) } } } }
4. 关键注意事项
- 维度名称大小写必须完全一致:错误日志中出现的
endPoint与你定义的维度名称可能存在大小写差异,这是导致Gradle无法匹配Variant的核心原因。 - 仅在
:app中设置applicationIdSuffix:Library模块(如:data)不支持修改applicationId,所以只能在Application模块配置该属性。 - Gradle自动Variant匹配:当两个模块的Flavor维度、Flavor key完全一致时,Gradle会自动关联对应的Variant(如
:app:devDebug会依赖:data:devDebug),无需额外配置。
内容的提问来源于stack exchange,提问作者Jan-Willem van Velzen
相关产品推荐
相关产品推荐

