Gradle:为库的特定风格添加依赖

我有一个图书馆项目和一个应用程序。 我想有两个产品口味( 商店开发 )为图书馆和应用程序。 当我为应用程序构build商店风味时,我想使用库中的商店风格。 另外,当我为应用程序构build开发风格时,我想使用库中的开发风格。 我试图设置库和应用程序相同的产品口味,但它不起作用。

这是我的configuration:

图书馆

apply plugin: 'android-library' android { compileSdkVersion 19 buildToolsVersion "19.1.0" defaultConfig { applicationId "ro.amarkovits.graddletest.lib" minSdkVersion 14 targetSdkVersion 19 versionCode 1 versionName "1.0" } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors{ store{ } dev{ } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) } 

我有这个文件:src / main / res / values / strings.xml和src / store / res / values / strings.xml

应用

 apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion '19.1.0' defaultConfig { applicationId 'ro.amarkovits.mymodule.app' minSdkVersion 14 targetSdkVersion 19 versionCode 1 versionName '1.0' } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors{ store{ } dev{ } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile project(':lib') } 

在这种情况下,我得到这个错误:错误:(12,23)找不到与给定名称匹配的资源(在'文本'中,值为'@ string / app_name')。 app_name在库中的string.xml中定义(在mainstore目录中)

如果我从构build的库中删除productFlavors,但始终使用目录中的values.xml

在你的图书馆里,你需要告诉gradle每一个变体的构build:

 android { publishNonDefault true } 

然后在你的应用程序中,因为最近我猜,你可以这样做:

 dependencies { (...) devCompile project(path: ':lib', configuration: 'devDebug') // or 'devRelease' storeCompile project(path: ':lib', configuration: 'storeRelease') // or 'storeDebug' } 

在图书馆出版的正式文件中find。

编辑:

从版本0.14.3(2014/11/18)开始 ,您现在可以使用Flavor-buildType-Compile指令:

在android {}作用域之前的build.gradle中添加以下内容:

 configurations { devDebugCompile devReleaseCompile storeDebugCompile storeReleaseCompile } 

然后你可以根据Flavor-BuildType声明和使用不同版本的库:

 dependencies { (...) devDebugCompile project(path: ':lib', configuration: 'devDebug') devReleaseCompile project(path: ':lib', configuration: 'devRelease') storeDebugCompile project(path: ':lib', configuration: 'storeDebug') storeReleaseCompile project(path: ':lib', configuration: 'storeRelease') } 

编辑:

Android Gradle Plugin 3.0.0以来,模块之间的依赖pipe理已经发生了变化。 它会自动尝试匹配应用程序和它所依赖的库/模块之间的风格。

整个说明见文档 !

要为每种风味定义特定的依赖关系,可以使用“nameOfTheFlavorCompile”而不是“compile”

 dependencies { storeCompile project(':lib') } 

我前段时间遇到类似问题,会发生什么情况是编译器会忽略库项目的产品风格。 而且,即使添加更多的构buildtypes,它也会一直在寻找和编译释放/debugging源。

原因很简单:

  • 产品风格不支持库插件。
  • 唯一支持的构buildtypes似乎是debugging和发布。

编译器将永远不会查找您放入库项目的商店目录中的任何内容。 所以,你需要find解决办法。

一种解决方法是在你的库中包含两个具有抽象级别的实现(通过接口,多个构造函数等),然后让应用程序项目决定运行哪个库的哪一部分。 如果你使用了proguard,它将自动消除不需要的代码,如果它解耦足够好(甚至可能,即使它不是)。

Interesting Posts