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提供的灵活性?或者有办法做我想做的事情?
提前致谢!
你无法以这种方式实现它.
资源合并有一个优先事项:
合并后的资源来自3种类型的来源:
如上所述这里
如上所述,每个sourceSet都可以定义多个资源文件夹.例如:
android.sourceSets {
main.res.srcDirs = ['src/main/res', 'src/main/res2']
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,两个资源文件夹具有相同的优先级.这意味着如果在两个文件夹中声明资源,则合并将失败并报告错误.
你的情况也是如此.您不能以这种方式复制相同的资源.
| 归档时间: |
|
| 查看次数: |
10639 次 |
| 最近记录: |