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中定义(在main和store目录中)
如果我从构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,它将自动消除不需要的代码,如果它解耦足够好(甚至可能,即使它不是)。