android dex 无法合并

android dex unable to merge

运行 项目面临此错误:

Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
> com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex

这是我的 gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion '26.0.2'
    defaultConfig {
        applicationId "com.arnick.bazim"
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "0.8"
        multiDexEnabled true //Add this
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        manifestPlaceholders = [onesignal_app_id               : "#onesingal_app_id",

                                onesignal_google_project_number: "REMOTE"]
    }
    applicationVariants.all { variant ->
        variant.resValue "string", "versionName", variant.versionName
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

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


    compile 'com.android.support:appcompat-v7:26.1.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.android.support:cardview-v7:26.0.2'
    compile 'com.android.support:design:26.0.2'
    compile 'com.android.support:support-v4:26.1.0'
    compile 'com.android.support:customtabs:26.1.0'
    compile 'com.google.firebase:firebase-auth:11.6.2'
    compile 'com.google.android.gms:play-services-auth:11.6.2'

    compile('io.socket:socket.io-client:1.0.0') {
        // excluding org.json which is provided by Android
        exclude group: 'org.json', module: 'json'
    }
    compile 'com.onesignal:OneSignal:3.6.5'
    compile 'com.android.volley:volley:1.0.0'


    testCompile 'junit:junit:4.12'
}


configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == 'com.android.support') {
            if (!requested.name.startsWith("multidex")) {
                details.useVersion '26.0.2'
            }
        }
    }
}

android {
    defaultConfig {
        multiDexEnabled true
    }
}

我是否缺少任何特殊代码? 我应该提一下,这是我的一个旧项目,我已经有 4 个月没有处理它了,现在我又开始处理它了。 4个月前一切都很好。 有谁知道问题出在哪里?谢谢

实际上我可以在第一次尝试时编译您的配置,但是我看到了关于某些模块使用的 com.google.android.gms 版本的警告。

例如,运行 gradle app:dependencies 我能注意到这一点:

+--- com.onesignal:OneSignal:3.6.5
|   +--- com.google.android.gms:play-services-gcm:[10.2.1,11.3.0) -> 11.2.2
|    |    +--- com.google.android.gms:play-services-base:11.2.2 -> 11.6.2 (*)
|    |    +--- com.google.android.gms:play-services-basement:11.2.2 -> 11.6.2 (*)
|    |    \--- com.google.android.gms:play-services-iid:11.2.2
|    |         +--- com.google.android.gms:play-services-base:11.2.2 -> 11.6.2 (*)
|    |         \--- com.google.android.gms:play-services-basement:11.2.2 -> 11.6.2 (*)
|    +--- com.google.android.gms:play-services-location:[10.2.1,11.3.0) -> 11.2.2
|    |    +--- com.google.android.gms:play-services-base:11.2.2 -> 11.6.2 (*)
|    |    +--- com.google.android.gms:play-services-basement:11.2.2 -> 11.6.2 (*)
|    |    \--- com.google.android.gms:play-services-tasks:11.2.2 -> 11.6.2 (*)
|    +--- com.android.support:support-v4:[26.0.0,26.2.0) -> 26.0.2 (*)
|    \--- com.android.support:customtabs:[26.0.0,26.2.0) -> 26.0.2 (*)

所以例如 com.google.android.gms:play-services-gcm:[10.2.1,11.3.0) -> 11.2.2 指的是版本 11.2.2

而 firebase 指的是版本 11.6.2

|    +--- com.google.firebase:firebase-common:11.6.2
|    |    +--- com.google.android.gms:play-services-basement:11.6.2 (*)
|    |    +--- com.google.android.gms:play-services-tasks:11.6.2 (*)
|    |    \--- com.google.firebase:firebase-common-license:11.6.2
|    +--- com.google.android.gms:play-services-tasks:11.6.2 (*)
|    \--- com.google.firebase:firebase-auth-license:11.6.2

既然你已经有了一个解决策略,我会像这样改变它:

resolutionStrategy.eachDependency { DependencyResolveDetails details ->
    def requested = details.requested
    if (requested.group == 'com.android.support') {
        if (!requested.name.startsWith("multidex")) {
            details.useVersion '26.0.2'
        }
    }
    if (requested.group == 'com.google.android.gms') {
        details.useVersion '11.6.2'
    }

}

我的警告消失了,希望对您的情况有所帮助。

更新

我确认运行命令

gradle app:transformDexArchiveWithExternalLibsDexMergerForDebug

正如您在异常中所报告的那样,我首先使用您的配置获得了相同的结果,然后使用我建议的更改成功构建。