在android中单个dex文件所能包含的最大方法数为65536,这包含android FrameWork、依赖的jar包及应用本身代码的所有方法。当方法数达到65536后,编译器无法完成编译并抛出异常:
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:277)
还有一种情况是,方法数并没有达到65536,编译器也能正常的完成编译,但是应用在低版本手机安装时失败,并抛出异常。这种可能给是低版本的手机缓存区只有5M,虽然方法数没有达到,但是存储空间已经超了。现在3.0以上的系统,一般都是8M或16M。
对于以上问题,google给出了Multidex解决方案,本文只针对android Studio环境配置实现:
1、通过在defaultConfig节中设置multiDexEnabled标签为true,开启multi-dexing支持.
defaultConfig {
...
multiDexEnabled true
...
}
2、在项目的build.gradle文件的dependencies 节中添加分包设置:
dependencies {
...
compile 'com.android.support:multidex:1.0.0'
...
}
3、代码中加入支持Multidex的功能,有三种方案实现:
3.1 在manifest文件中指定Application为MultiDexApplication,如下:
android:name="android.support.multidex.MultiDexApplication"
3.2 应用的Application继承MultiDexApplication,如:
public class ApplicationManager extends MultiDexApplication {
......
}
3.3 不想继承MultiDexApplication,重写Application的attachBaseContext方法,如下:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
重写编译即可成功。