37

我使用以下链接中的说明从 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. 它有效!

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

4

6 回答 6

64

虽然 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 以忽略这些重复项。

于 2015-12-01T15:29:10.210 回答
48

在 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 之上的构建系统的实现遵循了这一理念。

于 2015-01-16T17:34:25.273 回答
11

最简单的解决方案是添加

 packagingOptions {
    pickFirst  'META-INF/*'
}

到你在 android 部分的 build.gradle

于 2017-04-21T04:48:47.740 回答
4

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

packagingOptions {
    pickFirst  '**'
}
于 2017-12-20T09:51:38.830 回答
0

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

单击V1 Jar Signature not Full Apk Signature while Generate new Apk with old Keystore

V1 罐子签名

在此处输入图像描述

于 2017-08-10T12:20:24.060 回答
-3

依赖项 { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:28.0.0' implementation '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’)

}

// 祝你好运

于 2018-11-06T17:05:08.907 回答