Android Gradle插件如何处理库中的冲突资源?

Android Gradle插件如何处理库中的冲突资源?,android,gradle,android-gradle-plugin,Android,Gradle,Android Gradle Plugin,我有一个Android应用程序项目,它依赖于两个Android库。两个Android库指定了两个具有相同资源ID的资源。在旧的Ant构建系统中,库的优先级是在project.properties文件中指定的,但在Gradle构建系统中不使用这样的文件 尽管文档解释了构建类型、产品风格、应用程序项目和库项目之间冲突的资源的优先级和合并过程,但它没有解释在单个项目中合并两个库(没有公共依赖项)时会发生什么。在构建过程的合并过程中,Android Gradle插件如何确定哪个库的资源具有更高的优先级?

我有一个Android应用程序项目,它依赖于两个Android库。两个Android库指定了两个具有相同资源ID的资源。在旧的Ant构建系统中,库的优先级是在project.properties文件中指定的,但在Gradle构建系统中不使用这样的文件


尽管文档解释了构建类型、产品风格、应用程序项目和库项目之间冲突的资源的优先级和合并过程,但它没有解释在单个项目中合并两个库(没有公共依赖项)时会发生什么。在构建过程的合并过程中,Android Gradle插件如何确定哪个库的资源具有更高的优先级?

没有为库的资源指定优先级的方法

只能在库中使用设置前缀

android {
  resourcePrefix 'mylib_'
}

@Angela answer非常适合解决您(实际上也是我)的问题,根据Android如何选择正确的资源以及优先级来回答您的问题:

从构建过程中的部件:

优先顺序如下:

BuildType->Flavor->main->依赖项

这意味着如果
src/main/res

  • res/layout/foo.xml
  • res/layout land/foo.xml
并且
src/debug/res
已经

  • res/layout/foo.xml
然后,合并的资源文件夹将包含来自的默认
foo.xml
src/debug/res
但是
src/main/res


啊,看起来Android开发者文档终于为我们找到了答案。我是从以下方面得出这个结论的:

生成工具将库模块中的资源与从属应用程序模块中的资源合并。如果在两个模块中都定义了给定的资源ID,则使用应用程序中的资源

如果多个AAR库之间发生冲突,则使用依赖项列表中首先列出的库中的资源(朝向依赖项块的顶部)。

<>为了避免公共资源IDS的资源冲突,考虑使用前缀或其他对模块唯一的一致命名方案(或者在所有项目模块中是唯一的)。
我将相关段落加粗。看起来,依赖项在Gradle dependencies块中出现的顺序可能会影响构建过程!这是一件值得警惕的小事。

a王,你找到解决办法了吗?我从来没有找到解决办法。当我读到Gradle构建系统时,这更多的是我的一个假设问题。我有这样的想法是因为我参与的一些项目使用了与某些AOSP标识符相同的标识符。您不认为它们的优先级排序方式与清单相同吗?i、 e.您在build.gradle文件顶部提到的库的优先级高于libs。但它是否总是build.gradle中的顺序?如果格拉德尔就是这样工作的,那么这就是答案。有人知道吗?嗨,凯文!是的,我对这个问题补充了一个答案。文档现在明确指出build.gradle文件的dependencies块中首先提到的库将具有优先级。您好,您可能知道如果任何资源名称不正确,make build将如何失败?