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覆盖某些资源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何使用多个res.srcDir并使用Gradle覆盖某些资源


基础教程推荐
- AdMob 广告未在模拟器中显示 2022-01-01
- Cocos2d iPhone 非矩形精灵触摸检测 2022-01-01
- Android:getLastKnownLocation(LocationManager.NETWORK_PROVIDER 2022-01-01
- 如何从 logcat 中删除旧数据? 2022-01-01
- iOS4 创建后台定时器 2022-01-01
- NSString intValue 不能用于检索电话号码 2022-01-01
- 通过重定向链接在 Google Play 中打开应用 2022-01-01
- iPhone - 获取给定地点/时区的当前日期和时间并将其与同一地点的另一个日期/时间进行比较的正确方法 2022-01-01
- navigator.geolocation.getCurrentPosition 在 Android 浏览器上 2022-01-01
- libGDX 从精灵或纹理中获取像素颜色 2022-01-01