wake-up-neo.net

Android Studio: Duplizieren von Dateien, die beim Kompilieren in APK META-INF / DEPENDENCIES kopiert wurden

Ich habe mein Projekt aus Eclipse exportiert und mit den Anweisungen in diesem Link in Android Studio importiert: http://developer.Android.com/sdk/installing/migrate.html =

Beim Erstellen ist ein Fehler aufgetreten:

Duplicate files copied in APK META-INF/DEPENDENCIES

Nach der Suche fand ich eine Lösung: hinzufügen

packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
}

in build.gradle. Und es funktioniert!

Aber ich verstehe nicht, warum ich diesen Fehler hatte und warum ich diesen Fix anwenden musste. Kann jemand erklären?

35
TrungNVT

In Android Gradle-Builds dürfen Sie dieselbe Datei mit demselben Pfad nicht mehr als einmal in die Ausgabe aufnehmen. In Ihrem Build gab es zwei META-INF/DEPENDENCIES Dateien von verschiedenen Orten. Da Sie diese Datei in Ihrer Anwendung überhaupt nicht benötigen, ist es am einfachsten, das Build-System anzuweisen, sie vollständig zu ignorieren. Genau das macht diese Anweisung exclude.

Es gibt auch eine pickFirst Direktive, die das Build-System anweist, one der Kopien zu behalten; Es gibt eine winzige Menge an Details in Android Gradle Plugin 0.7.0: "Duplizieren von Dateien während des Packens von APK" .

Android-Builds in Gradle sind streng in Bezug auf doppelte Dateien, was das Leben erschweren kann. Es gibt ein ähnliches Problem, wenn Sie dieselbe Java Klasse mehr als einmal einschließen, wobei der Fehler "Mehrere Dex-Dateien definieren" angezeigt wird (siehe Mehrere Dex-Dateien definieren Landroid/support/v4)/accessibilityservice/AccessibilityServiceInfoCompat ) für ein typisches Beispiel).

Andere Build-Systeme sind weniger anfällig. In Java) ist es typisch, dass, wenn Sie dieselbe Klasse mehr als einmal in einen Klassenpfad einfügen, die erste Kopie verwendet wird, die dann ignoriert wird Die meisten Fälle sind einfacher zu handhaben, haben jedoch ein paar Probleme: Das größte Problem ist, dass es zu subtilen Fehlern kommen kann, wenn sich mehrere verschiedene Versionen einer Datei in den Build einschleichen, ohne dass Sie es wissen - es kann schwierig sein, herauszufinden, was los ist Wenn Sie es herausfinden, können Sie es in der Regel lösen, indem Sie die Reihenfolge, in der die Elemente enthalten sind, aufeinander abstimmen, um sicherzustellen, dass das gewünschte Element zur endgültigen Ausgabe gelangt. In sehr komplexen Builds kann dies jedoch schwierig zu erreichen sein Es kann vorkommen, dass scheinbar nicht verwandte Dinge wie das Einbeziehen neuer Bibliotheken in Ihr Projekt die Reihenfolge stören und zu viel Leid führen können.

Aus diesem Grund hat Gradle die Philosophie, sich nicht auf die Reihenfolge von Dingen zu verlassen, um "Gewinner" beim Auflösen von Duplikaten zu ermitteln, und zwingt den Entwickler, alle Abhängigkeiten explizit anzugeben. Die Implementierung des Build-Systems von Android auf Basis von Gradle folgt dieser Philosophie.

38
Scott Barta

Während Scott Bartas Antwort richtig ist, fehlt eine einfache und gängige Lösung: einfach hinzufügen

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

zu Ihrem build.gradle, um diese Duplikate zu ignorieren.

62
Jehy

Die einfachste Lösung ist das Hinzufügen

 packagingOptions {
    pickFirst  'META-INF/*'
}

zu deinem build.gradle in Android section

10
Jorge Arimany

Die einfachste Möglichkeit, dieses Problem zu beheben, ist die Verwendung eines Platzhalters, damit Sie nicht jede in Konflikt stehende Datei manuell deklarieren müssen.

packagingOptions {
    pickFirst  '**'
}
2
Mapsy

Für den Fall, dass jemand dieses Problem beim Hochladen einer neuen .apk-Datei in den Google Play Store hat, nachdem updatng Android Studio;

klicke auf V1 Jar Signature not Full Apk Signature während du neue Apk mit alten generierst Schlüsselspeicher

V1 Jar Signature

enter image description here

0
Sam