在使用 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 项目中构建分发包?

Gradle / javacard插件是否支持在多项目gradle构建中构建两个applet依赖项?

Android 在代码中使用 Gradle Build 风格,例如 if 案例

Gradle 总是从最后一种风格中的 buildType 中获取值