基于Gradle中多风味库的单味模块

时间:2017-12-27 09:50:27

标签: android gradle build.gradle android-productflavors android-build-flavors

我正在研究多种风格的app。 (下面的gradle文件)

它使用名为tracker的库,它遵循相同的风格internalexternal

现在对于棘手的部分,来一个名为feature的新模块,这个模块没有味道,但它需要tracker作为依赖

app.gradle:

android {

    buildTypes {
        debug {
        }
        release {
        }
    }

    flavorDimensions "target"

    productFlavors {
        internal {
            dimension "target"
        }

        external {
            dimension "target"
        }
    }
}

tracker.gradle:

android {

    publishNonDefault true

    buildTypes {
        release {
        }
        debug {
        }
    }

    flavorDimensions 'target'

     productFlavors {
        internal {
            dimension "target"
        }

        external {
            dimension "target"
        }
    }
}

feature.gradle:

android {
    compileSdkVersion rootProject.ext.compileSdkVersion

    defaultConfig {
        compileSdkVersion rootProject.ext.compileSdkVersion
        buildToolsVersion rootProject.ext.buildToolsVersion

        defaultConfig {
            minSdkVersion rootProject.ext.minSdkVersion
            targetSdkVersion rootProject.ext.targetSdkVersion
            versionCode 1
            versionName "1.0"
            javaCompileOptions {
                annotationProcessorOptions {
                    includeCompileClasspath false
                }
            }
        }
    }

}

dependencies {
    implementation(
            [...]
            project(':tracker')
    )
}

当我尝试 gradle sync 时,以下是errors

Unable to resolve dependency for ':feature@debug/compileClasspath': Could not resolve project :tracker.

Could not resolve project :tracker.
Required by:
    project :feature
 > Project :feature declares a dependency from configuration 'implementation' to configuration 'externalRelease' which is not declared in the descriptor for project :tracker.

Unable to resolve dependency for ':feature@debugAndroidTest/compileClasspath': Could not resolve project :tracker.

Could not resolve project :tracker.
[...]

4 个答案:

答案 0 :(得分:3)

我的gradle版本是4.4。

在文档中, Android developerAndroid Plugin DSL Reference 表明,应添加以下代码。

missingDimensionStrategy 'external'
missingDimensionStrategy 'target'

Android developer link image

Android Plugin DSL Reference image

但这对我不起作用。最后,我在feature.gradle中添加了以下代码。

flavorDimensions 'target'

 productFlavors {
    internal {
        dimension "target"
    }
}

答案 1 :(得分:2)

从您的问题来看,我得到的是您尝试将库tracker作为依赖项添加到feature模块中。在feature.gradle中尝试以下操作:

dependencies {
    implementation project(':tracker')
}

使用Gradle 3.0,有两个新关键字implementationapi。不推荐使用compile关键字。您可以使用implementation作为默认值。使用api尤其是当你的项目中有传递依赖项时(Module - > Lib1 - > Lib2),你需要告诉Gradle该模块想要将该依赖项传递给其他模块,这样就可以了在运行时和编译时都可以使用它们。

好的图片解释:

以下是一篇很好的文章,介绍了implementationapi关键字之间的区别:Implementation Vs Api in Android Gradle plugin 3.0

官方文件说明:

以下是官方文档Use the new dependency configurations的简要说明:

  • <强> 实现:

      

    当您的模块配置实现依赖项时,它让Gradle知道模块不希望在编译时将依赖项泄漏给其他模块。也就是说,依赖性仅在运行时可用于其他模块。使用此依赖项配置而不是api或compile可以显着缩短构建时间,因为它减少了构建系统需要重新编译的项目数量。例如,如果实现依赖项更改其API,则Gradle仅重新编译该依赖项以及直接依赖于它的模块。大多数应用和测试模块都应该使用此配置。

  • <强> API:

      

    当模块包含api依赖项时,它让Gradle知道模块想要将该依赖项传递到其他模块,以便在运行时和编译时都可以使用它。此配置的行为与compile(现在已弃用)类似,您通常只应在库模块中使用它。这是因为,如果api依赖项更改其外部API,Gradle将重新编译在编译时有权访问该依赖项的所有模块。因此,拥有大量的api依赖项可以显着增加构建时间。除非您希望将依赖项的API公开给单独的测试模块,否则应用程序模块应该使用实现依赖项。

希望这有帮助。

<强>更新

为了完整起见,gradle 4.1似乎存在已知问题。使用4.3版有帮助。感谢Damien。

答案 2 :(得分:0)

好的,谢谢@ ramin-eftekhari我设法让它发挥作用

https://github.com/luxsypher/gradle-flavor-dependency

答案 3 :(得分:0)

尝试在应用build.gradle defaultConfig块中添加此内容:

missingDimensionStrategy "internal"