12

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

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

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

应用程序.gradle:

android {

    buildTypes {
        debug {
        }
        release {
        }
    }

    flavorDimensions "target"

    productFlavors {
        internal {
            dimension "target"
        }

        external {
            dimension "target"
        }
    }
}

跟踪器.gradle:

android {

    publishNonDefault true

    buildTypes {
        release {
        }
        debug {
        }
    }

    flavorDimensions 'target'

     productFlavors {
        internal {
            dimension "target"
        }

        external {
            dimension "target"
        }
    }
}

特征.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')
    )
}

这是errors我尝试gradle sync的时间:

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

4 回答 4

6

我的 gradle 版本是 4.4。

在文档中, Android 开发人员Android Plugin DSL Reference 表明,应该添加以下代码。

missingDimensionStrategy 'external'
missingDimensionStrategy 'target'

Android 开发者链接图片

Android 插件 DSL 参考图片

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

flavorDimensions 'target'

 productFlavors {
    internal {
        dimension "target"
    }
}
于 2018-09-20T07:09:07.810 回答
2

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

dependencies {
    implementation project(':tracker')
}

在 Gradle 3.0 中,有两个新关键字implementationapi. compile关键字已弃用。您可以implementation默认使用。api尤其是当您的项目中有传递依赖项(Module -> Lib1 -> Lib2),并且您需要告诉 Gradle 模块希望将该依赖项传递到其他模块时,以便它们在运行时和运行时都可以使用编译时间。

很好的图文解说:

implementation这是一篇很好的文章,说明了andapi关键字之间的区别: Android Gradle 插件 3.0 中的实现 Vs Api

官方文档解释:

以下是官方文档的简要说明使用新的依赖配置

  • 执行:

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

  • 接口:

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

希望这可以帮助。


更新

为了完整起见,gradle 4.1 似乎存在一个已知问题。使用 4.3 版会有所帮助。感谢达米安。

于 2018-01-02T10:27:00.083 回答
0

好的,感谢@ramin-eftekhari 我设法让它工作

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

于 2018-01-04T14:27:53.663 回答
-1

尝试将其添加到应用程序build.gradle defaultConfig块中:

missingDimensionStrategy "internal"
于 2018-01-04T14:40:42.343 回答