Android Studio:编译时复制到 APK META-INF/DEPENDENCIES 中的重复文件

Android Studio: Duplicate files copied in APK META-INF/DEPENDENCIES when compile

我使用此 link 中的说明从 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 Gradle 构建中,不允许在输出中多次包含具有相同路径的相同文件。在您的构建中,有两个 META-INF/DEPENDENCIES 个文件来自不同的地方。由于您的应用程序中根本不需要此文件,因此最简单的做法是告诉构建系统完全忽略它,这就是 exclude 指令的作用。

还有一个 pickFirst 指令告诉构建系统保留 一个 个副本; Android Gradle plugin 0.7.0: "duplicate files during packaging of APK".

中有少量详细信息

Android Gradle 中的构建对重复文件相当严格,这可能会使生活变得困难。如果您多次包含相同的 Java class,则会出现类似的问题,您会收到 "Multiple dex files define" 错误(典型示例请参见 Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat)。

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

出于这个原因,Gradle 的理念是在解决重复项的游戏中不依赖事物的排序来确定 "winners",它迫使开发人员明确所有依赖关系。 Android 在 Gradle 之上构建系统的实现遵循了这一理念。

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

最简单的解决方案是添加

 packagingOptions {
    pickFirst  'META-INF/*'
}

在 android 部分 build.gradle

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

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

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

packagingOptions {
    pickFirst  '**'
}

dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:design:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'com.google.android.gms:play-services-ads:10.2.1' implementation '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’)

}

// good luck