web-dev-qa-db-fra.com

Erreur Android Studio Gradle "Plusieurs fichiers dex définissent ..."

Mon projet fonctionnait bien. Lorsque j'ai ajouté facebook sdk à mon projet, j'ai une erreur comme celle-ci. J'ai essayé de nombreuses façons de résoudre ce problème, mais je ne l'ai pas fait. Que devrais-je faire?

  Error:Execution failed for task ':app:packageAllDebugClassesForMultiDex'.
> Java.util.Zip.ZipException: duplicate entry: bolts/AggregateException.class

Mon niveau d'application est ci-dessous

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 21
    buildToolsVersion '21.1.2'

    defaultConfig {
        applicationId "com.example.myproject"
        minSdkVersion 9
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
        multiDexEnabled = true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.Android.support:appcompat-v7:21.0.3'

    compile project(':facebook')
}

Et voici le build.gradle de facebook

apply plugin: 'com.Android.library'

repositories {
  mavenCentral()
}

project.group = 'com.facebook.Android'

dependencies {
    compile 'com.Android.support:support-v4:[21,22)'
    compile 'com.parse.bolts:bolts-Android:1.1.4'
}

Android {
    compileSdkVersion 21
    buildToolsVersion '21.1.2'

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 21
    }

    lintOptions {
        abortOnError false
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            Java.srcDirs = ['src']
            res.srcDirs = ['res']
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

apply plugin: 'maven'
apply plugin: 'signing'

def isSnapshot = version.endsWith('-SNAPSHOT')
def ossrhUsername = hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
def ossrhPassword = hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""

task setVersion {
    // The version will be derived from source
    project.version = null
    def sdkVersionFile = file('src/com/facebook/FacebookSdkVersion.Java')
    sdkVersionFile.eachLine{
        def matcher = (it =~ /(?:.*BUILD = \")(.*)(?:\".*)/)
        if (matcher.matches()) {
          project.version = matcher[0][1]
          return
        }
    }
    if (project.version.is('unspecified')) {
      throw new GradleScriptException('Version could not be found.', null)
    }
}

uploadArchives {
    repositories.mavenDeployer {
        beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

        repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
            authentication(userName: ossrhUsername, password: ossrhPassword)
        }

        snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") {
            authentication(userName: ossrhUsername, password: ossrhPassword)
        }

        pom.project {
            name 'Facebook-Android-SDK'
            artifactId = 'facebook-Android-sdk'
            packaging 'aar'
            description 'Facebook Android SDK'
            url 'https://github.com/facebook/facebook-Android-sdk'

            scm {
                connection 'scm:[email protected]:facebook/facebook-Android-sdk.git'
                developerConnection 'scm:[email protected]:facebook/facebook-Android-sdk.git'
                url 'https://github.com/facebook/facebook-Android-sdk'
            }

            licenses {
                license {
                    name 'The Apache Software License, Version 2.0'
                    url 'https://github.com/facebook/facebook-Android-sdk/blob/master/LICENSE.txt'
                    distribution 'repo'
                }
            }

            developers {
                developer {
                    id 'facebook'
                    name 'Facebook'
                }
            }
        }
    }
}

uploadArchives.dependsOn(setVersion)

signing {
    required { !isSnapshot && gradle.taskGraph.hasTask("uploadArchives") }
    sign configurations.archives
}

task androidJavadocs(type: Javadoc) {
    source = Android.sourceSets.main.Java.srcDirs
    classpath += project.files(Android.getBootClasspath().join(File.pathSeparator))
}

task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
    classifier = 'javadoc'
    from androidJavadocs.destinationDir
}

task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from Android.sourceSets.main.Java.sourceFiles
}

artifacts {
    archives androidSourcesJar
    archives androidJavadocsJar
}

afterEvaluate {
    androidJavadocs.classpath += project.Android.libraryVariants.toList().first().javaCompile.classpath
}
11
Muhammet Demir

