使用:Android Studio 3.2.1-Gradle 4.6
我有一个包含3个模块的应用程序::app:lib1(库):lib2(库) :app取决于lib1和lib2:lib 1取决于lib2 lib2是一个模块,仅包含从:app和:lib1
引用的资源(通常是图像,字符串,颜色和值的res文件夹,而不是Java代码)我想用相同的样式来修饰:app模块和:lib2模块(用于为我的客户定制应用程序,为每个应用程序指定不同的包)。 :lib1没有味道
在添加调味剂之前,所有方法均适用。 我在:app模块和:lib2模块中添加了1种口味,称为“ client1”。 我在:lib2 \ src \ client1中添加了一个“ client1”文件夹到:lib2。
Gradle编译为以下内容创建了相关的构建变体: :app-client1Debug :app-client1发布 :lib1-Debug :lib1-发布 :lib2-client1Debug :lib2-client1Release
我运行调试构建版本,并且正确安装了应用程序,并成功地从:lib2模块的client1风格中获取了正确的资源
现在,我在:app和:lib2模块中添加了第二个风味,即“ client2”,并在“:lib2 \ src \ client2”中添加了一个文件夹,用于第二个客户定制的风味资源。 我在:app和:lib1的gradle文件中为库模块:lib2
添加了productFlavors和配置以及相对依赖项 APP MODULE GRADLE FILE
apply plugin: 'com.android.application'
android {
defaultConfig {
applicationId "it.test.myapp"
.
.
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
flavorDimensions "default"
productFlavors {
client1 {
dimension="default"
versionNameSuffix "-client1"
applicationIdSuffix ".client1"
}
client2 {
dimension="default"
versionNameSuffix "-client2"
applicationIdSuffix ".client2"
}
}
}
configurations {
client1DefaultDebugCompile
client1DefaultReleaseCompile
client2DefaultDebugCompile
client2DefaultReleaseCompile
}
dependencies {
// implementation project(':lib2') //before flavors
implementation project(':lib1')
client1DefaultDebugCompile project(path: ':lib2', configuration: 'client1Debug')
client1DefaultReleaseCompile project(path: ':lib2', configuration: 'client1Release')
client2DefaultDebugCompile project(path: ':lib2', configuration: 'client2Debug')
client2DefaultReleaseCompile project(path: ':lib2', configuration: 'client2Release')
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation ....
. . .
}
:lib1 MODULE GRADLE FILE
apply plugin: 'com.android.library'
android {
....some configuration
defaultConfig {
...some configuration
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
configurations {
client1DefaultDebugCompile
client1DefaultReleaseCompile
client2DefaultDebugCompile
client2DefaultReleaseCompile
}
dependencies {
//implementation project(':lib2') //before flavors
client1DefaultDebugCompile project(path: ':lib2', configuration: 'client1Debug')
client1DefaultReleaseCompile project(path: ':lib2', configuration: 'client1Release')
client2DefaultDebugCompile project(path: ':lib2', configuration: 'client2tDebug')
client2DefaultReleaseCompile project(path: ':lib2', configuration: 'client2Release')
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation ...
....some implementation
}
:lib2 MODULE GRADLE FILE
apply plugin: 'com.android.library'
android {
publishNonDefault true
...some config
defaultConfig {
...some config
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
flavorDimensions "default"
productFlavors {
client1 {
dimension="default"
}
client2 {
dimension="default"
}
}
}
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar'])
...some implementation
}
我希望:app和:lib1模块都采用正确的版本的:lib2模块资源。 我将gradle与构建变体同步: :app-client1Debug :lib1-Debug //没有味道 :lib2-client1Debug
和gradle同步过程以一个异常结束: :app:processClient1DebugResources失败 失败:构建失败,发生异常。 •出了什么问题:任务':app:processClient1DebugResources'的执行失败。Android资源链接失败输出:/Users/davide/Documents/......./android/MyApp/app/build/intermediates/incremental/mergeClient1DebugResources /merged.dir/values/values.xml:2601:错误:找不到资源颜色/ colorPrimary(又名it.test.myapp.client1:color / colorPrimary)。
和其他类似的错误,链接到:lib1应该从client1风格获取的其他资源。
似乎:lib1软件包无法读取这些资源 如果我尝试从菜单“ Build-> Rebuild Project”进行重建,则会收到类似的错误:
:lib1:javaPreCompileDebug /Users/davide/Documents/...../android/MyApp/lib1/src/main/java/it/test/lib1/utils/Utils.java:183:错误:找不到符号textView.setTextColor(MyApplication.getInstance()。getResources()。getColor(R.color.colorPrimaryDark)); ^符号:变量colorPrimaryDark位置:类颜色
....
.....
/Users/davide/Documents/......../android/MyApp/lib1/src/main/java/it/test/lib1/utils/Utils.java:228:错误:找不到符号字符串channelId = context.getString(R.string.default_notification_channel_id); ^符号:变量default_notification_channel_id位置:类字符串
。
。 ....其他类似的错误
。
。
。
注意:某些输入文件使用或覆盖不推荐使用的API。
注意:有关详细信息,请使用-Xlint:deprecation重新编译。 50个错误:lib1:compileDebugJavaWithJavac FAILED
失败:构建失败,发生异常。
•出了什么问题:任务':lib1:compileDebugJavaWithJavac'的执行失败。有关详细信息,请参见编译器错误输出。
•尝试:使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获取更多日志输出。与--scan一起运行以获取完整的见解。
*在https://help.gradle.org
如果我选择以下版本的构建变体 :app-client2Debug :lib1-Debug //没有味道 :lib2-client2Debug
我对client2风味有相同的错误,:lib1无法读取这些资源。 现在有人告诉我正确的解决方案?一个库可以具有依赖项并从另一个FLAVORED库中读取资源吗? 我读了这个https://android.jlelse.eu/product-flavors-for-android-library-d3b2d240fca2 而这个https://proandroiddev.com/advanced-android-flavors-part-1-building-white-label-apps-on-android-ade16af23bcf 而这个Android multi flavor library referenced from non flavor application - AAPT: No resource found 和其他人...虽然我是对的...但是....不起作用
//更新 如果我从:lib2 gradle文件中删除了风味,并且从:app和:lib1中删除了它的依赖项风味配置,但同时维护了具有这两种风味的:app模块,则该应用会运行并已安装了boh变体和正确的versionNameSuffix,我认为我是我丢失了:lib1的配置中的某些内容,以使其能够从:lib2的正确样式读取资源。
有人可以帮忙吗?谢谢
答案 0 :(得分:0)
您的请求,不可行。像往常一样,该库不使用其他库的内部资源,而是使用库API,并且可以通过程序包名称访问资源,如果您的缺陷更改了,请记住更改其他库中的每个引用。请勿在其他参考文献上使用瑕疵路径。