Comment résoudre les "fichiers en double copiés dans l'APK META-INF / *"

91

Je travaille sur une application Android commerciale. J'utilise également certaines bibliothèques sous licence sous différents types de licence, certaines indiquant ce qui suit:

Si la bibliothèque a un fichier "NOTICE" avec des notes d'attribution, vous devez inclure cet AVIS lors de la distribution

(L'un d'eux est sous licence Apache License 2.0 par exemple).

Il existe plusieurs bibliothèques. Lorsque je fais la construction avec gradle ou avec Android Studio, j'obtiens l'erreur de construction suivante:

* 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

Les réponses que j'ai trouvées jusqu'à présent sur Internet et stackoverflow suggèrent de supprimer le license.txt (notice.txt ou d'autres fichiers qui pourraient interférer comme ça) de l'empaquetage en ajoutant au build.gradlefichier ce qui suit:

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

Voir par exemple: Android Studio 0.4 Fichiers dupliqués copiés dans APK META-INF / LICENSE.txt

Selon la licence de ces bibliothèques ( Apache License 2.0 par exemple), les fichiers de licence et d'avis doivent être inclus .

Ma question: Comment puis-je ajouter plusieurs fichiers liés aux licences (tels que license.txt , notice.txt etc) de gradle dans mon projet afin d'être conforme aux licences ( détail technique: les textes des licences seront concaténés)?

Flowryn
la source
2
À partir d'un PDV technique, ne pouvez-vous pas empaqueter les choses de sorte que tous les fichiers "à inclure" de chaque bibliothèque se trouvent dans leur propre répertoire? Une alternative que j'ai vue avec certaines applications est pour vous de combiner (manuellement) tous les fichiers de licence / avis respectifs en une seule ressource et d'inclure / d'afficher ceci (lorsque deux bibliothèques ou plus partagent la même version de licence, vous devriez pouvoir les regrouper , "La bibliothèque A et la bibliothèque B sont incluses sous réserve de la licence suivante: ...").
TripeHound
@TripeHound c'est ce que je fais actuellement comme solution de contournement, tandis que dans le processus de développement, je les exclue et quand il s'agit de la publication: commentez tous les `` exclut '' et résolvez les licences manuellement.
Flowryn
1
la recherche de la réponse "packagingOptions - exclude" mérite un vote favorable
Ahmed Adel Ismail

Réponses:

47

Il existe une solution si vous n'avez qu'une seule licence utilisant le nom license.txt(lire: toutes les license.txtcopies sont identiques):

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

Sinon, Google a également publié un plugin Gradle pour gérer les licences de dépendances. Regardez ici . Je ne l'ai pas essayé, mais il semble qu'il soit capable d'agréger toutes les dépendances, et même de générer une activité affichant toutes ces licences.

Marc Plano-Lesay
la source
1
J'ai 2 licences en ce moment, l'une vient d'Apache 2.0 et l'autre GPL 3.0. Ma solution actuelle consiste à les exclure pendant la phase de développement et à les inclure manuellement lors de la publication. Tous les license.txt seront concaténés. Pareil pour notice.txt En tout cas j'aime bien votre approche avec pickFirst au cas où la licence serait identique!
Flowryn
3
Si jamais vous trouvez un moyen de concaténer automatiquement les licences, je suis toute oreille!
Marc Plano-Lesay
C'est ce sur quoi j'enquête actuellement. Je dois d'abord savoir ce que fait (et comment) la tâche gradle qui a généré le conflit (pour cela, j'ai posé cette question: stackoverflow.com/questions/34287701/… ) Et puis le remplacer
Flowryn
@Flowryn comment vous incluez manuellement tous les notice.txt, copiez-les simplement dans un notice.txt? ne peut pas le modifier qui dans le jarfichier
chinaanihchen
vous mentionnez que le problème est dans les bibliothèques utilisées ... dans mon cas, je suis responsable de la création des bibliothèques que j'utilise ... qu'est-ce que je pourrais faire de mal lorsque je les crée? Merci
Eric
32

Ajouter ce qui suit dans le fichier build.gradle respectif

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
la source
1
Cela exclut les licences qui, pour la plupart d'entre elles, sont explicitement contraires à leurs conditions.
Marc Plano-Lesay
1
Cela devrait être dans la fermeture Android {} pour les versions actuelles (2. *) de Gradle
mijiturka
4

J'ai rencontré le même problème avec ma candidature. Vous devez vous assurer que vous n'avez ajouté aucune bibliothèque deux fois. Si vous avez suivi la documentation de Firebase https://firebase.google.com/docs/android/setup

Ensuite, vous ne devriez pas ajouter de bibliothèque Firebase à l'intérieur d'Android Studio ie fichier-> structure du projet-> cloud-> firebase

Vous devez faire un seul des deux, pour utiliser Firebase dans votre application Android.

À la fin, nettoyez et réexécutez votre application.

aMighty
la source
2
Si vous utilisez jackson-databind, vous obtenez le problème lorsque vous l'ajoutez une fois.
L'incroyable janvier
0

Vous pouvez ajouter plusieurs licences dans gradle voir ceci

Akhil Jayakumar
la source
0

Je pense que vous devez inclure uniquement ces options dans 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'
    }
}
S.sadham Hussain
la source
-2

Cela fonctionnera sûrement

packagingOptions {
 exclude 'META-INF/LICENSE.txt'
 exclude 'META-INF/NOTICE.txt'   }
Bonbons Mahendran
la source
1
Non, ce ne sera pas le cas: cela exclut les licences. C'est illégal selon les termes des licences.
Marc Plano-Lesay
Non, c'est une solution tmp pour la compilation instantanée d'un projet
Mahendran Candy
1
Quelle que soit l'utilisation, lisez les licences: pour une grande majorité d'entre elles, ce que vous réalisez avec votre règle d'exclusion est illégal.
Marc Plano-Lesay