【问题标题】:How does the Android Gradle plugin handle conflicting resources in libraries?Android Gradle 插件如何处理库中的冲突资源?
【发布时间】:2015-10-20 21:19:39
【问题描述】:

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

尽管Resource Merging 文档解释了在构建类型、产品风格、应用程序项目和库项目之间发生冲突的资源的优先级和合并过程,但它没有解释当两个库(没有共同依赖关系)是合并到一个项目中。在构建过程的合并过程中,Android Gradle插件如何判断哪个库的资源优先级更高?

【问题讨论】:

  • 阿王,你找到解决办法了吗?
  • 我从未找到解决方案。在我阅读 Gradle 构建系统时,这更像是我的一个假设性问题。我有这个想法是因为我从事的一些项目使用了与一些 AOSP 标识符相同的标识符。
  • 您不认为它们的优先级与清单相同吗?即您在 build.gradle 文件顶部提到的库比它下面的库具有更高的优先级。
  • 它总是 build.gradle 中的顺序吗?如果这就是 Gradle 的工作方式,那么这就是答案。有人确定吗?
  • 嗨@Kevin!是的,我已经添加了问题的答案。文档现在明确指出,在 build.gradle 文件的依赖项块中首先提到的库将具有优先权。

标签: android gradle android-gradle-plugin


【解决方案1】:

没有办法指定图书馆资源的优先级。

您只能使用

您的库中设置前缀
android {
  resourcePrefix 'mylib_'
}

【讨论】:

  • 您好,也许您知道如果任何资源名称不正确,make build 会如何失败?
【解决方案2】:

啊,看来 Android 开发者文档终于有答案了。我从https://developer.android.com/studio/projects/android-library#Considerations 中提取了这个:

构建工具将库模块的资源与依赖应用模块的资源合并。如果在两个模块中都定义了给定的资源 ID,则使用来自应用的资源。

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

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

我将相关段落加粗。看起来,依赖项出现在 Gradle 依赖项块中的顺序会影响构建过程!这是一件需要警惕的小事。

【讨论】:

    【解决方案3】:

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

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

    优先顺序如下:

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

    ...

    这意味着如果src/main/res

    • res/layout/foo.xml
    • res/layout-land/foo.xml

    src/debug/res

    • res/layout/foo.xml

    然后合并的资源文件夹将包含默认的foo.xml from src/debug/res 但横向版本来自src/main/res

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 2019-04-16
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多