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

Par*_*aia 7 android gradle android-studio build.gradle android-productflavors

我想基于不同的productFlavor构建我的应用程序的不同版本,但需要一定程度的灵活性,这是我无法实现的.

这是我的文件夹结构:

+src
  +main
    +java
    +res
  +base
    +java
    +res
  +custom1
    +java
    +res
  +custom2
    +res
Run Code Online (Sandbox Code Playgroud)

公共代码在main(服务)上,基础ui在base(活动)上.然后定义新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']
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

要指定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
Run Code Online (Sandbox Code Playgroud)

由于app_name定义上都基地CUSTOM2,但我的目标是覆盖资源的定义在基地与的个CUSTOM2.

我知道如果我没有为custom2指定任何内容,那么app_name将在main中覆盖,但是然后来自base的所有资源都将不可用.res.srcDirs

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

提前致谢!

Gab*_*tti 7

你无法以这种方式实现它.

资源合并有一个优先事项:

合并后的资源来自3种类型的来源:

  • 与主sourceSet关联的主要资源通常位于src/main/res中
  • 变体叠加,来自Build Type和Flavor(s).
  • 库项目依赖项,通过其aar包中的res条目提供资源.

如上所述这里

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

android.sourceSets {
   main.res.srcDirs = ['src/main/res', 'src/main/res2']
}
Run Code Online (Sandbox Code Playgroud)

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

你的情况也是如此.您不能以这种方式复制相同的资源.