Plugin Android Gradle 0.7.0: «fichiers en double lors de l'empaquetage d'APK»

324

Utilisation du plugin Android Gradle 0.7.0 avec les éléments suivants build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.7.0'
    }
}

apply plugin: 'android'

repositories {
    maven { url "https://android-rome-feed-reader.googlecode.com/svn/maven2/releases" }
    maven { url "http://dl.bintray.com/populov/maven" }
    mavenCentral()
}

android {
    compileSdkVersion 19
    buildToolsVersion '18.1.1'

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 19
    }
    buildTypes {
        release {
            runProguard true
            proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
        }
    }
    productFlavors {
        defaultFlavor {
            proguardFile 'proguard-rules.txt'
        }
    }
    sourceSets {
        instrumentTest.setRoot('src/instrumentTest')
    }
}

configurations {
    apt
}

ext.androidAnnotationsVersion = '2.7.1';

dependencies {
    compile 'com.android.support:support-v4:18.0.0'

    compile 'com.viewpagerindicator:library:2.4.1@aar'

    compile 'com.google.code.android-rome-feed-reader:android-rome-feed-reader:1.0.0-r2'
    compile 'org.jdom:jdom:1.1.1-android-fork'

    apt "com.googlecode.androidannotations:androidannotations:${androidAnnotationsVersion}"
    compile "com.googlecode.androidannotations:androidannotations-api:${androidAnnotationsVersion}"

    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.j256.ormlite:ormlite-android:4.47'
    compile 'com.j256.ormlite:ormlite-core:4.47'
    compile 'org.springframework.android:spring-android-core:1.0.1.RELEASE'
    compile 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE'
    compile 'com.prolificinteractive:actionbarsherlock:4.3.1@aar'

    compile 'com.google.code.geocoder-java:geocoder-java:0.15'

    compile files('libs/CWAC-Pager.jar')
}

android.applicationVariants.all { variant ->
    aptOutput = file("${project.buildDir}/source/apt_generated/${variant.dirName}")
    println "****************************"
    println "variant: ${variant.name}"
    println "manifest:  ${variant.processResources.manifestFile}"
    println "aptOutput:  ${aptOutput}"
    println "****************************"

    variant.javaCompile.doFirst {
        println "*** compile doFirst ${variant.name}"
        aptOutput.mkdirs()
        variant.javaCompile.options.compilerArgs += [
                '-processorpath', configurations.apt.getAsPath(),
                '-AandroidManifestFile=' + variant.processResources.manifestFile,
                '-s', aptOutput
        ]
    }
}

donne l'erreur Duplicate files copied in APK META-INF/LICENSE.txt:

WARNING: Dependency commons-logging:commons-logging:1.0.4 is ignored for defaultFlavorDebug as it may be conflicting with the internal version provided by Android.
         In case of problem, please repackage it with jarjar to change the class packages
WARNING: Dependency commons-logging:commons-logging:1.0.4 is ignored for defaultFlavorRelease as it may be conflicting with the internal version provided by Android.
         In case of problem, please repackage it with jarjar to change the class packages
