【问题标题】:Android Studio - UNEXPECTED TOP-LEVEL EXCEPTION:Android Studio - 意外的顶级异常:
【发布时间】:2014-01-13 22:23:56
【问题描述】:

我使用工具中提供的新项目模板在 Android Studio 中构建了一个新项目。所有代码都由 Studio 生成,我还没有做任何修改。

我正在尝试运行代码,但应用程序失败并出现以下错误,不确定是什么问题,因此感谢您的帮助。

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Landroid/support/v7/app/ActionBar$Callback;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
    at com.android.dx.command.dexer.Main.run(Main.java:230)
    at com.android.dx.command.dexer.Main.main(Main.java:199)
    at com.android.dx.command.Main.main(Main.java:103)

 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    C:\Users\RichardKavanagh\AppData\Local\Android\android-sdk\build-tools\19.0.1\dx.bat --dex --output D:\Android\Projects\MyHealthRecord\app\build\libs\app-debug.dex D:\Android\Projects\MyHealthRecord\app\build\classes\debug D:\Android\Projects\MyHealthRecord\app\build\dependency-cache\debug D:\Android\Projects\MyHealthRecord\app\build\pre-dexed\debug\android-support-v7-appcompat-5a78dab7e2789bbe64f4bc80d106ca75c04dcf6f.jar D:\Android\Projects\MyHealthRecord\app\build\pre-dexed\debug\classes-f9b947272e9f33ba50355b52d82755584f9c0c58.jar D:\Android\Projects\MyHealthRecord\app\build\pre-dexed\debug\support-v4-19.0.0-31a2c13df80d37d62ca50fec3bde6da0ca706223.jar
Error Code:
    2
Output:

    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexException: Multiple dex files define Landroid/support/v7/app/ActionBar$Callback;
        at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
        at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
        at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
        at com.android.dx.command.dexer.Main.run(Main.java:230)
        at com.android.dx.command.dexer.Main.main(Main.java:199)
        at com.android.dx.command.Main.main(Main.java:103)



* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 12.948 secs

【问题讨论】:

  • 发布你的 build.gradle。
  • 试试这个Solution,它对我有用,我尝试了 pyus13 所说的,但这有效。
  • 当您的库中有重复的依赖项时也可能发生这种情况,要解决此问题,请参阅stackoverflow.com/a/30649660/1979347
  • 我通过删除相应的库解决了同样的问题,因为我们忘记了在 gradle 依赖项之前添加的内容

标签: android android-studio


【解决方案1】:

就像这里的其他人所说的那样,支持库 (com.android.support) 不止一次包含在您的项目中。尝试在根级别的build.gradle 中添加它,它应该排除支持库通过其他项目依赖项导出。

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

如果您在这样的依赖项中包含多个支持库,您可能需要删除其中一个:

【讨论】:

  • 这正是解决此问题的方法
  • @iTapAndroid :我需要添加到哪个build.gradle 文件?在ModuleProject 中的文件(有这行classpath 'com.android.tools.build:gradle:0.9.+')?请告诉我,我无法解决这个问题。
  • 您希望将其添加到您的模块 gradle 文件中。这将是您添加所有依赖项的文件。
  • @iTapAndroid 如果我的eclipse项目没有build.gradle,我该怎么做才能解决这个问题?
  • 这对我不起作用我有同样的问题。当我添加提到的代码时,我无法导入 android.support.v4.app.ActionBarDrawerToggle;
【解决方案2】:

dependencies {
    compile 'com.android.support:support-v4:19.1.+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

如果您的 libs 文件夹中有支持 jar,则会发生冲突。 如果您的项目 libs 文件夹中有支持 jar,并且添加了模块依赖项来编译“com.android.support:support-v4:13.0.+”,则会引发 UNEXPECTED_TOPLEVEL_DEPENDANCY 异常。

【讨论】:

  • 很棒的帖子,谢谢。为我做的是你截图中的compile fileTree(dir: 'libs', include: ['*.jar']) 部分。注释掉所有单独的依赖项并将其插入并解决了我的问题。
【解决方案3】:

因为您可能在项目中包含两个相同的库。 检查你的 build.gradle 文件。

dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile files('libs/android-support-v4.jar') 
 }

如果你的文件包含编译'com.android.support:appcompat-v7:+'compile files('libs/android-support-v4.jar'),就会出现这个问题。 删掉这句话:compile files('libs/android-support-v4.jar')

我就是这样解决这个问题的。

