如何使用多个res.srcDir并使用Gradle覆盖某些资源 [英] How to use multiple res.srcDirs and override some resources with gradle

查看:51
本文介绍了如何使用多个res.srcDir并使用Gradle覆盖某些资源的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望基于不同的products Favors构建不同版本的应用程序,但需要一定程度的灵活性,这是我目前还无法实现的。

这是我的文件夹结构:

+src
  +main
    +java
    +res
  +base
    +java
    +res
  +custom1
    +java
    +res
  +custom2
    +res

通用代码位于main(服务)上,基本UI位于base(活动)上。则定义新UI的应用程序的自定义版本在custom1(新活动)上。这辆车运行得很好。但我需要其他版本的应用程序(custom2),该应用程序使用基本UI,但更改了某些RES(图标、字符串或颜色)。

我在build.gradle文件中尝试的内容是:

android{
    ...
  productFlavors {
    base {
      ...
    }
    custom1 {
      ...
    }
    custom2 {
      ...
    }
  }

  sourceSets{
    custom2{
      java.srcDirs = ['src/base/java']
      res.srcDirs = ['src/custom2/res', 'src/base/res']
    }
  }
}

指定custom2将使用base的源代码和资源以及custom2的资源。

问题是我得到一个:

Error: Duplicate resources: <project_path>/src/base/res/values-es/strings.xml:string-en/app_name, <project_path>/src/custom2/res/values-es/strings.xml:string-en/app_name

因为app_name是在basecustom2上定义的,但我的目标是用custom2中的资源定义覆盖base中的资源定义。

我知道,如果我不在custom2中为custom2指定任何内容,app_name将在main中被覆盖,但是base中的所有资源都将不可用。

方法正确吗?还是我滥用了Gradle提供的灵活性?还是有办法做我想做的事?

提前感谢!

推荐答案

您无法通过这种方式实现。

资源合并有优先级:

合并后的资源有3种来源:

  • 与主源集关联的主要资源,通常位于src/main/res
  • 变体覆盖,来自生成类型和风格。
  • 库项目依赖项,它通过其AAR捆绑包中的RES条目贡献资源。

如上所述here

如上所述,每个SourceSet可以定义多个资源文件夹。例如:

android.sourceSets {
   main.res.srcDirs = ['src/main/res', 'src/main/res2']
}
在这种情况下,两个资源文件夹具有相同的优先级。这意味着,如果在两个文件夹中都声明了某个资源,合并将失败,并将报告错误

在您的案例中也会发生同样的情况。您不能以这种方式复制相同的资源。

这篇关于如何使用多个res.srcDir并使用Gradle覆盖某些资源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