Wie löse ich "Doppelte Dateien, die in APK META-INF / * kopiert wurden" auf

91

Ich arbeite an einer kommerziellen Android-Anwendung. Ich verwende auch einige Bibliotheken, die unter verschiedenen Lizenztypen lizenziert sind. Einige von ihnen geben Folgendes an:

Wenn die Bibliothek eine "NOTICE" -Datei mit Attributionsnotizen enthält, müssen Sie diese NOTICE bei der Verteilung angeben

(Einer von ihnen ist beispielsweise unter Apache License 2.0 lizenziert ).

Es gibt mehr als eine Bibliothek. Wenn ich den Build mit gradle oder mit Android Studio mache, erhalte ich den folgenden Buildfehler :

* What went wrong:
Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/license.txt

Die Antworten, die ich bisher im Internet und im Stackoverflow gefunden habe, schlagen vor, die Datei license.txt (Notice.txt oder andere Dateien, die auf diese Weise stören könnten) aus dem Paket zu entfernen, indem Sie der build.gradleDatei Folgendes hinzufügen :

packagingOptions {
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/dependencies.txt'
    exclude 'META-INF/LGPL2.1'
}

Siehe zum Beispiel: Android Studio 0.4 Doppelte Dateien, die in APK META-INF / LICENSE.txt kopiert wurden

Entsprechend der Lizenz dieser Bibliotheken ( z. B. Apache License 2.0 ) sollten die Lizenz- und Benachrichtigungsdateien enthalten sein .

Meine Frage: Wie kann ich mehrere gradungsbezogene Dateien (wie licence.txt , Notice.txt usw.) von gradle in mein Projekt einfügen, um die Lizenzen einzuhalten ( technisches Detail: Lizenztexte werden verkettet)?

Flowryn
quelle
2
Können Sie aus technischer Sicht nicht so verpacken, dass sich alle "Muss" -Dateien jeder Bibliothek in einem eigenen Verzeichnis befinden? Eine Alternative, die ich bei einigen Apps gesehen habe, besteht darin, dass Sie (manuell) alle entsprechenden Lizenz- / Benachrichtigungsdateien in einer Ressource kombinieren und diese einschließen / anzeigen (wenn zwei oder mehr Bibliotheken dieselbe Lizenzversion verwenden, sollten Sie sie gruppieren können , "Bibliothek A und Bibliothek B unterliegen der folgenden Lizenz: ...").
TripeHound
@TripeHound Dies ist das, was ich derzeit als Problemumgehung mache. Während des Entwicklungsprozesses schließe ich sie aus und wenn es um die Veröffentlichung geht: Kommentieren Sie alle "Ausschlüsse" und lösen Sie die Lizenzen manuell.
Flowryn
1
Suche nach der Antwort "packageOptions - exclude" verdient eine positive Bewertung
Ahmed Adel Ismail

Antworten:

47

Es gibt eine Lösung, wenn Sie nur eine Lizenz mit dem Namen haben license.txt(lesen Sie: Alle license.txtKopien sind identisch):

packagingOptions {
   pickFirst  'META-INF/license.txt'
}

Andernfalls hat Google auch ein Gradle-Plugin zur Verwaltung von Abhängigkeitslizenzen veröffentlicht. Siehe hier . Ich habe es nicht ausprobiert, aber es sieht so aus, als ob es in der Lage ist, jede Abhängigkeit zu aggregieren und sogar eine Aktivität zu generieren, in der alle diese Lizenzen angezeigt werden.

Marc Plano-Lesay
quelle
1
Ich habe momentan 2 Lizenzen, eine stammt aus Apache 2.0, die andere aus GPL 3.0. Meine derzeitige Problemumgehung besteht darin, sie während der Entwicklungsphase auszuschließen und bei der Veröffentlichung manuell einzuschließen. Alle license.txt werden verkettet. Gleiches gilt für Notice.txt. Wie auch immer, ich mag Ihren Ansatz mit pickFirst, falls die Lizenz identisch ist!
Flowryn
3
Wenn Sie jemals einen Weg finden, Lizenzen automatisch zu verketten, bin ich ganz Ohr!
Marc Plano-Lesay
Das ist es, was ich jetzt untersuche. Zuerst muss ich herausfinden, was (und wie) die Gradle-Aufgabe ausführt, die den Konflikt ausgelöst hat (dafür habe ich diese Frage gestellt: stackoverflow.com/questions/34287701/… ) und sie dann ersetzen
Flowryn
@Flowryn Wie fügst du die gesamte Notice.txt manuell ein? Kopiere sie einfach in eine Notice.txt? kann es nicht ändern, die in jarDatei
Chinaanihchen
Sie erwähnen, dass das Problem in den verwendeten Bibliotheken liegt. In meinem Fall bin ich für die Erstellung der von mir verwendeten Bibliotheken verantwortlich. Was könnte ich falsch machen, wenn ich sie erstelle? Danke
Eric
32

Fügen Sie Folgendes in die entsprechende build.gradle-Datei ein

packagingOptions {
        exclude 'META-INF/ASL2.0'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/MANIFEST.MF'
    }
Max Droid
quelle
1
Dies schließt Lizenzen aus, die für die meisten von ihnen ausdrücklich gegen ihre Bedingungen verstoßen.
Marc Plano-Lesay
1
Dies sollte in der Android {} Schließung für aktuelle (2. *) Versionen von Gradle
Mijiturka
4

Ich hatte das gleiche Problem mit meiner Bewerbung. Sie müssen sicherstellen, dass Sie keine Bibliotheken zweimal hinzugefügt haben. Wenn Sie die Firebase-Dokumentation https://firebase.google.com/docs/android/setup befolgt haben

Dann sollten Sie keine Firebase-Bibliothek in Android Studio hinzufügen, dh Datei-> Projektstruktur-> Cloud-> Firebase

Sie müssen nur eine der beiden Aktionen ausführen, um Firebase in Ihrer Android-Anwendung zu verwenden.

Am Ende bereinigen Sie Ihre App und führen Sie sie erneut aus.

aMächtig
quelle
2
Wenn Sie jackson-database verwenden, tritt das Problem auf, wenn Sie es einmal hinzufügen.
Der unglaubliche
0

Sie können mehrere Lizenz hinzufügen in gradle dies sehen

Akhil Jayakumar
quelle
0

Ich denke, Sie müssen nur diese Optionen in build.gradle aufnehmen:

android {
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
    }
}
S. Sadham Hussain
quelle
-2

Sicher wird es funktionieren

packagingOptions {
 exclude 'META-INF/LICENSE.txt'
 exclude 'META-INF/NOTICE.txt'   }
Mahendran Candy
quelle
1
Nein, das wird es nicht: Dies schließt die Lizenzen aus. Es ist gemäß den genannten Lizenzbestimmungen illegal.
Marc Plano-Lesay
Nein, es ist eine tmp-Lösung für die sofortige Kompilierung eines Projekts
Mahendran Candy
1
Was auch immer die Verwendung ist, lesen Sie die Lizenzen: Für die große Mehrheit von ihnen ist das, was Sie mit Ihrer Ausschlussregel erreichen, illegal.
Marc Plano-Lesay