问题背景
项目中有2个 module, 其中 B 依赖 A, 起初两个 module 都没有定义 flavor, 由于业务发展, 给底层的 module A 定义了两个 flavor(本文中使用 flavor1 和 flavor2 表示), 在编译时, gradle 编译错误提示如下:
* What went wrong:
Could not determine the dependencies of task ':B:compileReleaseRenderscript'.
> Could not resolve all task dependencies for configuration ':B:releaseCompileClasspath'.
> Could not resolve project :A.
Required by:
project :B
> Cannot choose between the following configurations of project :A:
- flavor1ReleaseApiElements
- BReleaseApiElements
All of them match the consumer attributes:
- Configuration 'flavor1ReleaseApiElements':
- Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'flavor1Release' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
- Found default 'flavor1' but wasn't required.
- Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
- Required org.jetbrains.kotlin.platform.type 'androidJvm' and found compatible value 'androidJvm'.
- Configuration 'BReleaseApiElements':
- Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'BRelease' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
- Found default 'B' but wasn't required.
- Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
- Required org.jetbrains.kotlin.platform.type 'androidJvm' and found compatible value 'androidJvm'.
其中, module A 中的 flavor 定义如下:
flavorDimensions "default"
productFlavors {
flavor1 {
dimension "default"
}
flavor2 {
dimension "default"
}
}
module B 中未定义任何 flavor.
解决方法
首先说明下原因: module B 依赖 module A, A 有2个 flavor 定义, B 没有 flavor 定义, B 在编译期无法知道该依赖 module A 的哪一个 flavor.
要解决这个问题, 需要给 module B 指定应该依赖 module A 的哪一个 flavor. 有两种方法:
方法一:
给 module B 定义一个 module A 中同名的 flavor, 如:
flavorDimensions "default"
productFlavors {
flavor1 {
dimension "default"
}
}
gradle 会自动根据 flavor name 匹配依赖 module 中对应的 flavor, 这里要注意, flavorDimensions 也必须与依赖 module 中的 flavorDimensions 一致.
方法二:
module B 中的 flavor 与 module A 中的所有 flavor 都不匹配, 可以通过 matchingFallbacks 指定.
flavorDimensions "default"
productFlavors {
flavor3 {
dimension "default"
matchingFallbacks = ['flavor1']
}
}
matchingFallbacks 其他作用
matchingFallbacks 不仅可以用于配置 productFlavors, 还可以配置 build type, 比如, 如果module B 有一个特殊的 build type, 然后 module A 中只有 debug 和 release 两种 build type, 会有同样类似的编译错误. 该问题依然可以通过 matchingFallbacks 指定 build type 类型来解决, 如 :
buildTypes {
releaseQA {
matchingFallbacks = ['release']
}
}
参考链接:
升级 gradle3.0