当前位置: 首页 > 知识库问答 >
问题:

Android Studio:编译时在APK META-INF/依赖项中复制重复文件

通啸
2023-03-14

我使用以下链接中的说明从Eclipse导出项目并导入到Android Studio:http://developer.Android.com/sdk/installing/migrate.html

当我构建时,我有一个错误:

Duplicate files copied in APK META-INF/DEPENDENCIES

经过搜索,我找到了一个解决方案:添加

packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
}

但我不明白为什么我会出现这个错误,为什么我必须应用那个修复程序。有人能解释吗?

共有1个答案

淳于恺
2023-03-14

在Android Gradle构建中,不允许在输出中多次包含具有相同路径的相同文件。在您的构建中,有两个meta-inf/dependencies文件来自不同的地方。由于在应用程序中根本不需要这个文件,所以最简单的做法就是告诉构建系统完全忽略它,这就是这个exclude指令所做的事情。

还有一个pickfirst指令告诉构建系统保留其中一个副本;在Android Gradle插件0.7.0中有一个很小的细节:“apk打包过程中重复文件”。

Gradle中的Android构建对重复文件相当严格,这会让生活变得困难。如果不止一次包含同一个Java类,也会出现类似的问题,其中会出现“Multiple dex files define”错误(参见Multiple dex files define landroid/support/v4/AccessibilityService/AccessibilityServiceInfoCompat)以获取典型示例)。

其他构建系统则更为宽松。例如,在Java中,如果在类路径中多次包含同一个类,那么它看到的第一个副本就是使用的那个;在此之后的重复项将被忽略。这在大多数情况下更容易处理,但它有几个问题。最大的一个问题是,如果一个文件的多个不同版本在您不知道的情况下悄悄进入构建,可能会出现细微的错误--很难弄清楚是怎么回事。当你弄清楚了它的时候,你通常可以通过调整包含的顺序来解决它,以确保你想要的东西能够到达最终的输出,但是在非常复杂的构建中,这可能很难实现,而且可能发生这样的情况:在项目中包含新的库这样看似不相关的事情会打乱顺序,并导致很多麻烦。

由于这个原因,Gradle的哲学是,在解决重复的游戏中,不依赖于事物的排序来确定“赢家”,并且它迫使开发人员将所有依赖都显式化。Android在Gradle基础上实现build系统遵循了这一原则。

 类似资料:
  • 错误:任务“:OpenPayAndroid:TransformResourcesWithMergeJavaResforRelease”执行失败。 com.android.build.api.transform.transformException:com.android.builder.packaging.duplicateFileException:APK Meta-INF/license文件中

  • 我一直在查看这里张贴的关于这个错误的一些答案,但没有运气。我希望得到一些关于发生了什么的澄清。我的错误如下: 此外,我对这些帖子中给出的一些建议有点困惑。和之间的操作区别是什么?它们似乎可以互换,但表达了非常不同的想法。似乎我被要求在上传到应用商店时包括许可证,所以如果我在这里排除了它,以便编译应用程序,当我准备上传时,我应该在哪里包括它?我希望有人能更多地了解这里发生的事情。

  • 如何避免库重复? 如何在Android Studio中查看maven依赖项? 如何检测哪个库需要此库?例如,在我的项目中,哪个库需要?

  • 我将使用Spring向我的Android应用程序添加RESTful Web服务支持,如下所述https://Spring.io/guides/gs/consulting-rest-android/。 这是顶级构建。gradle配置: 我做错了什么,怎么修复?

  • 我正在使用mongodb和Spring Boot。最近,我的mongodb升级到了3.0版本。 我对Spring使用以下Gradle依赖项: 如果我查看maven存储库中的gradle:,我会看到以下内容(http://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb/1.2.6

  • 我有一个Tycho构建,它为Xtext DSL功能生成eclipse插件。我现在想做一个maven插件,它可以处理DSL文件。问题是要将DSL插件所依赖的工件放入maven插件中,因为这些工件不在maven存储库中。此外,我希望maven插件自动依赖于DSL插件所依赖的相同工件。 我认为创建一个带有依赖项的 über-jar 将是最好的方法。问题是检索 DSL 插件的依赖项并将其复制到一个目录中,