Android java.lang.NoClassDefFoundError解决方法

1、问题描述

在**Android 5.0 **以下的部分机型中会出现没有找到相关类的错误。即:java.lang.NoClassDefFoundError

Android java.lang.NoClassDefFoundError解决方法_第1张图片
错误日志.png

2、问题原因:

随着项目业务越来越多,工程代码越来越大,方法也越来越多。
由于,dexopt 是一个程序,在应用安装的时候,系统会通过 dexopt 来优化 dex 文件,在优化过程中 dexopt 采用一个固定大小的缓冲区来存储应用中所有的方法信息,这个缓冲区就是 LinearAllocLinearAlloc 缓冲区在新版本的android中是 8 MB,或者 16 MB,但是在android2.2android2.3上面只有5mb,当您的apk中的方法数比较多时,尽管它还没有达到 65535 的方法数限制,但是他的存储空间可能已经超过了 5 MB ,这种情况下 dexopt 程序就会报错,从而导致安装失败。
但是在部分 Android4.X 的手机中,可能安装过程是正常的,但是在运行应用过程中,虚拟机解析 dex 文件时,由于单个 dex 中方法数,造成解析过程中丢失部分类。从而出现上面问题中描述的现象。

3、解决方案:

step1:配置build.gradle (app)
注意:

android studiogradle 编译环境中,如果使用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

你可能感兴趣的:(Android java.lang.NoClassDefFoundError解决方法)