web-dev-qa-db-fra.com

Android Gradle plugin 0.7.0: "fichiers en double lors de l'emballage de l'APK"

Utilisation du plugin Android Gradle 0.7.0 avec le build.gradle suivant:

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 que je mette à jour Android Studio. Des idées?

EDIT: J'ai pu résoudre temporairement le problème en exécutant des commandes telles que

Zip -d spring-Android-core-1.0.1.RELEASE.jar META-INF/notice.txt

jusqu'à ce que toutes les erreurs de duplication soient parties.

316
David Lawson

À partir d'Android Studio version 0.8.14

Vous devriez ajouter:

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

dans votre fichier build.gradle.

L'histoire:

Selon le commentaire 14 de ce bogue: https://issuetracker.google.com/issues/36982149#comment14 il s'agit d'un bogue de la version 0.7.0 du plug-in Android Gradle, qui doit être corrigé prochainement dans la version 0.7 .1.

Voici les notes de ce bogue concernant l'ajout de la version 0.7.1:

0.7.1 est sorti avec le correctif pour cela.

Le DSL pour exclure des fichiers est:

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

Vous pouvez en ajouter autant que vous le souhaitez. La valeur est le chemin d'archive. Pas de support générique ou global pour le moment.

Les noms de fichier "LICENSE.txt" et "NOTICE.txt" sont sensibles à la casse. Essayez également avec "license.txt" et "notice.txt".

472
Scott Barta

Dans mon cas, j'ai dû inclure plusieurs exclusions supplémentaires. Il semble que cela n’aime pas les expressions régulières qui en auraient fait un joli one-line.

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'
    }
}
149
vincentjames501
packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
}
46
user3121011

Jetez un coup d'œil au commentaire de Sakiboy !


Réponse obsolète

À partir de la version 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 publication de Gradle .

31
JJD

Le même problème lorsque j'exporte la bibliothèque httpclient-4.3.5 dans Android Studio 0.8.6

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

La bibliothèque Zip contenu le prochain pot:

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
12
ferdiado

Ce bug existe toujours dans 0.8 +/1.10 

Avec Jackson

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

Je devais inclure ainsi que la suggestion ci-dessus avant de compiler 

exclude 'META-INF/services/com.fasterxml.jackson.core.JsonFactory'
8
Ryan Heitner

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, rien de plus simple, regardez à l'intérieur de la JAR sous le répertoire META-INF et voyez la cause de l'erreur. Cela pourrait être multiple. Dans mon cas, le plugin Couchbase Lite . Au fur et à mesure que vous ajoutez des plugins, vous aurez besoin de plus d'exceptions

6
Pian0_M4n

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 d'inclure ceci dans build.gradle

Android{
...
    packagingOptions{
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
    }
...
}
4
saneryee

Cela fonctionne pour moi:

Android {
   packagingOptions {
       exclude 'LICENSE.txt'
   }
}
3
Sestertius

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

p.sr ​​même réponse de mon message dans: Erreur :: fichiers en double lors du conditionnement de APK

3
Gent Berani

Important de savoir dans quel fichier il s'agit de cette erreur (dans votre exemple, il s'agit de META-INF/LICENSE.txt), dans mon cas, c'était dans META-INF/LICENSE [sans ".txt"], puis dans le fichier META-INF/ASL2.0 alors j'ai 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") . 

2

Même 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 étrange ... Pourquoi cela se produit-il toujours dans la version 1.0.0? C'est très dérangeant pour les débutants ......... En tout cas, merci pour cette info, je pensais que c'était sur mon code :)

2
clément francomme

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

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

Le problème est que le dossier META-INF ne sera pas filtré. Par conséquent, plusieurs entrées de NOTICE ou LICENSE provoquent des doublons lors de la construction et il est essayé de les copier ensemble.

Sale Quick Fix:

Ouvrez le fichier .jar dans votre dossier .gradle/caches/... (avec un outil compatible Zip) et supprimez ou renommez les fichiers dans le dossier META-INF à l'origine de l'erreur (usally NOTICE ou 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 de Google)

MODIFIER:

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

Android {
    packagingOptions {
        exclude 'META-INF/LICENSE'
    }
}
2
patrickf

Si vous voulez faire votre part en tant que développeur, en utilisant des bibliothèques open source, essayez d’inclure toutes ces licences open source dans votre apk. Pour ce faire, vous pouvez utiliser la méthode merge 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 vaut mieux que d'utiliser pickFirst car cette méthode seulement sélectionne la première licence trouvée et ignore tout le reste, ce qui la rend un peu inutile dans ce cas.

En bref, utilisez la méthode merge pour inclure toutes les licences de ces bibliothèques open source kickass que vous avez utilisées.

Plus d'infos sur GradlePackagingOptions .

2
Sakiboy

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

   ...
}
1
K. Stopa
  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'
}
0
alias26

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

packagingOptions {
    exclude 'META-INF/LICENSE'
}
0
JSONParser

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

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

Les fichiers "LICENSE.txt" et "NOTICE.txt" sont sensibles à la casse. Donc, pour la bibliothèque Android SPring, je devais ajouter 

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