概述
Android Dalvik可执行文件.dex中的Java方法数引用超过65536,64k的计算方法是65536除以1024,65K的计算方法是65536除以1000
原因
dex限制了程序的最大方法数是65535,如果超过最大限制,无法编译.
Android 5.0 之前的版本
谷歌出了一个名为MultiDex Support Library的库
Android 5.0 之后的版本
Android试用了名为ART的虚拟机来代替Dalvik虚拟机,ART支持从APK文件中加载多个.dex文件.
在安装期间,他会执行一个预编译操作,对.dex文件编译成一个个单一的.oat文件,在运行应用时去加载.oat文件,而不是.dex文件
解决方案一 减少方法数
不建议使用MultiDex Support Library来将APK中单一的dex拆分成多个,从而规避64k方法数限制引起的变异错误 ,因为会在大多数情况下降低应用的性能
1.减少不必要的依赖,对于lib的体积,方法数,性能进行考察,选择合适的库
2.使用Proguard移除无用的代码,配置并在Release版本中使能ProGuard,它的压缩功能通过分析字节码,能够检测并移除没有使用到的类,字段,方法和属性,
解决方案二 使用MultiDex
配置
在 Application Module 的build.gradle文件 增加对MultiDex的依赖
defaultConfig{
multiDexEnabled true
}
dependencies{
compile "com.android.support:multidex:1.0.1"
}
三种情况
1.如果项目没有自定义Application的类,只需要在AndroidManifest,xml文件使用MultiDexApplication替换Application即可,
android:name="android.support.multidex.multiDexApplication"
##### 2.如果应用已经有了自定义Application 那么让他继承MultiDexApplication
##### 3.如果不像或者不能修改他的父类,那么覆写attachBaseContext方法初始化MultiDex
>```
protected void attchBaseContext(Context context){
super.attchBasaeContext(context);
MultiDex.install(this);
}
总结
MultiDex在开发阶段会机打的影响到开发效率,建议最小支持5.0防止64k问题的发生,如有必要兼容Android 5.0以下版本,请充分做好测试.