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


73

我通过以下方式使用以下设置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.020.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)

您是否从SDK Manager中加载了所有库和工具?
加布里埃莱·马里奥蒂

是的,我只是将我的应用程序从API 19更新到21。以前版本的所有库以及21的所有新库
。– KVISH

Answers:


148

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

您有太多方法。dex只能有65536种方法

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

只需将这些行添加到build.gradle

android {

    defaultConfig {
        ...

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

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

同样在您从multidex支持库Manifest中将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类,请将父类从更改ApplicationMultiDexApplication


multi-dex就是这个原因。
KVISH

6
将multiDexEnabled true添加到build.gradle文件的defaultConfig中
Elhanan Mishraky 2015年

我不使用build gradle文件来构建我的应用程序。无论如何要克服这个问题。
Ashokchakravarthi Nagarajan 2015年

有趣的是,仅添加gradle配置对我有用。manifest config是可选的吗?
Abhijit Gujar's 2016年

1
谢谢,这非常重要,对我有很大帮助。
Weverton Peron

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
    }
...

完善!@georgehardcore
benchuk 2015年

@georgehardcore:我在android eclipse project。中使用了第二点,但仍然显示相同的错误。
Nageswara Rao.CH,2015年

尝试拆分google-play-services库。例如,如果您使用Analytics和gcm,只需将它们作为单独的模块插入基本模块中即可,例如:compile'c​​om.google.android.gms:play-services-base:8.1.0'compile'c​​om.google.android.gms: play-services-analytics:8.1.0'编译'com.google.android.gms:play-services-gcm:
8.1.0'– georgehardcore

@georgehardcore不确定是否需要执行步骤2,因为它对我的应用程序没有帮助。因此,我跳过了这一步,其余步骤效果很好!
Vu Nguyen 2015年

对我来说,它起作用了,但没有将清单中的Application类更改为MultiDexApplication,也没有将MyApplication类更改为
Amt87,2016年

3

在使用MultiDex之前

它要么是解决方案太大(使用MultiDex),要么是您编译并在项目中包含一些不需要的东西。我在我的小项目中遇到了这个问题。这是我所做的修复工作:

我从删除了此内容build.gradle

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

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


2

请遵循指南以解决65K限制。

我通过设置multiDexEnabled true和扩展我的应用程序来解决了这个问题class MyApp extends MultiDexApplication


0

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


1
忽略我的评论-即使我手动删除了构建文件夹,后续的重建也会产生相同的原始错误。
伯爵艾伦

0

首先,请确保在中启用了缩小功能app/build.cradle

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.config
    }
    debug {
        signingConfig signingConfigs.config
    }
}

如果这不能解决问题,为您的应用启用multidex build


0

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

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

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

这些行:

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

问题在以下链接中说明。

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.