记录:Android 5.0 以下的手机出现 java.lang.NoClassDefFoundError,Android 5.0 以上的版本没问题

问题重现:

某年某月的某一天,我把我厂的一个古老的 Android 项目从 Eclipse 转换成转到 AndroidStudio 开发。然后开始开发新功能,看需求文档、看原型图、码代码最后打包给测试妹妹“把玩”这一套动作一气呵成。然后测试妹妹就出现了,拿着一台我国骄傲的华为神机说,为毛你刚才发布的 app 安装到这个手机一打开就崩溃了?纳尼,哥写的 BUG ,哦!不!哥写代码怎么会有这种 BUG。果断把出问题的手机插上我的开发电脑撸之。一打开 APP 果然出现了一个错误。

java.lang.NoClassDefFoundError: cn.jpush.android.api.e

问题分析查找:

一看这个错误 “jpush” 嗯,极光推送的锅。但是仔细一下不对,我厂的另一个 APP 早就使用 AS 开发,而且使用的是同一版本的极光推送,也同样是通过 Eclipse 转 AS 方式开发的。不管是在 5.0 以上或者以下运行都是“纵享丝滑”的。此事必有蹊跷!

再仔细一看 “NoClassDefFoundError” 这货好像和 “ ClassNotfoundException ” 很像啊?但其实这两货是完全不同的东西。

NoClassDefFoundError:Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。
栗子:在运行时我们想调用某个类的方法或者访问这个类的静态成员的时候,发现这个类不可用,
此时Java虚拟机就会抛出NoClassDefFoundError错误。

ClassNotfoundException:在编译的时候在classpath中找不到对应的类而发生的错误

一个是编译时期的错误,一个运行时期的错误。编译时期的错误好说,运行时期的错误,怎么找呢?

编译时期没有问题说明环境变量那些配置没有错,运行时期的问题有可能是 so 库文件没有找到,检查 “ build.gradle ” 文件里面有配置 “ jniLibs.srcDirs = ['libs'] ” ,app 只在 5.0 以下有问题。5.0 及更高版本的 Dalvik 可执行文件分包支持。对!分包,有可能导致代码被分到了多个 dex 包中,导致运行时期找不到对应的代码。

但是我有在 “ build.gradle”中加入了 “ multiDexEnabled true ”,为什么还会出问题呢?这个时候只能祭出神器官方文档了,最后发现是在 " dependencies " 加入如下代码。

dependencies {
    compile 'com.android.support:multidex:1.0.0'
}

然后在 application 中加入:

  @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(base);

    }

总结:

通过这个问题我发现 BUG 天天有,重要的发现解决 BUG 的思路,要善于运用已学习过的知识和手头的工具去解决问题。

文章到这里就已经结束啦!但是我还是有话要说,小弟最近新开了自己的 Blog,虽然文章数量和质量暂时惨不忍睹,我会努力多写文章,好的文章。也希望各位大佬,码界精英们莅临指导工作(吐槽),给小弟的 Blog 增加点人气。先多谢各位啦!

博客地址:http://moguozhou.site/

你可能感兴趣的:(记录:Android 5.0 以下的手机出现 java.lang.NoClassDefFoundError,Android 5.0 以上的版本没问题)