Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Studio Gradle error "Multiple dex files define..."

My Project was working fine, when I have added facebook sdk into my project I have an error like this, I have tried so many ways to fix this, but I didn't. What should I do?

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

My App gradle is below

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

And here is the facebook build.gradle

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
}
like image 654
Muhammet Demir Avatar asked Mar 01 '15 09:03

Muhammet Demir


4 Answers

Now they split bolts-android into bolts-applinks and bolts-tasks .so you need exclude both from the gradle build

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

This works perfectly for me !!!!

like image 56
prasanthMurugan Avatar answered Nov 15 '22 20:11

prasanthMurugan


For me, I was adding Facebook SDK as a project, and set it as dependencies.

However, the exclude work after i switching to use the maven source.

I think it is for maven only, not for project dependencies? (please provide correct info if someone know about this)

In other word, you can now delete the Facebook SDK project and files.

remember to add

repositories {
    mavenCentral()
}

if you weren't using maven.

So the build.gradle look like this, I commented out the project way.

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' }
}
like image 35
Shing Avatar answered Nov 15 '22 19:11

Shing


I've had a similar problem. This was really frustrating for me because everything worked fine and suddenly it broke for no reason.

The issue is hinted in duplicate entry: bolts/AggregateException.class. It's a clash of the Bolts library, used by Facebook and Parse.

For me, the problem lay in these two lines:

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

I had downloaded the Parse libraries and put them in the /libs/ folder. The problem was that there was another bolts-android file in that folder.

The solution is to delete that library and keep the compile 'com.parse.bolts:bolts-android:1.1.4' part.

Alternative problem

In my case, I used compile 'com.parse.bolts:bolts-android:1.+' instead of a specific version. This always takes the latest version. So when bolts upgraded to version 1.2.0, the thing just seemed to randomly break because all of a sudden the version in the /libs/ folder and the latest version no longer aligned.

Best practice is to avoid 1.+ style versioning and just keep checking and updating to the latest version every now and then.

Hope this helps someone.

like image 36
Muz Avatar answered Nov 15 '22 19:11

Muz


no need to remove any jar files. In Gradle file we have written these two lines

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

just remove

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

because we are compiling all the jar files and then again including the bolts to compile due to which the error is shown

like image 26
Bhavana Johri Avatar answered Nov 15 '22 18:11

Bhavana Johri