Android4.4运行过程中闪退java.lang.NoCla

作者: markRao | 来源:发表于2018-03-22 18:04 被阅读492次

    上周五项目测试时发现一个奇怪的Bug,项目中依赖了一个第三方框架,但是在android4.0-4.4.4之间的系统中运行会直接闪退,抛出错误异常为java.lang.NoClassDefFoundError。
    第一次遇到这样的问题,google了好久找到了以下几个原因:
    该异常表示找不到类定义,当JVM或者ClassLoader实例尝试装载该类的定义(这通常是一个方法调用或者new表达式创建一个实例过程的一部分)而这个类定义并没有找时所抛出的错误。
    [解决方案]:NoClassDefFoundError异常一般出现在编译环境和运行环境不一致的情况下,就是说有可能在编译过后更改了Classpath或者jar包所以导致在运行的过程中JVM或者ClassLoader无法找到这个类的定义。
    1.分dex包编程,如果依赖的dex包删除了指定的类,执行初始化方法时将会报错;
    2.使用第三方SDK或插件化编程时,动态加载或实例化类失败将会报错;
    3.系统资源紧张时,当大量class需要加载到内存的时候,处于竞争关系,部分calss竞争失败,导致加载不成功;
    4.装载并初始化一个类时失败(比如静态块抛 java.lang.ExceptionInInitializerError 异常),然后再次引用此类也会提示NoClassDefFoundErr 错误;
    5.手机系统版本或硬件设备不匹配(如ble设备只支持18以上SDK),程序引用的class在低版本中不存在,导致NoClassDefFoundErr 错误。
    6.so文件找不到,设备平台armeabi-v7a,但是我的so库是放在armeabi中的,解决方法新建一个armeabi-v7a包,并且把armeabi的文件拷贝过来.
    但是,在实际的定位问题的过程中发现并不是总的方法数超出65535,也并不是class竞争失败,最后的问题出在解决方案5,引用的class在低版本中不存在或者说实现可能不同了。
    在这个第三方框架的webView里我调用了


    webView1.png

    但是发现它的最终实现是


    webView2.png
    我猜测找不到类应该是在4.4 -4.4.4运行过程中没有链接到View的实现,从而导致类加载失败,所以解决方案如下
    webView3.png

    相关文章

      网友评论

      • Will_lw:java.lang.NoClassDefFoundError: android.app.AppOpsManager我这个咋解决啊?
        markRao:检查一下代码,应该是在低版本无法找到某个类,判断下系统版本
      • 狂奔的鸡翅膀:哥哥你没有关联SDK源码,
        markRao:@狂奔的鸡翅膀 那是@hint 注解的原因
        狂奔的鸡翅膀:@MarkRao_尋道 我说你看源码的实现时,全部都是throw RuntimeExeption("Stub").因为没有关联源码
        markRao:@狂奔的鸡翅膀 额,不太明白,第三方框架需要关联SDK源码???别的框架我也没有关联啊
      • IT人故事会:贵在坚持,么么哒!我也是个还写文章的人
        IT人故事会:@Android_尋道 互相关注下 哈哈 文章写的不错 老铁
        markRao:@IT人故事会 😊😊😊

      本文标题:Android4.4运行过程中闪退java.lang.NoCla

      本文链接:https://www.haomeiwen.com/subject/vuouqftx.html