我有一个图书馆项目和一个应用程序。我想为库和应用程序提供2种产品风格( store , dev )。当我为应用程序构建 store 风格时,我想使用库中的 store 风格。此外,当我为应用程序构建 dev 风格时,我想使用库中的 dev 风格。我尝试为库和应用程序设置相同的产品风格,但它不起作用。
这是我的配置:
库
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 /主/ RES /值/ strings.xml中 和 SRC /存储/ RES /值/ 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 中定义(在主和商店目录中)
如果我从它构建的库中删除productFlavors,但总是使用 main 目录中的 values.xml
答案 0 :(得分:54)
在你的图书馆中,你需要告诉gradle每次变种时都要建立:
android {
publishNonDefault true
}
然后在你的应用程序中,从最近我猜,你可以这样做:
dependencies {
(...)
devCompile project(path: ':lib', configuration: 'devDebug') // or 'devRelease'
storeCompile project(path: ':lib', configuration: 'storeRelease') // or 'storeDebug'
}
在Library Publication下的官方文档中找到。
编辑:
从版本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 以来,模块之间的依赖关系管理已发生变化。它会自动尝试匹配您的应用程序与其所依赖的库/模块之间的风格。
答案 1 :(得分:5)
为您可以使用的每种口味定义特定的依赖关系&name; nameOfTheFlavorCompile"而不是"编译"
dependencies {
storeCompile project(':lib')
}
答案 2 :(得分:2)
我前一段时间遇到过类似问题,但是编译器会忽略库项目的产品风格。此外,即使您添加了更多构建类型,它也会继续查找和编译发布/调试源。
原因很简单:
编译器将从不查找您放入库项目的商店目录中的任何内容。所以,你需要找到解决方法。
它的一种方法是在库中包含两个具有抽象级别的实现(通过接口,多个构造函数等),然后让您的应用程序项目决定运行库的哪个部分。如果你使用proguard,它会自动消除不需要的代码,如果它足够分离(即使它不是这样的话也可能如此)。