情况1:
app中有某个build type
但module中没有
// In the app's build.gradle file.
android {
buildTypes {
debug {}
release {}
staging {
// 下面[]中的qa、debug、release是module中配置的buildType,必须含有其中一个或更多,
// 若module中buildType没有staging,gradle会根据matchingFallbacks的配置,
// 依次按顺序去匹配
// 注意:module与module之间存在依赖关系的话,也要在特定的build types中指定匹配关系
matchingFallbacks = ['qa', 'debug', 'release']
}
}
}
注意:module中有但app中没有的build type
是不会报错的,因为gradle插件根本不会去module中请求build type
。
情况2:
在app和它的module中都有同一个维度(比如:flavorDimensions 'tier'
),但你的app有的flavors在module中没有
flavorDimensions 'tier'
productFlavors {
paid {
// 因为依赖app的module在'tier'维度下也有'paid'这个flavor,所以你不用去管,
// gradle会自动为你匹配
dimension 'tier'
}
free {
// 因为module在'tier'维度下没有'free'这个flavor,所以需要指定matchingFallbacks
// 让gradle知道怎么去匹配
// 像下面这样配置,gradle会按顺序依次去匹配module中'tier'维度下的flavor,
// 直到匹配到,否则会报错
matchingFallbacks = ['demo', 'trial']
}
}
注意:对于在同一个维度下,module中有的flavors但app中没有是不会报错的,因为gradle插件根本不会去module中请求flavors。
情况3:
module中有某个dimension维度,但app中没有
// In the app's build.gradle file.
android {
defaultConfig{
// 下面这句话告诉gradle,当遇到一个module中有个app中没有的'minApi'维度时,
// 它应该按照下面这个顺序去匹配这个维度的flavors
missingDimensionStrategy 'minApi', 'minApi18', 'minApi23'
// 若其他module中还有更多app中没有的维度,你必须为所有的维度定义回退策略
missingDimensionStrategy 'abi', 'x86', 'arm64'
}
flavorDimensions 'tier'
productFlavors {
free {
dimension 'tier'
// 你可以在一个特定的flavor中覆盖defaultConfig的配置
missingDimensionStrategy 'minApi', 'minApi23', 'minApi18'
}
paid { }
}
}
注意:当一个维度app中有但module中没有的时候是不会报错,因为gradle插件只会匹配已经在module中存在的维度,比如module中没有abi
这个维度,当app为freeX86Debug
时,你的module就用freeDebug
。
missingDimensionStrategy
方法其他属性可以参考官方文档。
情况4:
若module中没有某个dimension,则app不需要在这个dimension下做任何处理
其他:
1、排除掉某些不需要的变体
variantFilter { variant ->
def names = variant.flavors*.name
def types = variant.buildType.name
if (names.contains("abi") && types == "debug") {
// Gradle ignores any variants that satisfy the conditions above.
setIgnore(true)
}
}