Android Studio-超出预期的最高级别:


82

我已使用该工具提供的新项目模板在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。
Gabriele Mariotti 2014年

尝试此解决方案,它对我有用,我尝试了pyus13所说的内容,但这有效。
2014年

当您的库中有重复的依赖项时,也可能会发生这种情况,要解决此问题,请参见stackoverflow.com/a/30649660/1979347
Rohan Kandwal 2015年

我通过删除相应的库解决了相同的问题,因为我们忘记了在gradle依赖项之前添加的新内容
Tom

Answers:


117

就像这里的其他所有人一样,支持库(com.android.support)已多次包含在您的项目中。尝试build.gradle在根目录中将其添加到您的目录中,它应排除支持库通过其他项目依赖项导出的情况。

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

如果像这样的依赖项中包含一个以上的支持库,则可能要删除其中一个:在此处输入图片说明


1
这正是解决此问题的确切原因
andreimarinescu 2014年

@iTapAndroid:我需要添加到哪个build.gradle文件?Module或中的文件Project(具有此行classpath 'com.android.tools.build:gradle:0.9.+')?请告诉我,我无法解决此问题。
休塔2014年

您想将其添加到模块gradle文件中。这将是您要添加所有依赖项的文件。
iTapAndroid 2014年

@iTapAndroid如果我的eclipse项目没有build.gradle,我该怎么解决?
杀死控制台

4
这对我来说是行不通的,我有同样的问题。当我添加提到的代码时,则无法导入android.support.v4.app.ActionBarDrawerToggle;
NathofGod 2014年

18

在此处输入图片说明

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异常。 冲突的文件夹结构和build.gradle


很棒的帖子,谢谢。对我来说,这compile fileTree(dir: 'libs', include: ['*.jar'])是您屏幕截图中的一部分。注释掉所有单独的依赖项并将其插入,从而解决了我的问题。
user1003916

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')

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


8

当在build.gradle的依赖项中多次包含相同的库/目录时,将发生错误。好的,假设您的应用程序结构如下所示:

在此处输入图片说明

因此,您有了主要的“应用程序”,然后便有了一堆子应用程序/模块/库。这些库为:1)gene_test_library,2)genes_nine_old_androids_library,以及3)swipe_list_view_library。

我叫Gene,所以这就是为什么所有这些“ 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中。然后,我将收到“意外的最高级别例外:”错误。这是为什么?

在此处输入图片说明

好吧,在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'c​​om.android.support:appcompat-v7:21.0.0'”显示为2倍。这就是错误的来源。


3
“当您多次包含相同的库/目录时,将发生错误。” 这挽救了我的一天。
Subin Sebastian 2014年

@Gene,在app您中compile project(':libraries:swipe_list_view_library'),并且swipe_list_view_library还包括appcompat-v7。因此,您最终在中编译了2个appcompat-v7 app。为什么这个不抛出错误?
阿兹比克人

嗯...这是我几年前写的...我认为它引发的错误是意外的最高水平例外。
基因

5

我发现此问题的2个原因:

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

    编译'com.nineoldandroids:library:2.4.0'

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

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

如果您已经构建了一个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.在清单中,将来自Multidex支持库的MultiDexApplication类添加到application元素。

<?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的原因是什么?
IgorGanapolsky

4

大家好,我遇到了一个相同的问题,该问题是由我试图集成解析时包含的一个重复的支持版本4文件引起的。从libs目录中删除了多余的内容,现在可以正常使用!


使用Maven存储库,我必须从依赖项块中删除“ compile'c​​om.android.support:appcompat-v7:23.0.1'”和“ compile'c​​om.android.support:support-v4:23.+'”。
Mahya 2015年

3

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


3

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

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

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


2

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

在此处输入图片说明

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

同步按钮


0

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


0

突然,我的项目没有任何重大更改,我也收到了此错误。

由于我需要支持库V4和V7,因此上述所有内容都不适合我。

最后,因为2个小时前该项目没有问题,所以我只是告诉Android Studio重新构建该项目,然后错误消失了。


0

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

奇怪的是,它仅在我要构建发行版APK时发生,而在调试APK上一切正常。

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

我不得不做一个清洁的项目,直到最后我才开始工作。


0

我知道问题已经得到解决,但是这可能再次发生,我的解决方案与我发现的解决方案有些不同。就我而言,解决方案与在项目中包含两个不同的库无关。参见下面的代码:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

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

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

Java版本与DexMerger有什么关系?
IgorGanapolsky

0

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

   defaultConfig {
   multiDexEnabled true


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

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


为什么启用multidex?
IgorGanapolsky

1
@IgorGanapolsky其原因是为了解决上述多个包含库的问题。在android studio中:Dalvik Executable规范将单个DEX文件中可引用的方法总数限制为65,536,包括Android框架方法,库方法和您自己代码中的方法。超过此限制要求您将应用程序构建过程配置为生成多个DEX文件,称为multidex配置。
比什努·杜德拉伊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.