Android Studio – 意外的顶级例外:

我在Android Studio中使用作为工具一部分提供的新项目模板构build了一个新项目。 所有的代码已经由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 

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

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

如果这样的依赖关系中包含多个支持库,则可能需要删除其中的一个: 在这里输入图像说明

在这里输入图像说明

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

如果在libs文件夹中有支持jar,就会发生冲突。 如果您的项目库文件夹中有支持jar,并且已经添加了模块依赖项来编译“com.android.support:support-v4:13.0.+”,则会引发UNEXPECTED_TOPLEVEL_DEPENDANCYexception。 冲突的文件夹结构和build.gradle

因为你可能在你的项目中包含两个相同的库。 检查你的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')

这就是我解决这个问题的方法。

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

在这里输入图像说明

所以你有主要的“应用程序”,然后你有一堆子应用程序/模块/库。 这些库是:1)gene_test_library,2)genes_nine_old_androids_library,&3)swipe_list_view_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 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文件夹中有任何东西,所以你可以忽略这一行代码。

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

在这里输入图像说明

那么,在build.gradle中编写//编译项目(':libraries:genes_nine_old_androids_library')为“app”,就跟把“genes_nine_old_androids_library”模块的构build依赖关系放在那里一样。 所以取消注释//编译项目(':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文件,我已经包括在试图获得parsing集成。 从libs目录删除额外的包含,它现在工作正常!

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

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

    编译“com.nineoldandroids:library:2.4.0”

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

  1. 正如Android开发者官方网站所说:

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

所以为什么?

Dalvik Executable规范将单个DEX文件中可引用的方法总数限制为65,536个,包括您自己代码中的Android框架方法,库方法和方法。 超越此限制要求您configuration您的应用程序生成过程以生成多个DEX文件(称为multidexconfiguration)。

那你应该怎么做?

  • 避免65K限制 – 如何?

    1. 检查您的应用程序的直接和传递依赖关系 –确保您包含在应用程序中的任何大型库依赖项的使用方式超过了将被添加到应用程序的代码量。 一个常见的反模式是包含一个非常大的库,因为less数效用方法是有用的。 减less应用程序代码依赖性通常可以帮助您避免dex引用限制。
    2. 使用ProGuard删除未使用的代码 – 为您的应用程序configurationProGuard设置以运行ProGuard,并确保您已经启用了缩减版本构build。 启用收缩function可确保您不会将未使用的代码与APK一起发送。
  • 使用Gradleconfiguration您的应用程序Multidex – 如何? 1.更改您的Gradle构buildconfiguration以启用multidex。

 multiDexEnabled true 

在Gradle构build文件的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 {…})。

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

这可能是最愚蠢的答案,但这对我工作:

  • 我删除并手动添加了我的项目上的所有库(一个接一个),然后瞧,它的工作。
  • 生成 – >重build项目

注:没有我的图书馆被编译了两次。

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

在这里输入图像说明

如果这些都已经安装,使用可用的button一次同步您的项目与gradle。

同步按钮

在我的情况下,TOP LEVEL EXCEPTION因为项目path中的特殊字符而被抛出。 刚刚closures了项目,把“á”改成了“a”,重新开启了项目。 作品!

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

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

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

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

奇怪的是,它只发生在我想构build一个释放 apk时,而在debugging apk一切正常。

最后,在这个线程上,我检查了build.gradle中的支持库重复,并删除了任何重复,但这是不够的..

我不得不做干净的项目,直到最后我才有了工作。

我知道问题已经解决了,但是这可能会再次发生,我的解决scheme与我发现的有所不同。 在我的情况下,解决scheme与我的项目中包含两个不同的库无关。 见下面的代码:

 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } 

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

 compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } 

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

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

另一个解决scheme可以删除不必要的库