Android Studio - 意外的顶级例外:

时间:2014-01-13 22:23:56

标签: android android-studio

我使用作为工具一部分提供的新项目模板在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

14 个答案:

答案 0 :(得分:118)

与其他人在此处所说的一样,支持库(com.android.support)在您的项目中被多次包含。尝试在根级别build.gradle添加此内容,它应该排除通过其他项目依赖项导出支持库。

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

如果您在依赖项中包含多个支持库,则可能需要删除其中一个:enter image description here

答案 1 :(得分:18)

enter image description here

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异常。 conflicting folder structure and build.gradle

答案 2 :(得分:9)

因为您可能在项目中包含两个相同的库。 检查你的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'),则会出现此问题。 删除这句话:编译文件(' libs / android-support-v4.jar')

我是如何解决这个问题的。

答案 3 :(得分:8)

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

enter image description here

所以你有主“应用程序”,然后你有一堆子应用程序/模块/库。这些库是: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'
}

这行代码“编译fileTree(dir:' libs',包括:[' * .jar'])”只是意味着“嘿,看看'libs'文件夹在这个模块里面的任何jar文件。我在任何模块的libs文件夹中都没有任何内容,因此您可以忽略该行代码。

所以让我说我取消注释//编译项目(':libraries:genes_nine_old_androids_library') 在“app”模块的build.gradle中。然后我会得到“意想不到的顶级异常:”错误。这是为什么?

enter image description here

好吧,在build.gradle中为“app”编写//编译项目(':libraries:genes_nine_old_androids_library')与获取“genes_nine_old_androids_library”模块的构建依赖项并将其放在那里相同。因此取消注释// compile项目(':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')
}

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

答案 4 :(得分:5)

我找到了这个问题的2个原因:

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

    compile' com.nineoldandroids:library:2.4.0'

  2. 在你的gradle中添加另一个它也使用的库" nineoldandroids"在它的gradle!

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

      如果您构建了Android应用并收到此错误,那么恭喜您,您有很多代码!

      那么,为什么?

        

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

      那你该怎么办?

      • 避免65K限制 - 如何?

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

      multiDexEnabled true
      

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

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

      <?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 {...})。

答案 5 :(得分:4)

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

答案 6 :(得分:3)

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

答案 7 :(得分:3)

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

  • 我手动删除并添加了项目中的所有库。(一个接一个)瞧,它有效。
  • 构建 - &gt;重建项目

注意:没有编译过我的图书馆两次。

答案 8 :(得分:2)

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

enter image description here

如果已经安装了所有这些,则使用可用按钮一次将项目与gradle同步。

sync button

答案 9 :(得分:0)

在我的情况下,TOP LEVEL EXCEPTION因为项目路径中的特殊字符而被抛出。刚关闭项目,将“á”改为“a”并重新打开项目。作品!

答案 10 :(得分:0)

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

以上所有内容对我都不起作用,因为我需要支持库V4和V7。

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

答案 11 :(得分:0)

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

奇怪的是,只有当我想构建一个发布 apk时才会发生这种情况,而在调试 apk上,一切正常。

最后,看一下这个帖子,我在build.gradle中检查了支持库重复并删除了所有重复,但这还不够......

我必须做清洁项目,但最后我才开始工作。

答案 12 :(得分:0)

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

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

此代码提供了该错误&#34;意外的顶级异常&#34;。 我修复了代码,进行了以下更改:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

答案 13 :(得分:0)

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

   defaultConfig {
   multiDexEnabled true


 dependencies {
 compile 'com.android.support:multidex:1.0.0'

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