code小生,一个专注 Android 领域的技术分享平台
作者:MarkRao_尋道
链接:https://www.jianshu.com/p/aebaaff5c2f7
声明:本文是 MarkRao_尋道 原创,转载等请联系作者获得授权。
前言
上周五项目测试时发现一个奇怪的 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 里我调用了
但是发现它的最终实现是
webView2我猜测找不到类应该是在 4.4 -4.4.4 运行过程中没有链接到 View 的实现,从而导致类加载失败,所以解决方案如下
webView3