DexIndexOverflowException两种情况的解决方法

1. 概述

在开发过程中,如果项目比较大、引入的第三方库文件比较多、代码特别多等,那么可能会遇到DexIndexOverflowException问题,


图片.png

或者


图片.png

以上问题就是:Dex 64K 问题,意思是Dalvik 当初设计时,单个 Dex最多可以存放65535方法的ID,所以如果方法数过多,就会出现上述问题。

2. 解决方式

1>:第一种: Cannot merge new index 65562 into a non-jumbo instruction!

直接在 app 的 build.gradle 中的 android 中 添加即可

android {
    dexOptions {
        jumboMode = true
    }
}
2>:第二种:method ID not in [0, 0xffff]: 65536

如果报 method ID not in [0, 0xffff]: 65536 这个问题则稍微麻烦一些。谷歌提供了解决方案,把单个巨大的Dex分成多个:

修改build.gradle,添加编译multidex包

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

开启multiDexEnabled:

android {
    defaultConfig {
        multiDexEnabled true
    }
}

修改Application类,这个情况要分成3种:
1.没有创建自定义Application类(使用默认的Application类):
直接配置清单文件AndroidManifest.xml中的节点,添加:

android:name="android.support.multidex.MultiDexApplication"

2.自定义的Application类继承默认的android.app.Application
这种情况把继承类改成android.support.multidex.MultiDexApplication即可

3.自定义的Application类继承别的类,而你无法修改或者不想改:
则要重写attachBaseContext方法:

   @Override 
   protected void attachBaseContext(Context base) { 
      super.attachBaseContext(base); 
      MultiDex.install(this); 
   } 

修改后编译遇到OOM问题

按上面修改编译后出现:

UNEXPECTED TOP-LEVEL ERROR:
java.lang.OutOfMemoryError: GC overhead limit exceeded

修改build.gradle

android {
    dexOptions {
        incremental true
        javaMaxHeapSize "4g"
    }
}

Sync后再次编译即可。

你可能感兴趣的:(DexIndexOverflowException两种情况的解决方法)