Creating properties on demand (a.k.a. dynamic properties) has been deprecated and is scheduled to be removed in Gradle 2.0. Please read http://gradle.org/docs/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html for information on the replacement for dynamic properties.
Deprecated dynamic property: "aptOutput" on "com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@5705013c", value: "/Users/david/Developer...".
****************************
variant: defaultFlavorDebug
manifest:  /Users/david/Developer/.../build/manifests/defaultFlavor/debug/AndroidManifest.xml
aptOutput:  /Users/david/Developer/.../build/source/apt_generated/defaultFlavor/debug
****************************
Deprecated dynamic property "aptOutput" created in multiple locations.
****************************
variant: defaultFlavorRelease
manifest:  /Users/david/Developer/.../build/manifests/defaultFlavor/release/AndroidManifest.xml
aptOutput:  /Users/david/Developer/.../build/source/apt_generated/defaultFlavor/release
****************************
:TravelGuard:compileDefaultFlavorDebugNdk UP-TO-DATE
:TravelGuard:preBuild UP-TO-DATE
:TravelGuard:preDefaultFlavorDebugBuild UP-TO-DATE
:TravelGuard:preDefaultFlavorReleaseBuild UP-TO-DATE
:TravelGuard:prepareComProlificinteractiveActionbarsherlock431Library UP-TO-DATE
:TravelGuard:prepareComViewpagerindicatorLibrary241Library UP-TO-DATE
:TravelGuard:prepareDefaultFlavorDebugDependencies
:TravelGuard:compileDefaultFlavorDebugAidl UP-TO-DATE
:TravelGuard:compileDefaultFlavorDebugRenderscript UP-TO-DATE
:TravelGuard:generateDefaultFlavorDebugBuildConfig UP-TO-DATE
:TravelGuard:mergeDefaultFlavorDebugAssets UP-TO-DATE
:TravelGuard:mergeDefaultFlavorDebugResources UP-TO-DATE
:TravelGuard:processDefaultFlavorDebugManifest UP-TO-DATE
:TravelGuard:processDefaultFlavorDebugResources UP-TO-DATE
:TravelGuard:generateDefaultFlavorDebugSources UP-TO-DATE
:TravelGuard:compileDefaultFlavorDebugJava
*** compile doFirst defaultFlavorDebug
/Users/david/Developer/.../src/main/java/com/travelguard/service/TravelGuardService.java:53: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.service.TravelGuardService
    TravelGuardPrefs_ travelGuardPrefs;
    ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CategoriesActivity.java:14: cannot find symbol
symbol  : class AssistanceFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.AssistanceFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CategoriesActivity.java:16: cannot find symbol
symbol  : class CategoryFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.CategoryFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CategoriesActivity.java:17: cannot find symbol
symbol  : class ContactFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.ContactFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CountriesActivity.java:25: cannot find symbol
symbol  : class TravelGuardPrefs_
location: package com.travelguard.service
import com.travelguard.service.TravelGuardPrefs_;
                              ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CountriesActivity.java:44: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.ui.CountriesActivity
    TravelGuardPrefs_ travelGuardPrefs;
    ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/InstructionsActivity.java:18: cannot find symbol
symbol  : class AssistanceFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.AssistanceFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/InstructionsActivity.java:19: cannot find symbol
symbol  : class ContactFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.ContactFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/InstructionsActivity.java:21: cannot find symbol
symbol  : class InstructionsFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.InstructionsFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:36: cannot find symbol
symbol  : class TravelGuardPrefs_
location: package com.travelguard.service
import com.travelguard.service.TravelGuardPrefs_;
                              ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:40: cannot find symbol
symbol  : class AssistanceFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.AssistanceFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:41: cannot find symbol
symbol  : class ContactFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.ContactFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:55: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.ui.MainActivity
    TravelGuardPrefs_ travelGuardPrefs;
    ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/TermsActivity.java:17: cannot find symbol
symbol  : class TravelGuardPrefs_
location: package com.travelguard.service
import com.travelguard.service.TravelGuardPrefs_;
                              ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/TermsActivity.java:23: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.ui.TermsActivity
    TravelGuardPrefs_ travelGuardPrefs;
    ^
