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

时间:2015-01-16 04:39:37

标签: android android-studio duplicates meta-inf

我从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。它有效!

但是我不明白为什么我有这个错误以及为什么我必须应用该修复。有人可以解释一下吗?

6 个答案:

答案 0 :(得分:62)

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

# You will need import:
from django.db.models import Sum, IntegerField, Case, When, Value

with_scores = authors.annotate(total_book_score=Sum(
    Case(When(books__published=2015, then=Value(F('books__score'))),
        default=Value(0), output=IntegerField())  # Or float if it fits your needs.
    )
)

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

答案 1 :(得分:38)

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

答案 2 :(得分:10)

最简单的解决方案是添加

 packagingOptions {
    pickFirst  'META-INF/*'
}

到android部分的build.gradle

答案 3 :(得分:2)

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

packagingOptions {
    pickFirst  '**'
}

答案 4 :(得分:0)

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

点击 V1 Jar签名而非完整Apk签名,同时使用旧密钥库生成新的Apk

V1 Jar Signature

enter image description here

答案 5 :(得分:-3)

  

依赖项{       实现fileTree(include:['* .jar'],dir:'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’)
     

}

     

//祝你好运