如何使用多个res.srcDirs并用gradle覆盖一些资源

我想根据不同的productFlavors构建我的应用程序的不同版本,但需要一定程度的灵活性,但目前还无法实现。

这是我的文件夹结构:

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

通用代码在main (一个服务)上,基本ui在基础上 (活动)。 然后,定义新UI的应用程序的定制版本位于custom1 (新活动)上。 这运行良好。 但我需要使用基本 UI的另一个版本的应用程序( custom2 ),但更改了一些res(图标,字符串或颜色)。

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

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

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

要指定CUSTOM2将使用源代码和基础的资源和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是指无论在基础CUSTOM2,但我的目标是覆盖资源的定义与CUSTOM2的那些基地

我知道如果我没有在res.srcDirscustom2指定任何内容,那么app_name将在主体中被重写,但是接下来来自base的所有资源将不可用。

该方法是否正确? 或者我滥用Gradle提供的灵活性? 或者有办法做我想做的事情?

提前致谢!


你不能以这种方式实现它。

资源合并具有优先权:

合并资源来自三种来源:

  • 与主sourceSet相关的主要资源通常位于src / main / res中
  • 来自Build Type的变体重叠和Flavor(s)。
  • 图书馆项目依赖关系,它通过aar包中的res条目提供资源。
  • 如此处所述

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

    android.sourceSets {
       main.res.srcDirs = ['src/main/res', src/main/res2']
    

    }

    在这种情况下,两个资源文件夹具有相同的优先级。 这意味着如果在两个文件夹中都声明资源, 合并将失败并报告错误

    你的情况也一样。 你不能以这种方式复制相同的资源。


    我能够通过在src的同级中添加另一级别的文件夹(称为共享),然后手动检查+汇编其他脚本中的必要资源以避免重复来实现此目的。

    脚本可以在这里找到:https://github.com/smbgood/examples/blob/master/family-resources.gradle

    资源将进入这样的文件夹(我们有3个应用程序的家庭,IG,JB + CB):
    /shared/JB/res/values/ids.xml

    对于我们现在的每个构建变体,在ids.xml'family'中有一个属性决定使用哪个应用程序族。 构建时,脚本检查shared中的drawable和xml文件,将它们与变体中的drawable和xml文件进行比较,然后删除重叠的项目,最后将所需的项目写入/ assemble /文件夹。

    链接地址: http://www.djcxy.com/p/86769.html

    上一篇: How to use multiple res.srcDirs and override some resources with gradle

    下一篇: Instabug for Android build warning