Note: Starting AndroidAnnotations annotation processing
Note: AndroidManifest.xml file found: /Users/david/Developer/.../build/manifests/defaultFlavor/debug/AndroidManifest.xml
Note: Number of files generated by AndroidAnnotations: 22
Note: Generating source file: com.travelguard.service.SmartTravellerService_
Note: Generating source file: com.travelguard.service.SmartTravellerWebservice_
Note: Generating source file: com.travelguard.service.TravelGuardPrefs_
Note: Generating source file: com.travelguard.service.TravelGuardService_
Note: Generating source file: com.travelguard.service.TravelGuardWebservice_
Note: Generating source file: com.travelguard.ui.AdviceActivity_
Note: Generating source file: com.travelguard.ui.CategoriesActivity_
Note: Generating source file: com.travelguard.ui.ContactDetailActivity_
Note: Generating source file: com.travelguard.ui.ContactListActivity_
Note: Generating source file: com.travelguard.ui.ContactTravelGuardActivity_
Note: Generating source file: com.travelguard.ui.CountriesActivity_
Note: Generating source file: com.travelguard.ui.InformationActivity_
Note: Generating source file: com.travelguard.ui.InstructionsActivity_
Note: Generating source file: com.travelguard.ui.MainActivity_
Note: Generating source file: com.travelguard.ui.TermsActivity_
Note: Generating source file: com.travelguard.ui.TravelGuardActivity_
Note: Generating source file: com.travelguard.ui.fragments.AdviceDetailFragment_
Note: Generating source file: com.travelguard.ui.fragments.AdviceFragment_
Note: Generating source file: com.travelguard.ui.fragments.AssistanceFragment_
Note: Generating source file: com.travelguard.ui.fragments.CategoryFragment_
Note: Generating source file: com.travelguard.ui.fragments.ContactFragment_
Note: Generating source file: com.travelguard.ui.fragments.InstructionsFragment_
Note: Time measurements: [Whole Processing = 913 ms], [Generate Sources = 358 ms], [Extract Manifest = 163 ms], [Process Annotations = 158 ms], [Extract Annotations = 120 ms], [Validate Annotations = 82 ms], [Find R Classes = 28 ms],
Note: Time measurements: [Whole Processing = 0 ms],
Note: Time measurements: [Whole Processing = 0 ms],
warning: The following options were not recognized by any processor: '[androidManifestFile]'
Note: /Users/david/Developer/.../src/main/java/com/travelguard/ui/ContactDetailActivity.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: /Users/david/Developer/.../src/main/java/com/travelguard/service/SmartTravellerService.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
:TravelGuard:preDexDefaultFlavorDebug UP-TO-DATE
:TravelGuard:dexDefaultFlavorDebug
:TravelGuard:processDefaultFlavorDebugJavaRes UP-TO-DATE
:TravelGuard:validateDebugSigning
:TravelGuard:packageDefaultFlavorDebug
Error: duplicate files during packaging of APK /Users/david/Developer/.../build/apk/TravelGuard-defaultFlavor-debug-unaligned.apk
    Path in archive: META-INF/LICENSE.txt
    Origin 1: /Users/david/.gradle/caches/modules-2/files-2.1/commons-httpclient/commons-httpclient/3.1/964cd74171f427720480efdec40a7c7f6e58426a/commons-httpclient-3.1.jar
    Origin 2: /Users/david/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.2/397f4731a9f9b6eb1907e224911c77ea3aa27a8b/commons-codec-1.2.jar
:TravelGuard:packageDefaultFlavorDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':TravelGuard:packageDefaultFlavorDebug'.
> Duplicate files copied in APK META-INF/LICENSE.txt
    File 1: /Users/david/.gradle/caches/modules-2/files-2.1/commons-httpclient/commons-httpclient/3.1/964cd74171f427720480efdec40a7c7f6e58426a/commons-httpclient-3.1.jar
    File 2: /Users/david/.gradle/caches/modules-2/files-2.1/commons-httpclient/commons-httpclient/3.1/964cd74171f427720480efdec40a7c7f6e58426a/commons-httpclient-3.1.jar


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 21.957 secs

Les choses fonctionnaient bien ce matin avant de mettre à jour Android Studio. Des idées?

EDIT: j'ai pu le corriger temporairement en exécutant des commandes comme

zip -d spring-android-core-1.0.1.RELEASE.jar META-INF/notice.txt

jusqu'à ce que toutes les erreurs en double aient disparu.

David Lawson
la source
2
Il semble s'agir du code bogue.google.com/p/android/issues/detail?id=61573 . Je ne sais pas pourquoi cela a commencé à être gênant pour vous dans cette version.
Scott Barta
coincé avec le même problème. Décidé de rester sur Android Studio 0.3.7 et le plugin Gradle 0.6.3 jusqu'à ce que le bug soit résolu
mente
6
Vous devriez être clair de vos mots: vous n'utilisez pas Gradle 0.7.0 - c'est le plugin Android Gradle. Qui utilise gradle (avec wrapper) dans la version 1.9.0. Une formulation incorrecte sera source de confusion - en plus du contexte donné.
onigunn
1
Veuillez noter l' pickFirstoption disponible depuis Gradle 0.9.1 .
JJD du

Réponses:

475

