How to use multiple res.srcDirs and override some resources with gradle(如何使用多个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
是在base和custom2上定义的,但我的目标是用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覆盖某些资源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!