原因:
**
Dalvik可执行文件.dex中的Java方法数引用超过65536,64k的计算方法是65536除以1024,65K的计算方法是65536除以1000,如果方法数超过64k编译器编译将无法通过.
解决原理:分包
**
但是现在一个大的应用,尤其是集成第三方库的,很容易超过这个数目,所以Android 5.0 之后的版本谷歌试用了名为ART的虚拟机来代替Dalvik虚拟机,ART支持从APK文件中加载多个.dex文件. 在安装期间,他会执行一个预编译操作,对.dex文件编译成一个个单一的.oat文件,在运行应用时去加载.oat文件,而不是.dex文件
解决方法:
1: 在Module中的bulid.gradle中添加: multiDexEnabled true**
android {
defaultConfig {
minSdkVersion 17
targetSdkVersion 25
versionCode 1
versionName "1.0.0.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
2:在Module中的bulid.gradle中添加:**compile ‘com.android.support:multidex:1.0.1’
dependencies {
/**第三方依赖库**/
compile 'com.android.support:multidex:1.0.1'
}
3:在的的Application中,onCreate方法里, super.onCreate()方法之前调用
MultiDex.install(this);
public class MyApplication extends Application {
@Override
public void onCreate() {
MultiDex.install(this);
super.onCreate();
}
}
碎碎念:
不建议使用MultiDex Support Library来将APK中单一的dex拆分成多个,从而规避64k方法数限制引起的变异错误 ,因为会在大多数情况下降低应用的性能
- 减少不必要的依赖,对于lib的体积,方法数,性能进行考察,选择合适的库
- 使用Proguard移除无用的代码,配置并在Release版本中使能ProGuard,它的压缩功能通过分析字节码,能够检测并移除没有使用到的类,字段,方法和属性,