1、问题描述
在**Android 5.0 **以下的部分机型中会出现没有找到相关类的错误。即:java.lang.NoClassDefFoundError
2、问题原因:
随着项目业务越来越多,工程代码越来越大,方法也越来越多。
由于,dexopt
是一个程序,在应用安装的时候,系统会通过 dexopt
来优化 dex
文件,在优化过程中 dexopt
采用一个固定大小的缓冲区来存储应用中所有的方法信息,这个缓冲区就是 LinearAlloc
。LinearAlloc
缓冲区在新版本的android中是 8 MB,或者 16 MB,但是在android2.2
,android2.3
上面只有5mb,当您的apk中的方法数比较多时,尽管它还没有达到 65535 的方法数限制,但是他的存储空间可能已经超过了 5 MB ,这种情况下 dexopt
程序就会报错,从而导致安装失败。
但是在部分 Android4.X
的手机中,可能安装过程是正常的,但是在运行应用过程中,虚拟机解析 dex
文件时,由于单个 dex
中方法数,造成解析过程中丢失部分类。从而出现上面问题中描述的现象。
3、解决方案:
step1:配置build.gradle (app)
注意:
在 android studio 和 gradle 编译环境中,如果使用multidex,首先要使用 android sdk build tools 21.1 及以上版本。
android {
compileSdkVersion 22
buildToolsVersion "23.3.0"
defaultConfig {
minSdkVersion 15
targetSdkVersion 22
// Enabling multidex support. 开关
multiDexEnabled true
}
dependencies {
// 添加依赖
compile 'com.android.support:multidex:1.1.0'
}
step2:
使用自定义的 Application 继承 MultiDexApplication 这个类,或者重写 Application 的方法 attachBaseContext()
,并调用 MultiDex.install(this)
;
@Override
protected voidattachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(base);
}
step3:
加入该操作之后出现 build 内存溢出处理,在 android{}
模块中加入 dexoptions
。
android {
...
dexOptions{ javaMaxHeapSize "4g"}
...
}
4、Multidex造成的影响:
- 1、应用启动速度会降低,由于用用启动时会加载额外的 dex 文件,将会造成启动速度降低,而且有可能会造成 ANR ,所以尽可能的第二个 dex 不要太大。
- 2、由于 dalvik LinearAlloc 的 bug ,这可能会导致multidex的应用无法在 android4.0 之前的手机上运行。
参考
http://www.jianshu.com/p/d2d6e87e5a42
http://www.jianshu.com/p/8b4f711da0bb
网友评论