Android Gradle在多个dex文件定义okhttp时失败

Android Gradle在多个dex文件定义okhttp时失败,android,gradle,android-gradle-plugin,build.gradle,Android,Gradle,Android Gradle Plugin,Build.gradle,我有以下依赖项: dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-moshi:2.3.0' com

我有以下依赖项:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-moshi:2.3.0'
    compile('com.github.eoinsha:JavaPhoenixChannels:0.2') {
        exclude module: 'groovy-all'
    }
}
以及以下依赖关系树:

+--- com.android.support:appcompat-v7:25.3.1
|    +--- com.android.support:support-annotations:25.3.1
|    +--- com.android.support:support-v4:25.3.1
|    |    +--- com.android.support:support-compat:25.3.1
|    |    |    \--- com.android.support:support-annotations:25.3.1
|    |    +--- com.android.support:support-media-compat:25.3.1
|    |    |    +--- com.android.support:support-annotations:25.3.1
|    |    |    \--- com.android.support:support-compat:25.3.1 (*)
|    |    +--- com.android.support:support-core-utils:25.3.1
|    |    |    +--- com.android.support:support-annotations:25.3.1
|    |    |    \--- com.android.support:support-compat:25.3.1 (*)
|    |    +--- com.android.support:support-core-ui:25.3.1
|    |    |    +--- com.android.support:support-annotations:25.3.1
|    |    |    \--- com.android.support:support-compat:25.3.1 (*)
|    |    \--- com.android.support:support-fragment:25.3.1
|    |         +--- com.android.support:support-compat:25.3.1 (*)
|    |         +--- com.android.support:support-media-compat:25.3.1 (*)
|    |         +--- com.android.support:support-core-ui:25.3.1 (*)
|    |         \--- com.android.support:support-core-utils:25.3.1 (*)
|    +--- com.android.support:support-vector-drawable:25.3.1
|    |    +--- com.android.support:support-annotations:25.3.1
|    |    \--- com.android.support:support-compat:25.3.1 (*)
|    \--- com.android.support:animated-vector-drawable:25.3.1
|         \--- com.android.support:support-vector-drawable:25.3.1 (*)
+--- com.squareup.retrofit2:retrofit:2.3.0
|    \--- com.squareup.okhttp3:okhttp:3.8.0
|         \--- com.squareup.okio:okio:1.13.0
+--- com.squareup.retrofit2:converter-moshi:2.3.0
|    +--- com.squareup.retrofit2:retrofit:2.3.0 (*)
|    \--- com.squareup.moshi:moshi:1.4.0
|         \--- com.squareup.okio:okio:1.11.0 -> 1.13.0
\--- com.github.eoinsha:JavaPhoenixChannels:0.2
     +--- com.fasterxml.jackson.core:jackson-databind:2.8.3
     |    +--- com.fasterxml.jackson.core:jackson-annotations:2.8.0
     |    \--- com.fasterxml.jackson.core:jackson-core:2.8.3
     \--- com.squareup.okhttp3:okhttp-ws:3.4.1
          \--- com.squareup.okhttp3:okhttp:3.4.1 -> 3.8.0 (*)
我在尝试构建项目时遇到此错误:

Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define Lokhttp3/internal/ws/WebSocketReader$FrameCallback;
这可能是由于类路径上存在两个不同版本的okhttp库造成的:

  • 3.4.1由
    com.squareup.okhttp3:okhttpws
    编写,它是
    JavaPhoenixChannels

  • 3.8.0通过改造

Gradle应该能够自动解决这个问题,所以我想知道有什么问题。 我试图通过将
okhttp
okhttp-ws
从它们各自的第一类依赖项中排除并分别编译来修复它,但这似乎没有帮助


对于为什么会出现此类错误的一些解释,我们也表示感谢。

正如@Selvin在评论中指出的那样,问题的原因是,
okhtt-ws
从3.5版开始就被移动到核心项目中,因此指定
okhttp
的较新版本和
okhtt-ws
的旧版本将导致
okhtt-ws
库的两个不同副本出现在类路径上。对于gradle来说,这些库将是使用相同包层次结构的不同库,因此它不会自动排除一个库

TL;DR通过排除
okhttp ws
依赖项修复了该错误,因为该依赖项已在
okhttp
本身的3.8版中提供:

compile 'com.squareup.okhttp3:okhttp:3.8.0'
compile('com.github.eoinsha:JavaPhoenixChannels:0.2') {
    exclude module: 'okhttp-ws'
}

是否在应用程序模块的build.gradle文件中添加了defaultConfig{multiDexEnabled true}?然后清理项目并尝试重新构建。@RohitPadma,这在这里似乎无关紧要。我没有遇到方法限制问题。从okhttp 3.5开始,okhttp ws是okhttp本身的一部分。。。获取此库的源代码并自行编译。。。您也可以尝试排除okhttp ws,但okhttp 3.8.0中的版本可能没有兼容的接口