À partir de la version 0.8.14 d'Android Studio

Vous devez ajouter:

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

à ton build.gradle dossier.

L'histoire:

Selon le commentaire 14 de ce bug: https://issuetracker.google.com/issues/36982149#comment14 il s'agit d'un bogue dans la version 0.7.0 du plug-in Android Gradle, et devrait être corrigé bientôt dans la version 0.7.1.

Voici les notes de ce bug sur l'ajout de 0.7.1:

0.7.1 est sorti avec le correctif pour cela.

La DSL pour exclure des fichiers est:

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

Vous pouvez ajouter autant d'instructions d'exclusion que vous le souhaitez. La valeur est le chemin d'archivage. Pas encore de support générique ou global.

Les noms de fichiers "LICENSE.txt" et "NOTICE.txt" sont sensibles à la casse. Veuillez également essayer avec "license.txt" et "notice.txt".

Scott Barta
la source
12
Merci! J'ai également dû exclure 'META-INF / NOTICE.txt';)
Climbatize
71
Jour après jour, je suis étonné de voir comment les programmeurs auraient pu être productifs à distance avant l'arrivée de stackoverflow. Merci pour le correctif! J'ai dû exclure META-INF / LICENSE et / NOTICE à la place. (Pas de txt, même sur le dernier gradle.)
domenukk
3
Quel fichier dois-je modifier et où le trouver? merci, Eyal.
eyal
2
@ um.anusorn Sean vous a donné un bon exemple de fichier gradle qui exclut ces fichiers des bibliothèques lors de l'empaquetage. Voici ce que j'ai dans le mien: packagingOptions {exclure 'META-INF / LICENSE' exclure 'META-INF / NOTICE' exclure 'META-INF / DEPENDENCIES' exclure 'META-INF / license.txt' exclure 'META-INF / dependenices.txt 'exclure' META-INF / notice.txt '}
praneetloke
4
Bogue toujours répandu dans la v0.12 des outils construits. Juste en disant
Nilzor
149

Dans mon cas, j'ai dû inclure plusieurs exclusions supplémentaires. Il semble qu'il n'aime pas les expressions régulières, ce qui en aurait fait une belle doublure.

android {
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/LGPL2.1'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/notice.txt'
    }
}
vincentjames501
la source
J'avais seulement besoin LICENSEet NOTICEaprès avoir ajouté commons-lang3.
theblang
Celui-ci m'a aidé (j'ai le modèle AndroidAnnotations + Spring REST). Avec devoir ajouter de tels hacks, ce produit IntelliJ commence terriblement à ressembler à Eclipse ...
javaxian
Je ne sais pas lequel affecte, mais c'est vraiment utile.
CopperCash
Ne fonctionne pas pour moi, affiche toujours Avertissement: Dépendance org.apache.httpcomponents: httpclient: 4.3 est ignoré pour le débogage car il peut être en conflit avec la version interne fournie par Android. En cas de problème, veuillez le reconditionner avec jarjar pour changer les packages de classe
VVB
46
packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
}
user3121011
la source
4
J'avais besoin du .txtsuffixe.
theblang
1
Quelque chose que je fais vient de me ramener ici, et je n'avais pas besoin du .txtsuffixe. Donc je suppose que YMMV (ou MMMV selon la période de l'année).
theblang
31

Jetez un œil au commentaire de Sakiboy !


Réponse obsolète

À partir de Gradle 0.9.1, les éléments suivants sont pris en charge:

android.packagingOptions {
    pickFirst 'META-INF/LICENSE.txt'
}

Plus d'informations dans les notes de version de Gradle .

JJD
la source
3
Il s'agit d'une meilleure solution car les développeurs ont l'obligation d'inclure ces fichiers lorsqu'ils utilisent un logiciel open source.
Louth du
1
Belle option, mais ce commentaire est totalement faux. Seule la licence de la première bibliothèque sera incluse, tout le reste sera laissé de côté.
Igor Čordaš
1
ceci est utile si 2 bibliothèques utilisent les mêmes fichiers .so
Fabian
Puis-je l'utiliser pour deux fichiers JAR contenant le même fichier .class? J'ai deux fichiers JAR inclus qui contiennent tous les deux org / xmlpull / v1 / XmlPullParser.class
WillC
2
@PSIXO, vous pouvez voir la réponse ci-dessous si vous souhaitez inclure TOUTES les licences: stackoverflow.com/a/47828425/2371425
Sakiboy
12

