【问题标题】:UNEXPECTED TOP-LEVEL EXCEPTION in Android StudioAndroid Studio 中的意外顶级异常
【发布时间】:2015-04-04 21:33:04
【问题描述】:

在我的一个项目中,我在构建 gradle 文件时遇到了这个异常

错误:任务 ':emBazaarV4:dexDebug' 执行失败。

com.android.ide.common.internal.LoggedErrorException:无法运行命令:F:\AndroidSDK\build-tools\21.1.2\dx.bat --dex --no-optimize --output F:\AndroidStudioWorkspace\EmBazaarV4\emBazaarV4\build\intermediates\dex\debug --input- list=F:\AndroidStudioWorkspace\EmBazaarV4\emBazaarV4\build\intermediates\tmp\dex\debug\inputList.txt 错误代码:2 输出:意外的顶级异常: com.android.dex.DexException:多个 dex 文件定义 Lcom/google/gson/JsonSerializer;在 com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596) 在 com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554) 在 com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535) 在 com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171) 在 com.android.dx.merge.DexMerger.merge(DexMerger.java:189) 在 com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454) 在 com.android.dx.command.dexer.Main.runMonoDex(Main.java:303) 在 com.android.dx.command.dexer.Main.run(Main.java:246) 在 com.android.dx.command.dexer.Main.main(Main.java:215) 在 com.android.dx.command.Main.main(Main.java:106)

这是我的依赖项

dependencies {
    compile 'com.facebook.android:facebook-android-sdk:3.22.0'
    compile 'com.aviary.android.feather.sdk:aviary-sdk:3.6.3'
    compile 'com.android.support:support-v4:21.0.3'
    compile 'com.google.android.gms:play-services:+'
    compile 'com.squareup.okhttp:okhttp:2.2.0'
    compile 'com.squareup.okio:okio:1.1.0'
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0'
    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'com.squareup.picasso:picasso:2.4.0'
    compile files('libs/commons-io-2.4.jar')
    compile files('libs/crashlytics.jar')
    compile files('libs/httpmime-4.1.3.jar')
    compile files('libs/jumblr-0.0.8-jar-with-dependencies.jar')
    compile files('libs/signpost-commonshttp4-1.2.1.2.jar')
    compile files('libs/signpost-core-1.2.1.2.jar')
    compile files('libs/simplesocialsharing.jar')
    compile files('libs/gcm.jar') }

我已经尝试了所有方法,但不知道如何排除这多个 dex 文件。我找到了这样的 v4 解决方案

 configurations {
    all*.exclude group: 'com.android.support', module: 'support-v4'
}

那么对于这类错误有什么通用的解决方案吗?

【问题讨论】:

  • 尝试使用更新的构建工具版本进行编译并清理您的项目
  • 内部某处使用了两个不同版本的 GSON。
  • @rekire 这就是我要问的,我怎么能找到它??

标签: android android-studio gradle build.gradle


【解决方案1】:

这个错误

意外的顶级异常:com.android.dex.DexException:多个 dex 文件

在您使用同一库的不同版本时发生。

在您的情况下,它发生在 gson 库中: Lcom/google/gson/JsonSerializer;

检查您的依赖项。例如 OkHttp 使用 2.2.3 版本。 https://github.com/square/okhttp/blob/master/pom.xml#L44

【讨论】:

  • 好的,我知道 OkHttp 使用了 gson 库。但现在我怎么能找到另一个,如果我能找到,那么我怎么能管理不同的版本,因为我无法删除上面列出的任何依赖项
  • 使用gradlew依赖列出所有依赖。
【解决方案2】:

正如 Gabriele 所说,TopLevel Exception 总是由于同一库的不同版本的冲突而发生。

首先我建议,尽量避免使用添加文件依赖,始终尝试从 jcenter 存储库添加依赖。看起来 gradle 会处理相互冲突的依赖关系。

所以现在,有一些方法可以避免它:

  1. 仅使用一个包含所有所需类的版本。像 app compact 具有所有 v4 支持类,所以如果您正在导入 appcompact v7,则不需要导入 v4 支持版本。

  2. 您始终可以从编译的依赖项中排除一个包。例如:

    //for the package:
    dependencies {
        compile("com.android.support:support-v4:21.0.3") {
              exclude group: 'com.android.support', module: 'support-v4'
        }
    }
    

【讨论】:

  • 那么如何找到这两个不同版本的gson ??
  • 检查包裹。您可以通过将其导入类来做到这一点,如果会有两个不同的包,您可能会在建议中找出该类属于哪些依赖项。
【解决方案3】:

您正在您的应用中使用乳齿象 Google Play 服务。最近在使用的时候可以得到更多的粒度。

按照this guide,您可以只使用您想要的部分。可能这将解决问题。你可以这样使用它:

compile com.google.android.gms:play-services-base:6.5.87
compile <... some other google play services part ...>

您可以在this link阅读“部分”的完整列表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-07
    • 2015-08-29
    • 2014-11-04
    • 1970-01-01
    • 2016-01-31
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多