Android Studio - 意外的顶级例外:

BEN*_*der 81 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
Run Code Online (Sandbox Code Playgroud)

iTa*_*oid 117

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

configurations {
    all*.exclude group: 'com.android.support', module: 'support-v4'
}
Run Code Online (Sandbox Code Playgroud)

如果您在依赖项中包含多个支持库,则可能需要删除其中一个:在此输入图像描述

  • 这对我不起作用我有同样的问题.当我添加提到的代码时,我无法导入android.support.v4.app.ActionBarDrawerToggle; (4认同)

小智 18

在此输入图像描述

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

如果libs文件夹中有支持jar,则会发生冲突.如果您的项目libs文件夹中有支持jar,并且您已添加模块依赖项以编译'com.android.support:support-v4:13.0.+',则将抛出UNEXPECTED_TOPLEVEL_DEPENDANCY异常. 冲突的文件夹结构和build.gradle


bup*_*der 9

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

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

如果你的文件包括编译'com.android.support:appcompat-v7:+'compile files('libs/android-support-v4.jar'),它都会有这个问题.删除这句话:编译文件('libs/android-support-v4.jar')

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


Gen*_*ene 8

如果在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')
}
Run Code Online (Sandbox Code Playgroud)

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

dependencies {
}
Run Code Online (Sandbox Code Playgroud)

在gene_nine_old_androids_library的build.gradle里面,我有:

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

在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'
}
Run Code Online (Sandbox Code Playgroud)

这行代码"编译fileTree(dir:'libs',包括:['*.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')
}
Run Code Online (Sandbox Code Playgroud)

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

  • "如果多次包含相同的库/目录,则会发生错误." 这节省了我的一天. (3认同)

Ham*_*ian 5

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

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

    编译'com.nineoldandroids:library:2.4.0'

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

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

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

所以为什么?

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

那你该怎么办?

  • 避免65K限制 - 如何?

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

multiDexEnabled true
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

注意:如果您的应用程序使用扩展Application类,则可以覆盖attachBaseContext()方法并调用MultiDex.install(this)以启用multidex.有关更多信息,请参阅MultiDexApplication参考文档.


此代码也可以帮助您:

dexOptions {
    javaMaxHeapSize "4g"
}
Run Code Online (Sandbox Code Playgroud)

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