我在一个使用单独库模块的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']
}
}