在 Android Gradle 构建中,您不得在输出中多次包含具有相同路径的相同文件。在您的构建中,有两个META-INF/DEPENDENCIES
文件来自不同的地方。由于您的应用程序中根本不需要此文件,因此最简单的做法是告诉构建系统完全忽略它,这就是该exclude
指令的作用。
还有一个pickFirst
指令告诉构建系统保留一份副本;在 Android Gradle 插件 0.7.0 中有少量细节:“在打包 APK 期间重复文件”。
Gradle 中的 Android 构建对重复文件相当严格,这可能会让生活变得困难。如果您多次包含同一个 Java 类,则会出现类似的问题,您会收到“多个 dex 文件定义”错误(有关典型示例,请参阅多个 dex 文件定义 Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat)。
其他构建系统更为宽松。例如,在 Java 中,如果您在类路径中多次包含同一个类,那么它看到的第一个副本就是使用的那个,这是典型的。之后的重复项将被忽略。在大多数情况下,这更容易处理,但它有几个问题。最大的问题是,如果一个文件的多个不同版本在您不知情的情况下潜入构建中,可能会出现细微的错误——很难弄清楚发生了什么。当你弄明白时,你通常可以通过调整包含的顺序来解决它,以确保你想要的东西进入最终输出,但在非常复杂的构建中,这可能很难实现,
出于这个原因,Gradle 的理念是在解决重复问题的游戏中不依赖事物的顺序来确定“赢家”,它迫使开发人员明确所有依赖关系。Android 在 Gradle 之上的构建系统的实现遵循了这一理念。