更新到最新的appcompat和支持库之后发生DexIndexOverflowException问题

我通过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选项。 有什么我在这里做错了吗? 如何在没有这个exception的情况下编译它? 我没有任何其他级别项目(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) 

这个消息听起来像你的项目太大了。

你有太多的方法。 对于dex只能有65536个方法

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

只需在build.gradle添加这些行build.gradle

 android { defaultConfig { ... // Enabling multidex support. multiDexEnabled true } ... } dependencies { compile 'com.android.support:multidex:1.0.1' } 

同样在你的ManifestMultiDexApplication类从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类,请将父类从Application更改为MultiDexApplication

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

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

2)如果你不覆盖应用程序类,编辑你的清单文件,在标签中设置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中添加multidex支持到defaultConfig

 defaultConfig { ... minSdkVersion 16 targetSdkVersion 26 ... // Enabling multidex support. multiDexEnabled true } ... 

在搞乱MultiDex之前

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

我从build.gradle删除了这个:

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

我手动从应用程序根目录中删除我的生成文件夹。 问题修复了。

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

我解决了这个问题在gradle中设置multiDexEnabled true并扩展我的应用程序class MyApp extends MultiDexApplication

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

首先确保在app/build.cradle启用app/build.cradle

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

如果这不能解决问题, 请为您的应用程序启用multidex构build 。

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

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

 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' 

问题在以下链接解释。