DexIndexOverflowException两种情况的解决方法

如果你的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

第二种 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.0.1' 
}
 
 
  • 1
  • 2
  • 3

开启multiDexEnabled:

android {
    defaultConfig {
        multiDexEnabled true
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5

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

android:name="android.support.multidex.MultiDexApplication"
 
 
  • 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

修改后编译遇到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

Sync后再次编译即可。


出处:http://blog.csdn.net/maxwell_nc/article/details/51050700

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值