更新到最新的appcompat和支持库后出现DexIndexOverflowException问题

时间:2014-10-22 19:19:08

标签: android gradle android-5.0-lollipop android-support-library build.gradle

我通过gradle使用以下设置:

compileSdkVersion 21
ANDROID_BUILD_MIN_SDK_VERSION=14
ANDROID_BUILD_TARGET_SDK_VERSION=21
ANDROID_BUILD_TOOLS_VERSION=21.0.2
ANDROID_BUILD_SDK_VERSION=21

我的gradle文件中也有以下设置:

compile 'com.android.support:support-annotations:21.0.0'
compile 'com.android.support:appcompat-v7:21.0.0'
compile 'com.android.support:support-v4:21.0.0'

我总是收到错误UNEXPECTED TOP LEVEL EXCEPTION 但是当我将21.0.0设为20.0.0时,它工作正常......但我无法访问任何Android API 21选项。我在这里做错了吗?如何在没有此异常的情况下编译它?我没有在其他等级项目之外的其他地方(facebook等)的支持罐。

这是完整的堆栈跟踪:

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
    at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:502)
    at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:283)
    at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:302)
    at com.android.dx.command.dexer.Main.run(Main.java:245)
    at com.android.dx.command.dexer.Main.main(Main.java:214)
    at com.android.dx.command.Main.main(Main.java:106)

6 个答案:

答案 0 :(得分:148)

此消息听起来像您的项目太大了。

你有太多的方法。 dex 只能有 65536种方法。

由于gradle插件0.14.0和Build Tools 21.1.0,您可以使用multidex support

只需在build.gradle

中添加这些行
android {

    defaultConfig {
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

同样在您的Manifest中,将多索引支持库中的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课程,请将父课程从Application更改为MultiDexApplication

答案 1 :(得分:45)

1)将依赖项添加到应用程序build.gradle文件

compile 'com.android.support:multidex:1.0.2'

2)如果您没有覆盖Application类,请编辑清单文件以在标记中设置android:name,如下所示:

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

如果您覆盖Application类,请将其更改为扩展MultiDexApplication(如果可能),如下所示:

public class MyApplication extends MultiDexApplication { ... }

或者,如果您覆盖Application类但无法更改基类,则可以改为覆盖attachBaseContext()方法并调用MultiDex.install(this)以启用multidex:

public class MyApplication extends SomeOtherApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}

3)在build.gradle

的defaultConfig中添加multidex支持
defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 26
        ...
        // Enabling multidex support.
        multiDexEnabled true
    }
...

答案 2 :(得分:3)

在搞乱MultiDex之前

要么解决方案太大(使用MultiDex),要么编译并在项目中包含一些不需要的东西。我在我的小项目上遇到了这个问题。以下是我要解决的问题:

我从dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) }

中删除了此内容
{{1}}

我手动从应用程序根目录中删除了我的构建文件夹。问题已解决。

答案 3 :(得分:2)

按照this指南解决65K限制。

我通过设置multiDexEnabled true并使用class MyApp extends MultiDexApplication

扩展我的应用程序,在gradle中解决了这个问题

答案 4 :(得分:0)

我只是注释掉编译filetree(include: ['*.jar'], dir: 'libs')build.gradle文件中(如上所述)并重建项目。编译没有任何错误。我不需要移动任何文件夹。

答案 5 :(得分:0)

当我将整个Google Play服务API包编译到我的应用中时,我遇到了这个问题。我通过使用选择性API解决了这个问题。

例如,要仅包含Google Fit和Android Wear API,请替换build.gradle文件中的以下行:

$ical .= "DTSTART:".$date->format('Ymd\THis\Z')."\r\n";

这些行:

compile 'com.google.android.gms:play-services:11.0.2'

问题在以下link中解释。