如果你的Android项目足够大,又或者你引用了许多第三库,那么一定会遇到DexIndexOverflowException,在Gradle构建时报错:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: Cannot merge new index 65562 into a non-jumbo instruction!
或者是:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
这就是著名的DEX 64K问题,据说是Dalvik当初设计单个DEX最多可以存放65536方法的ID,所以如果方法数过多就会出现这个问题。上述异常的两种情况要分开处理。
第一种non-jumbo instruction
如果报 Cannot merge new index 65562 into a non-jumbo instruction!
这个问题则很容易解决,直接修改build.gradle,清理项目后重新sync编译:
android {
dexOptions {
jumboMode = true
}
}
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
第二种 method ID not in [0, 0xffff]: 65536
如果报 method ID not in [0, 0xffff]: 65536
这个问题则稍微麻烦一些。谷歌提供了解决方案,把单个巨大的Dex分成多个:
修改build.gradle,添加编译multidex包
dependencies {
compile 'com.android.support:multidex:'
}
- 1
- 2
- 3
- 1
- 2
- 3
开启multiDexEnabled:
android {
defaultConfig {
multiDexEnabled true
}
}
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
修改Application类,这个情况要分成3种:
1.没有创建自定义Application类(使用默认的Application类):
直接配置清单文件AndroidManifest.xml中的<application>
节点,添加:
android:name="android.support.multidex.MultiDexApplication"
- 1
- 1
2.自定义的Application类继承默认的android.app.Application
:
这种情况把继承类改成android.support.multidex.MultiDexApplication
即可
3.自定义的Application类继承别的类,而你无法修改或者不想改:
则要重写attachBaseContext
方法:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
修改后编译遇到OOM问题
按上面修改编译后出现:
UNEXPECTED TOP-LEVEL ERROR:
Java.lang.OutOfMemoryError: GC overhead limit exceeded
修改build.gradle
android {
dexOptions {
incremental true
javaMaxHeapSize "4g"
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
Sync后再次编译即可。
本文转载自:http://blog.csdn.net/maxwell_nc/article/details/51050700;