【讨论】:

    【解决方案4】:

    当您在 build.gradle 的依赖项中多次包含相同的库/目录时会发生错误。好的,假设您有一个如下所示的 App 结构:

    所以你有主“应用程序”,然后你有一堆子应用程序/模块/库。这些库是:1)gene_test_library,2)genes_nine_old_androids_library,&3)swipe_list_view_library。

    我的名字是 Gene,这就是为什么会有所有这些“基因”库的原因。

    在“app”的 build.gradle 中,我有:

    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        compile 'com.android.support:appcompat-v7:21.0.0'
    
        compile project(':libraries:gene_test_library')
        //compile project(':libraries:genes_nine_old_androids_library')
        compile project(':libraries:swipe_list_view_library')
    }
    

    在gene_test_library 的build.gradle 中,我什么都没有:

    dependencies {
    }
    

    在gene_nine_old_androids_library 的build.gradle 中,我有:

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

    在 swipe_list_view_library 的 build.gradle 中,我有:

    dependencies {
        compile 'com.nineoldandroids:library:2.4.0+'
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:21.0.0'
    }
    

    这行代码“compile fileTree(dir: 'libs', include: ['*.jar'])”的意思是“嘿,看看这个模块内的‘libs’文件夹中是否有任何jar文件。我在任何模块的 libs 文件夹中都没有任何内容,因此您可以忽略该行代码。

    假设我取消注释 //compile project(':libraries:genes_nine_old_androids_library') 在“app”模块的 build.gradle 中。然后我会得到“UNEXPECTED TOP-LEVEL EXCEPTION:”错误。这是为什么?

    好吧,在 build.gradle 中为“app”编写 //compile project(':libraries:genes_nine_old_androids_library') 与获取“genes_nine_old_androids_library”模块的构建依赖项并将其放在那里相同。因此取消注释 //compile project(':libraries:genes_nine_old_androids_library') 语句,“app”模块的 build.gradle 变为:

    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        compile 'com.android.support:appcompat-v7:21.0.0'
    
        compile project(':libraries:gene_test_library')
        ***compile fileTree(dir: 'libs', include: ['*.jar'])***
        ***compile 'com.android.support:appcompat-v7:21.0.0'***
        compile project(':libraries:swipe_list_view_library')
    }
    

    注意现在“compile 'com.android.support:appcompat-v7:21.0.0'” 显示为 2x。这就是错误的来源。

    【讨论】:

    • “当您多次包含相同的库/目录时会发生错误。”这节省了我的时间。
    • @Gene,在appcompile project(':libraries:swipe_list_view_library'),而且swipe_list_view_library 也包括appcompat-v7。因此,您最终在 app 中编译了 2 个 appcompat-v7。为什么这个不抛出错误?
    • 嗯...我几年前写的...我认为它抛出的错误是 UNEXPECTED TOP-LEVEL EXCEPTION。
    【解决方案5】:

    我发现了这个问题的两个原因:

    1. 有时是因为包含多个库。例如你添加

      编译'com.nineoldandroids:library:2.4.0'

    在你的 gradle 中并添加另一个库,它也在它的 gradle 中使用“nineoldandroids”!

    1. 正如Android Developer Official网站所说:

    如果你已经构建了一个 Android 应用并收到这个错误,那么恭喜你,你有很多代码!

    那么,为什么?

    Dalvik Executable 规范将单个 DEX 文件中可以引用的方法总数限制为 65,536 个,包括 Android 框架方法、库方法和您自己代码中的方法。要超过此限制,您需要将应用构建过程配置为生成多个 DEX 文件,称为 multidex 配置。

    那你该怎么办?

    • 避免 65K 限制 - 如何?

      1. 查看您的应用程序的直接和传递依赖项 - 确保您在应用程序中包含的任何大型库依赖项的使用方式都超过了添加到应用程序中的代码量。一个常见的反模式是包含一个非常大的库,因为一些实用方法很有用。减少应用代码依赖通常可以帮助您避免 dex 引用限制。
      2. 使用 ProGuard 删除未使用的代码 - 为您的应用配置 ProGuard 设置以运行 ProGuard,并确保您为发布构建启用了收缩功能。启用压缩可确保您不会随 APK 一起提供未使用的代码。
    • 使用 Gradle 为 Multidex 配置您的应用程序 - 如何? 1.更改您的 Gradle 构建配置以启用 multidex。

    multiDexEnabled true
    

    在 Gradle 构建文件的 defaultConfig、buildType 或 productFlavor 部分中。

    2.在您的清单中,将 MultiDexApplication 类从 multidex 支持库添加到应用程序元素。

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.android.multidex.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
    </manifest>
    

    注意:如果您的应用使用扩展Application类,您可以重写attachBaseContext()方法并调用MultiDex.install(this)来启用multidex。有关详细信息,请参阅 MultiDexApplication 参考文档。


    此代码也可以帮助您:

    dexOptions {
        javaMaxHeapSize "4g"
    }
    

    放入你的 gradle(android{ ... } )。

    【讨论】:

    • 使用javaMaxHeapSize的原因是什么?
    【解决方案6】:

    大家好,我遇到了同样的问题,这是由我在尝试集成解析时包含的重复支持版本 4 文件引起的。从 libs 目录中删除了额外的包含,现在可以正常工作了!

    【讨论】:

    • 使用 Maven 存储库,我不得不同时删除 "compile 'com.android.support:appcompat-v7:23.0.1'" 和 "compile 'com.android.support:support-v4:23 .+'" 来自依赖块。
    【解决方案7】:

    当一个库被编译两次(即它被添加两次)时,就会发生这种情况。可以是支持库,也可以是其他的,没关系。
    常见的情况是您添加了一个库的编译语句,该库已经在您的libs/ 目录中。所有*.jar 文件都是自动编译的。因此,添加编译语句会导致错误。删除该语句可能会解决此问题。如果这不适用,那么我们已经有了一些很棒的答案。

    【讨论】:

      【解决方案8】:

      这可能是最愚蠢的答案,但这对我有用:

      • 我手动删除并添加了我项目中的所有库。(一个接一个)瞧,它起作用了。
      • 构建 -> 重建项目

      注意:我的库没有被编译两次。

      【讨论】:

        【解决方案9】:

        确保您已下载 Support Repository 以在 build.gradle 中使用支持库依赖项。

        如果这些都已安装,请使用可用按钮将您的项目与 gradle 同步一次。

        【讨论】:

          【解决方案10】:

          在我的情况下,由于项目路径中的特殊字符而引发了 TOP LEVEL EXCEPTION。刚刚关闭项目,将“á”更改为“a”并重新打开项目。有效!

          【讨论】:

            【解决方案11】:

            突然,我的项目没有任何重大变化,我也遇到了这个错误。

            以上所有方法都不适合我,因为我需要支持库 V4 和 V7。

            最后,因为2小时前项目编译没有问题,我只是告诉Android Studio REBUILD项目,错误就消失了。

            【讨论】:

              【解决方案12】:

              当我尝试为我的应用构建签名的 apk 时,我遇到了类似的问题。

              奇怪,它只发生在我想构建 release apk 时,而在 debug apk 上一切正常。

              最后,查看这个线程,我检查了 build.gradle 中的支持库重复项并删除了所有重复项,但这还不够……

              我必须做干净的项目,然后才终于让它工作。

              【讨论】:

                【解决方案13】:

                我知道问题已得到解答,但这可能会再次发生,而且我的解决方案与我找到的解决方案略有不同。就我而言,该解决方案与在我的项目中包含两个不同的库无关。见以下代码:

                compileOptions {
                    sourceCompatibility JavaVersion.VERSION_1_8
                    targetCompatibility JavaVersion.VERSION_1_8
                }
                

                此代码给出了“意外顶级异常”错误。 我修复了进行以下更改的代码:

                compileOptions {
                    sourceCompatibility JavaVersion.VERSION_1_7
                    targetCompatibility JavaVersion.VERSION_1_7
                }
                

                【讨论】:

                • Java版本和DexMerger有什么关系?
                【解决方案14】:

                我通过在 build gradle 中添加这些解决了我的问题:

                   defaultConfig {
                   multiDexEnabled true
                
                
                 dependencies {
                 compile 'com.android.support:multidex:1.0.0'
                

                另一种解决方案是删除不必要的库

                【讨论】:

                • 为什么要启用multidex?
                • @IgorGanapolsky 这是因为解决了多个包含库的上述问题。在 android studio 中:Dalvik Executable 规范将单个 DEX 文件中可以引用的方法总数限制为 65,536 个,包括 Android 框架方法、库方法和您自己代码中的方法。超过此限制要求您将应用构建过程配置为生成多个 DEX 文件,称为 multidex 配置。
                猜你喜欢
                • 2015-09-07
                • 2015-08-29
                • 2014-11-04
                • 1970-01-01
                • 2015-04-04
                • 2014-09-06
                • 2016-01-31
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多