【问题标题】:Android Studio: Duplicate files copied in APK META-INF/DEPENDENCIES when compileAndroid Studio:编译时在 APK META-INF/DEPENDENCIES 中复制的重复文件
【发布时间】:2015-03-14 16:05:27
【问题描述】:

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

构建时出现错误:

Duplicate files copied in APK META-INF/DEPENDENCIES

经过搜索,找到了解决办法:添加

packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
}

进入build.gradle。它有效!

但我不明白为什么会出现此错误以及为什么必须应用该修复程序。谁能解释一下?

【问题讨论】:

  • 我刚刚更新到 Android Studio 2.2 并收到此错误。它已通过将“META-INF/DEPENDENCIES.txt”更改为“META-INF/DEPENDENCIES”来修复。
  • 在 Android Studio 2.2 之后对我来说也是如此,但使用“META-INF/LICENSE”
  • 当我添加这一行时,它只是在构建项目时永远挂起?

标签: android android-studio duplicates meta-inf


【解决方案1】:

虽然 Scott Barta 的回答是正确的,但缺少一个简单通用的解决方案:只需添加

android {
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }
}

到您的 build.gradle 以忽略这些重复项。

【讨论】:

  • 我在 Android Studio 2.2.2 (11/2016) 中遇到了这个问题,无法构建它。我刚刚升级到 AndroidStudio 2.2.2 并添加了这些更改修复了它,Gradle 最终构建并且我能够运行我的项目。我依赖于 Firebase 和 Admobs。谢谢
  • pickFirst 也可以代替exclude。此外,如果您有其他类似的错误,也请添加。例如,我必须添加pickFirst'META-INF/plexus/components.xml'
  • 我更喜欢pickFirst 解决方案,因为您似乎不能在exclude 中使用通配符
  • 现在packagingOptions 中还有一个merge 函数,可以将多个文件合并为一个,这对于 LICENSE 文件可能比排除它们或只选择一个文件更好。
  • 我仍然面临同样的问题,没有一个解决方案有效,这是错误:原因:重复条目:META-INF/services/javax.annotation.processing.Processor
【解决方案2】:

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

还有一个pickFirst 指令告诉构建系统保留一个的副本; Android Gradle plugin 0.7.0: "duplicate files during packaging of APK" 中对此有少量详细说明。

Gradle 中的 Android 构建对重复文件非常严格,这会让生活变得困难。如果您多次包含同一个 Java 类,则会出现类似的问题,您会收到“多个 dex 文件定义”错误(典型示例请参见 Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat)。

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

因此,Gradle 的理念是在解决重复问题的游戏中不依赖事物的顺序来确定“赢家”,它迫使开发人员明确所有依赖关系。 Android 在 Gradle 之上的构建系统的实现遵循了这一理念。

【讨论】:

  • 感谢您的帮助。
    但我不知道为什么我的构建中有两个 META-INF/DEPENDENCIES 文件。该消息显示重复文件位于同一位置。
    `任务':packageDebug'执行失败。 > 在 APK META-INF/DEPENDENCIES 文件 1 中复制的重复文件:D:\Study\Android\AndroidStudio\MyProject\libs\apache-mime4j-core-0.7.2.jar 文件 2:D:\Study\Android\AndroidStudio\ MyProject\libs\apache-mime4j-core-0.7.2.jar ` Android Studio 自动生成了吗?
  • 这实际上是一个好问题——我不知道。我以前见过,但从未尝试过深入了解它。
  • @ScottBarta 谢谢你的谦虚和钦佩你不知道我太喜欢兄弟了
【解决方案3】:

最简单的解决方案是添加

 packagingOptions {
    pickFirst  'META-INF/*'
}

到你的android部分的build.gradle

【讨论】:

  • 太棒了!我想你也可以为子文件夹做pickFirst 'META-INF/**',虽然通常那里没有子文件夹。
【解决方案4】:

我发现解决此问题的最简单方法是使用通配符,因此您不必手动声明每个冲突文件。

packagingOptions {
    pickFirst  '**'
}

【讨论】:

    【解决方案5】:

    如果有人在将新的 .apk 上传到 Google Play 商店时遇到这些问题,请在更新 Android Studio 之后;

    在使用旧密钥库生成新 Apk 时单击 V1 Jar 签名 而不是 完整 Apk 签名

    【讨论】:

      【解决方案6】:

      依赖{ 实现文件树(包括:['*.jar'],目录:'libs') 实施 'com.android.support:appcompat-v7:28.0.0' 实施 'com.android.support:design:27.1.1' 实施 'com.android.support.constraint:constraint-layout:1.0.2' 实施 'com.google.android.gms:play-services-ads:10.2.1' 实施 'com.android.support:support-annotations:25.0.1' testImplementation 'junit:junit:4.12'

      **// select only one in two line below**  implementation ‘package’    //implementation project(‘:package’)
      

      }

      //祝你好运

      【讨论】:

      • 您好,欢迎来到 Stack Overflow。这不是一个合适的答案。您应该提供足够的上下文来说明如何应用此答案,并确保您的代码适当缩进。
      猜你喜欢
      • 2015-02-14
      • 2014-01-16
      • 2023-03-08
      • 2016-12-13
      • 1970-01-01
      • 2016-08-10
      • 2016-10-01
      • 2017-10-07
      相关资源
      最近更新 更多