Come risolvo "File duplicati copiati nell'APK META-INF / *"


91

Sto lavorando a un'applicazione Android commerciale. Sto anche usando alcune librerie concesse in licenza con diversi tipi di licenza, alcune delle quali affermano quanto segue:

Se la libreria ha un file "NOTICE" con note di attribuzione, è necessario includere tale AVVISO quando si distribuisce

(Uno di questi è concesso in licenza con la licenza Apache 2.0, ad esempio).

C'è più di una libreria. Quando eseguo la build con gradle o con Android Studio ottengo il seguente errore di build:

* 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

Le risposte che ho trovato fino ad ora su Internet e stackoverflow suggeriscono di rimuovere il file license.txt (notice.txt o altri file che potrebbero interferire in questo modo) dal packaging aggiungendo al build.gradlefile quanto segue:

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'
}

Vedi ad esempio: Android Studio 0.4 File duplicati copiati in APK META-INF / LICENSE.txt

In base alla licenza di queste librerie ( ad esempio, Apache License 2.0 ), i file di licenza e avviso dovrebbero essere inclusi .

La mia domanda: come posso aggiungere più file relativi alla licenza (come license.txt , notice.txt ecc.) Da gradle nel mio progetto per essere conforme alle licenze ( dettagli tecnici: i testi delle licenze verranno concatenati)?


2
Da un punto di vista tecnico, non puoi impacchettare le cose in modo che tutti i file "da includere" di ciascuna libreria siano nella loro directory? Un'alternativa che ho visto con alcune app è che tu combini (manualmente) tutti i rispettivi file di licenza / avviso in una risorsa e includa / visualizzi questo (dove due o più librerie condividono la stessa versione della licenza, dovresti essere in grado di raggrupparle , "La Libreria A e la Libreria B sono incluse soggette alla seguente licenza: ...").
TripeHound

@TripeHound questo è ciò che attualmente faccio come soluzione alternativa, mentre nel processo di sviluppo li escludo e quando si tratta di rilasciare: commenta tutti gli "esclusi" e risolvo le licenze manualmente.
Flowryn

1
cercando la risposta "packagingOptions - exclude" merita un voto positivo
Ahmed Adel Ismail

Risposte:


47

C'è una soluzione se hai una sola licenza usando il nome license.txt(leggi: tutte le license.txtcopie sono identiche):

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

In caso contrario, Google ha anche rilasciato un plug-in Gradle per gestire le licenze delle dipendenze. Vedi qui . Non l'ho provato, ma sembra che sia in grado di aggregare ogni dipendenza e persino di generare un'attività che mostra tutte quelle licenze.


1
Al momento ho 2 licenze, una è di Apache 2.0 e l'altra GPL 3.0. La mia soluzione attuale è escluderli durante la fase di sviluppo e includerli manualmente al momento del rilascio. Tutto il file license.txt verrà concatenato. Lo stesso per notice.txt Comunque mi piace il tuo approccio con pickFirst nel caso in cui la licenza sia identica!
Flowryn

3
Se mai trovi un modo per concatenare automaticamente le licenze, sono tutto orecchie!
Marc Plano-Lesay

Questo è ciò su cui sto indagando ora. Per prima cosa ho bisogno di scoprire cosa (e come) sta facendo il gradle task che ha generato il conflitto (per questo ho posto questa domanda: stackoverflow.com/questions/34287701/… ) E poi sostituirlo
Flowryn

@Flowryn come includi manualmente tutti i notice.txt, copiali semplicemente in un avviso.txt? non è possibile modificarlo che nel jarfile
chinaanihchen

dici che il problema è nelle librerie in uso ... nel mio caso, sono responsabile della creazione delle librerie che sto usando .. cosa potrei fare di sbagliato quando le creo? Grazie
Eric

32

Aggiungi il seguito nel rispettivo file build.gradle

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'
    }

1
Ciò esclude le licenze che, per la maggior parte di esse, è esplicitamente contraria alle loro condizioni.
Marc Plano-Lesay

1
Questo dovrebbe essere nella chiusura {} di Android per le versioni correnti (2. *) di Gradle
mijiturka,

4

Ho riscontrato lo stesso problema con la mia domanda. Devi assicurarti di non aver aggiunto nessuna libreria due volte. Se hai seguito la documentazione di Firebase https://firebase.google.com/docs/android/setup

Quindi non dovresti aggiungere la libreria Firebase all'interno di Android Studio, ovvero file-> struttura del progetto-> cloud-> Firebase

Devi fare solo uno di entrambi, per usare Firebase nella tua applicazione Android.

Alla fine pulisci e riavvia la tua app.


2
Se usi jackson-databind ottieni il problema quando lo aggiungi una volta.
L'incredibile


0

Penso che tu debba includere solo queste opzioni in build.gradle:

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'
    }
}

-2

Sicuramente funzionerà

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

1
No, non lo farà: questo esclude le licenze. È illegale secondo i suddetti termini di licenza.
Marc Plano-Lesay

No, è una soluzione tmp per la compilazione istantanea di un progetto
Mahendran Candy

1
Qualunque sia l'utilizzo, leggi le licenze: per la grande maggioranza di esse, ciò che stai ottenendo con la tua regola di esclusione è illegale.
Marc Plano-Lesay
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.