在使用渐变缓存时,在多风格android库中使用不同的res值会在编译的APK中使用错误的值



我在一个使用单独库模块的android项目中发现了一个问题。该项目使用多种产品风格,这些风格反映在每个库中。

其中一个库使用resValue函数根据风格生成不同的字符串值。

然而,在组装多个风格时会出现一个问题——第一个风格之后生成的apk似乎被分配了第一个风格的资源值。

以下是一个示例回购,显示问题

应用程序等级文件的相关部分:

plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
flavorDimensions("environment")
defaultConfig {
dimension = "environment"
}
productFlavors {
create("dev")
create("ppe")
}
}
dependencies {
implementation(project(":testlib"))
}

图书馆等级文件的相关部分:

plugins {
id 'com.android.library'
id 'kotlin-android'
}
android {
flavorDimensions("environment")
defaultConfig {
dimension = "environment"
}
productFlavors {
create("dev") {
resValue("string", "aaa_lib_test_gradle", "dev")
}
create("ppe") {
resValue("string", "aaa_lib_test_gradle", "ppe")
}
}
}

使用此配置,如果您运行./gradlew clean assemblePpeDebug assembleDevDebug并检查生成的dev-APK,您会注意到aaa_lib_test_gradle的值是ppe,而不是预期的dev

是什么导致了这种情况——是不是有一些我不应该使用的渐变设置缺失?作为参考,我使用AGP 7.0.3和等级7.0.2

更新:我发现只有当渐变属性org.gradle.caching=true中的缓存设置为true时才会发生这种情况。将其设置为false会产生预期的结果。

更新2:这显然是AGP 7.x的一个问题,在此跟踪:https://issuetracker.google.com/issues/201930057

显然这是旧版7.0 AGP的问题。7.0.4对此进行了说明。可以确认在使用该版本时不会出现问题。

与此相关的问题:https://issuetracker.google.com/issues/201930057https://issuetracker.google.com/issues/196852190

我认为为此您需要使用

sourceSets {
dev {
res.srcDirs = ['src/dev/res']
}
}

最新更新