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

时间:2015-10-20 21:19:39

标签: android gradle android-gradle

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

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

3 个答案:

答案 0 :(得分:4)

无法为库的资源指定优先级。

您只能使用

您的资料库中设置前缀
Searchfor(charText, wp.getitem())

答案 1 :(得分:1)

嗯,看来Android开发人员文档终于为我们找到了答案。我是从https://developer.android.com/studio/projects/android-library#Considerations撤下的:

  

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

     

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

     

为避免常见资源ID的资源冲突,请考虑使用模块唯一的(或在所有项目模块中唯一的)前缀或其他一致的命名方案。

我将相关段落加粗了。看起来依赖关系在Gradle依赖关系块中出现的顺序可能会影响构建过程!这是要小心的小事。

答案 2 :(得分:0)

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

来自构建过程中的resource merging部分:

  

优先顺序如下:

     

BuildType - >味道 - >主要 - >的依赖关系。

     

...

     

这意味着如果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

的横向版本