使用:Android Studio 3.2.1 - Gradle 4.6
我有一个包含 3 个模块的应用程序: :app :lib1 (library) :lib2 (library) :app 依赖于 lib1 和 lib2 :lib 1 依赖于 lib2 lib2 是一个仅包含资源的模块(用于图像、字符串、颜色和:app 和 :lib1 引用的一般值,而不是 java 代码
我想给 :app 模块和 :lib2 模块添加相同的口味(为我的客户定制应用程序,为每个应用程序指定不同的包)。:lib1 没有味道
在添加口味之前,一切正常。我向 :app 模块和名为“client1”的 :lib2 模块添加了 1 种风味。我在 :lib2\src\client1 中添加了一个“client1”文件夹:lib2。
Gradle 编译为: :app-client1Debug :app-client1Release :lib1-Debug :lib1-Release :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 //Has no flavor :lib2-client1Debug
并且 gradle 同步过程以异常结束: :app:processClient1DebugResources FAILED FAILURE: Build failed with an exception。• 出了什么问题:任务':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)。</p>
以及链接其他资源的其他类似错误:lib1 应该从 :lib2 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 FAILURE:构建失败并出现异常。• 出了什么问题:任务':lib1:compileDebugJavaWithJavac'执行失败。编译失败;有关详细信息,请参阅编译器错误输出。<br> • 尝试:使用--stacktrace 选项运行以获取堆栈跟踪。使用 --info 或 --debug 选项运行以获得更多日志输出。运行 --scan 以获得完整的见解。* 获取更多帮助 https://help.gradle.org
如果我在 :app-client2Debug :lib1-Debug //Has no flavor :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 多风味库 - AAPT:未找到资源 和其他...虽然我是对的...但是....不起作用
//更新如果我从 :lib2 gradle 文件中删除了风味,并从 :app 和 :lib1 中删除了它的依赖风味配置,但保留了具有两种风味的 :app 模块,则应用程序运行并为 boh 变体安装,并且为此我安装了正确的 versionNameSuffix认为我在 :lib1 的配置中遗漏了一些东西,使其能够从 :lib2 的正确风格中读取资源。
有人可以帮忙吗?谢谢