如何使用多个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.srcDirs
为custom2指定任何内容,那么app_name
将在主体中被重写,但是接下来来自base的所有资源将不可用。
该方法是否正确? 或者我滥用Gradle提供的灵活性? 或者有办法做我想做的事情?
提前致谢!
你不能以这种方式实现它。
资源合并具有优先权:
合并资源来自三种来源:
如此处所述
如上所述,每个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