flavorDimensions 必须显式声明且每个 productFlavor 必须明确指定 dimension,否则 Gradle 3.0+ 构建失败;它位于 android 块内、productFlavors 之前,顺序决定资源合并优先级。

flavorDimensions 必须显式声明,否则 Gradle 3.0+ 会直接报错:All flavors must now belong to a named flavor dimension。它不是可选配置,而是多 flavor 的强制前置步骤。
flavorDimensions 声明位置和顺序决定合并优先级
必须写在 android { } 块内,且在 productFlavors { } 之前;维度列表的**顺序即优先级顺序**:排在前面的维度,其 source set 和资源拥有更高合并权重。
-
flavorDimensions "region", "type"→src/cnFree/会覆盖src/cn/和src/free/中同名文件 -
flavorDimensions "type", "region"→ 同样组合下,src/freeCn/才是最高优先级目录(注意命名顺序变化) - 不指定
dimension属性的 flavor 会默认归入第一个维度(但强烈不建议依赖此行为,易出错)
每个 productFlavor 必须明确指定 dimension
哪怕只定义了一个维度,也建议显式写上 dimension,避免后期扩展时漏配或混淆。
productFlavors {
cn {
dimension "region"
applicationIdSuffix ".cn"
}
us {
dimension "region"
applicationIdSuffix ".us"
}
free {
dimension "type"
versionNameSuffix "-free"
}
pro {
dimension "type"
versionNameSuffix "-pro"
}
}
漏写任意一个 dimension,同步 Gradle 就会失败,错误信息直指缺失归属。
Android 和 JVM 项目对 flavorDimensions 的支持差异
Android 插件原生完整支持 flavorDimensions + productFlavors 组合,自动创建变体、source set、BuildConfig 字段、资源合并逻辑。
- JVM 项目(如 Java/Kotlin 桌面应用)没有内置 flavor 支持,
flavorDimensions不会被识别,强行写入会静默忽略 - 若要在 JVM 项目模拟类似行为,需手动注册
SourceSet(如cnMain、freeMain),再通过namedVariants(Gradle 8.0+)或自定义jar任务组合输出 - 别指望
flavorDimensions在java-library插件里“自动生效”——它只对com.android.application和com.android.library有效
常见错误:维度数量与 flavor 分配不匹配
比如声明了两个维度 flavorDimensions "company", "channel",但 productFlavors 中只给部分 flavor 指定了 dimension,或某个 flavor 没有分配到任一维度,就会触发构建失败。
- 错误示例:
huawei { /* 没写 dimension */ }→ 报错 - 错误示例:
huawei { dimension "company" },但没定义任何dimension "channel"下的 flavor → 生成变体数为 1×0 = 0,实际构建可能卡在 source set 解析阶段 - 正确做法:每个 flavor 显式归属且覆盖全部已声明维度(即使某维度下只有一种取值,也要写出来)
维度正交性是硬约束,不是“尽量做到”,漏一个就断构建。