Le même problème lorsque j'exporte la bibliothèque httclient-4.3.5 dans Android Studio 0.8.6 j'ai besoin d'inclure ceci:

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

Le fichier zip de la bibliothèque contient le pot suivant:

commons-codec-1.6.jar
commons-logging-1.1.3.jar
fluent-hc-4.3.5.jar
httpclient-4.3.5.jar
httpclient-cache-4.3.5.jar
httpcore-4.3.2.jar
httpmime-4.3.5.jar
ferdiado
la source
8

Ce bug existe toujours en 0.8 + / 1.10

Avec Jackson

compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.2.2'

J'ai dû inclure ainsi que la suggestion ci-dessus avant de compiler

exclude 'META-INF/services/com.fasterxml.jackson.core.JsonFactory'
Ryan Heitner
la source
comment exclure «META-INF / services / com.fasterxml.jackson.core.JsonFactory». Quel fichier dois-je modifier?
UmAnusorn
6

C'est plus d'une erreur

Sous apply plugin: 'android-library'

Ajoute ça ::

android {
    packagingOptions {
        exclude 'META-INF/ASL2.0'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }
}

En cas de fichiers en double, c'est facile, regardez à l'intérieur du JARsous le META-INFrépertoire et voyez ce qui cause l'erreur. Cela pourrait être multiple. Dans mon cas, le plugin Couchbase Lite. Lorsque vous ajoutez plus de plugins, vous aurez besoin de plus d'exceptions

Pian0_M4n
la source
Question stupide: où est ce fichier JAR?
WillC
Dans Android Studio, exécuter Gradle avec le --info drapeau m'a permis de voir le journal des classes ajoutées à l'apk, et je pouvais ensuite rechercher vers le haut pour trouver l'entrée de journal pour la même classe ajoutée à partir d'un autre JAR. Cela m'a également montré le chemin d'accès aux deux fichiers JAR. Je ne pouvais pas trouver un bon moyen de choisir un fichier .class par rapport à l'autre, j'ai donc modifié l'un des fichiers JAR et supprimé le fichier .class en double
WillC
4

Le même problème lorsque j'ai utilisé 'org.springframework.android:spring-android-rest-template:2.0.0.M1' dans Android Studio 1.0.1. J'ai besoin de l'inclure dansbuild.gradle

android{
...
    packagingOptions{
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
    }
...
}
saneryee
la source
3

Cela fonctionne pour moi:

android {
   packagingOptions {
       exclude 'LICENSE.txt'
   }
}
Sestertius
la source
3

Je pense que vous devez inclure uniquement ces options dans build.gradle :

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

ps même réponse de mon message dans: Erreur :: fichiers en double lors de l'empaquetage de l'APK

Gent Berani
la source
2

Le problème est que le dossier META-INF ne sera pas filtré, donc plusieurs entrées de NOTICEouLICENSE provoquer des doublons lors de la construction et il est tenté de les copier ensemble.

Correction rapide sale:

Ouvrez le .jarfichier dans votre .gradle/caches/...dossier (avec un outil compatible zip) et supprimez ou renommez les fichiers dans le META-INFdossier qui provoquent l'erreur (généralement NOTICEou LICENSE). (Je sais que c'est aussi dans l'OP, mais pour moi, ce n'était pas vraiment clair avant d'avoir lu le forum google)

ÉDITER:

Cela a été corrigé dans 0.7.1. Ajoutez simplement les fichiers de configuration à exclure.

android {
    packagingOptions {
        exclude 'META-INF/LICENSE'
    }
}
Patrick Favre
la source
Oh désolé, je le comprends maintenant.
UmAnusorn
Peut-être la pire réponse possible: la modification des bocaux dans le cache Gradle peut changer leur somme de contrôle, et en conséquence ne fonctionnera pas longtemps ... d'ailleurs, ce ne sont pas vos bocaux
Riduidel
Oui, c'est pourquoi il est écrit "Dirty Quick Fix" en gras. De plus, la bonne solution n'est qu'à un paragraphe. Vous vous rendez compte que cela a été écrit à une époque où il n'y avait pas de solution propre, mais les gens avaient encore besoin de compiler leurs applications.
Patrick Favre
2

