在使用 gradle 缓存时,在多风格的 android 库中使用不同的 res 值会在编译的 APK 中使用错误的值
Posted
技术标签:
【中文标题】在使用 gradle 缓存时,在多风格的 android 库中使用不同的 res 值会在编译的 APK 中使用错误的值【英文标题】:Using different res values in a multi-flavor android library uses wrong values in compiled APK when using gradle caching 【发布时间】:2022-01-12 17:15:02 【问题描述】:我在一个使用单独库模块的 android 项目中发现了一个问题。该项目使用多种产品风格,这些风格反映在每个库中。
其中一个库使用resValue
函数根据风格生成不同的字符串值。
但是,在组装多种风味时会发生一个问题 - 似乎在第一个风味之后生成的 apk 被分配了第一个风味的资源值。
Here is an example repo that shows the problem
App gradle 文件相关部分:
plugins
id 'com.android.application'
id 'kotlin-android'
android
flavorDimensions("environment")
defaultConfig
dimension = "environment"
productFlavors
create("dev")
create("ppe")
dependencies
implementation(project(":testlib"))
库 gradle 文件的相关部分:
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
并检查生成的开发 APK,您会注意到 aaa_lib_test_gradle
的值是 ppe,而不是预期的 dev .
是什么导致了这个 - 是否有一些我没有使用的我应该使用的 gradle 设置丢失?作为参考,我使用的是 AGP 7.0.3 和 gradle 7.0.2
更新:我发现只有在 gradle 属性 org.gradle.caching=true
中将缓存设置为 true 时才会发生这种情况。将其设置为 false 会产生预期的结果。
更新 2:这显然是此处跟踪的 AGP 7.x 的问题:https://issuetracker.google.com/issues/201930057
【问题讨论】:
【参考方案1】:显然,这是旧 7.0 版 AGP 的问题。它在 7.0.4 中得到解决。可以确认使用该版本时不会出现问题。
与此相关的问题: https://issuetracker.google.com/issues/201930057 https://issuetracker.google.com/issues/196852190
【讨论】:
【参考方案2】:我认为你需要使用
sourceSets
dev
res.srcDirs = ['src/dev/res']
【讨论】:
我会在哪里添加它?在应用程序的 gradle 文件中? 我不确定它会改变什么。我添加了sourceSets named("dev") println(res.srcDirs)
,然后将您提到的目录打印为控制台输出[../AndroidGradleLibFlavorResIssue/testlib/src/dev/res]
以上是关于在使用 gradle 缓存时,在多风格的 android 库中使用不同的 res 值会在编译的 APK 中使用错误的值的主要内容,如果未能解决你的问题,请参考以下文章
如何在多模块spring boot应用程序gradle中只访问不同模块的一个类?
如何在多 Gradle 项目的 JUnit Spring 上下文中加载资源属性?
Gradle / javacard插件是否支持在多项目gradle构建中构建两个applet依赖项?