web-dev-qa-db-fra.com

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

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

Si la bibliothèque contient 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 y a plus d'une bibliothèque. Quand je fais la construction avec gradle ou avec Android Studio , j’obtiens le 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 fichier license.txt (notice.txt ou d'autres fichiers pouvant interférer de la sorte) en ajoutant au fichier build.gradle:

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 en double 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 gradure dans mon projet afin de se conformer aux licences ( détail technique: les licences seront concaténées)?

91
Flowryn

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

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

Sinon, Google a également publié un plugin Gradle pour gérer les licences de dépendances. Voir 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.

47
Marc Plano-Lesay

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'
    }
32
Max Droid

J'ai rencontré le même problème avec ma demande. 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 devez pas ajouter de bibliothèque firebase dans Android studio i.e. fichier-> structure de projet-> cloud-> firebase

Vous devez faire l’un des deux à la fois, pour utiliser firebase dans votre application Android.

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

4
aMighty

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'
    }
}
0
S.sadham hussain

Vous pouvez ajouter plusieurs licences dans Gradle voir ceci

0
Akhil Jayakumar