您的位置:首页 > 其它

DexIndexOverflowException两种情况的解决方法

2017-07-25 10:32 597 查看
 


DexIndexOverflowException两种情况的解决方法

标签: exceptionDEX-64KOverflowindexmethod
2016-04-03 16:25 1542人阅读 评论(0) 收藏 举报


 分类:

android开发(20) 


目录(?)[+]

如果你的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后再次编译即可。


声明

原创文章,欢迎转载,请保留出处。
有任何错误、疑问或者建议,欢迎指出。
我的邮箱:Maxwell_nc@163.com


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