Maintenant, ils séparent les boulons-Android en boulons-applinks et boulons-tâches. Vous devez donc exclure les deux de la construction de Gradle

compile ('com.facebook.Android:facebook-Android-sdk:4.10.0'){
exclude group: 'com.parse.bolts',
        module: 'bolts-tasks'
exclude group: 'com.parse.bolts',
        module: 'bolts-applinks';}

Cela fonctionne parfaitement pour moi !!!!

19
prasanthMurugan

Pour moi, j'ajoutais Facebook SDK en tant que projet et le configurais en tant que dépendances.

Cependant, l’exclusion fonctionne après le passage à l’utilisation de la source maven.

Je pense que c'est uniquement pour maven, pas pour les dépendances de projet? (s'il vous plaît fournir des informations correctes si quelqu'un sait à ce sujet)

Dans Word, vous pouvez maintenant supprimer le projet et les fichiers du SDK Facebook.

n'oubliez pas d'ajouter 

repositories {
    mavenCentral()
}

si vous n'utilisiez pas Maven.

Donc, le build.gradle ressemble à ceci, j'ai commenté la manière du projet.

repositories {
    mavenCentral()
}
dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':google-play-services_lib')
    compile ('com.facebook.Android:facebook-Android-sdk:3.23.0'){
        exclude module: 'bolts-Android'
        exclude module: 'support-v4'
    }
//    compile (project(':FacebookSDK')){
//        exclude module: 'bolts-Android'
//        exclude module: 'support-v4'
//    }
    compile (project(':UserVoiceSDK')){ exclude module: 'support-v4' }
}
15
Shing

J'ai eu un problème similaire. C'était vraiment frustrant pour moi car tout fonctionnait bien et tout à coup cela a éclaté sans raison.

Le problème est mentionné dans duplicate entry: bolts/AggregateException.class. C'est un choc de la bibliothèque Bolts, utilisée par Facebook et Parse. 

Pour moi, le problème réside dans ces deux lignes:

compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.parse.bolts:bolts-Android:1.1.4'

J'avais téléchargé les bibliothèques de Parse et les ai placées dans le dossier /libs/. Le problème était qu'il y avait un autre fichier bolts-Android dans ce dossier.

La solution consiste à supprimer cette bibliothèque et à conserver la partie compile 'com.parse.bolts:bolts-Android:1.1.4'.

Problème alternatif

Dans mon cas, j'ai utilisé compile 'com.parse.bolts:bolts-Android:1.+' au lieu d'une version spécifique. Cela prend toujours la dernière version. Ainsi, lorsque bolts a été mis à niveau vers la version 1.2.0, le problème semble s’être rompu de manière aléatoire, car tout à coup la version du dossier /libs/ et la version la plus récente n’étaient plus alignées.

La meilleure pratique consiste à éviter les versions de style 1.+ et à simplement vérifier et mettre à jour régulièrement la dernière version.

J'espère que ça aide quelqu'un.

5
Muz

pas besoin de supprimer les fichiers JAR. Dans le fichier Gradle, nous avons écrit ces deux lignes

compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.parse.bolts:bolts-Android:1.1.4'

il suffit d'enlever

compile fileTree(dir: 'libs', include: ['*.jar'])

parce que nous compilons tous les fichiers jar et que nous incluons à nouveau les boulons à compiler en raison desquels l'erreur est affichée

4
Bhavana Johri

dans mon cas, j'avais ajouté un .jar dans le code de la bibliothèque. la bibliothèque à son tour s'habitue dans l'application principale. le dex était toujours dans le fichier de cache, même si j'avais nettoyé mon projet et l'avais installé. Pour être sûr dans l'application principale, vous pouvez vérifier le nombre de bibliothèques. Le fichier de cache est "Projet -> construire -> dex-cache -> cache.xml". Si vous avez plusieurs comptes de la bibliothèque, vous devez le faire dans Android Studio -> Fichier -> Invalider le cache/redémarrer. 

0