Même chose ici avec

dependencies {
    compile 'org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:1.0.0'
}

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

J'ai perdu environ 2 jours pour cette erreur bizarre ... Pourquoi cela se produit-il toujours dans le niveau 1.0.0? C'est très inquiétant pour les débutants ... Quoi qu'il en soit, merci pour ces informations, je pensais que c'était sur mon code :)

clément francomme
la source
2

Important de savoir dans quel fichier il s'agit de cette erreur (dans votre exemple c'est META-INF / LICENSE.txt), dans mon cas c'était dans META-INF / LICENSE [sans ".txt"], puis dans le fichier META-INF / ASL2.0, j'ai donc ajouté à mon build.gradle ces lignes:

android {
    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/ASL2.0'
    }
}

Très important (!) -> ajoutez le nom du fichier dans le même style, que vous le voyez dans le message d'erreur: le texte est sensible à la casse, et il y a une différence entre * .txt et * (sans "txt") .

Alexander Logvinenko
la source
2

Si vous voulez faire votre part en tant que développeur, en utilisant des bibliothèques open source, vous devriez essayer d'inclure toutes ces licences open source dans votre apk. Pour ce faire, vous pouvez utiliser la méthode de fusion dans votre packagingOptions.

Exemple:

packagingOptions {
        // This will get include every license and notice regardless of what dir it’s in.
        merge '**/LICENSE.txt'
        merge '**/NOTICE.txt'
        merge '**/notice.txt'
        merge '**/license.txt'
        merge '**/NOTICE'
        merge '**/LICENSE'
        merge '**/notice'
        merge '**/license'
        merge '**/LGPL2.1'
        // This will exclude any README files, regardless of the dir or the file type.
        exclude '**/README.*'
}

Cette réponse est mieux que d' utiliser pickFirstparce que cette méthode ne sélectionne que la première licence qu'elle trouve et ignore tous les autres, la rendant un peu inutile dans ce cas.

Donc, en bref, utilisez le merge méthode pour inclure toutes ces licences à partir des bibliothèques open source kickass que vous avez utilisées.

Plus d'informations sur Gradle PackagingOptions .

Sakiboy
la source
2

J'ai remarqué ce commentaire de commit dans AOSP, la solution sera d'exclure certains fichiers en utilisant DSL. Probablement lorsque 0.7.1 est publié.

commit e7669b24c1f23ba457fdee614ef7161b33feee69
Author: Xavier Ducrohet <--->
Date:   Thu Dec 19 10:21:04 2013 -0800

    Add DSL to exclude some files from packaging.

    This only applies to files coming from jar dependencies.
    The DSL is:

    android {
      packagingOptions {
        exclude 'META-INF/LICENSE.txt'
      }
    }
Maxime
la source
ouais et ils ont juste écrit les notes de version sur le site de construction, donc j'espère qu'ils vont bientôt télécharger l'artefact sur maven central afin que nous puissions l'utiliser!
Matt Wolfe
1

Dans mon cas, je n'ai qu'à ajouter au fichier build.gradle du projet:

android {
  packagingOptions {
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license.txt'
  }

   ...
}
K. Stopa
la source
0

Dans Android Studio 1.1.0, j'avais besoin de noms en minuscules:

packagingOptions{
      exclude 'META-INF/license.txt'
      exclude 'META-INF/notice.txt'
}
kandroidj
la source
0

Les fichiers "LICENSE.txt" et "NOTICE.txt" sont sensibles à la casse. Donc, pour la bibliothèque Android SPring, j'ai dû ajouter

android {
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/notice.txt'
    }
}
Igor Vuković
la source
0

Supprimer .txt après que LICENSE a supprimé mon erreur:

packagingOptions {
    exclude 'META-INF/LICENSE'
}
JSONParser
la source
0
  packagingOptions {
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/dependencies.txt'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/LGPL2.1'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/notice.txt'
}
alias26
la source