gradle 之 matchingFallbacks 作用

问题背景

项目中有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

你可能感兴趣的:(gradle 之 matchingFallbacks 作用)