更新到最新的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.0
到20.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' }
同样在你的Manifest
将MultiDexApplication
类从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'
问题在以下链接解释。