关于java.lang.VerifyError的另外一种错误原因

Android开发过程中,碰到了一个crash bug,照理说,程序开发碰到crash没什么大不了,看堆栈定位原因,然后解决即可。

但是这个堆栈刚看到的时候,还是愣了一下,如下:

关于java.lang.VerifyError的另外一种错误原因_第1张图片

报了一个java.lang.VerifyError,第一步当然是看堆栈,但是这堆栈完全不在我们自己代码空间里,看上去像是启动Application的时候就挂了,照理google和baidu都搜索了一下,

网上说的最多的是jar包导入设置的问题,调整下order and export;也有说是android sdk的版本问题,但是我们用的是android studio,不存在这个order and export。而且从代码开发更新来看,也不像是这个问题,因为配置没改过。

网上那些方法显然不管用,只能自己找原因,再往上找看看有没有其它有用信息,果然在crash之前还有以下的提示信息:

关于java.lang.VerifyError的另外一种错误原因_第2张图片

看到了一条比较有价值的提示,unable to find class referenced in signature ,后面的类名涉及公司程序,去掉了。

看来应该是在dex里没找到对应的那个类,这个时候,我想起来了,最近项目新增加了一个比较大的第三方sdk,导致程序又庞大了不少,原来程序就因为API数超过了64K,而分成了两个dex, 用的是MultiDex,自动打包成class.dex和class2.dex.

逆向解压编译的APK,发现提示那个找不到的class,果然不在class.dex中,而是在class2.dex中。原因是找到了,我们把打包顺序改一下,或者调用顺序改一下即可解决问题。


这里给这类java.lang.VerifyError的crash又提供了一种情况,如果是你的apk也是很庞大时,碰到此类问题,也可以往这方面检查检查,最简单的方法就是在class.dex里找找看,是否存在那个提示找不到的类。


你可能感兴趣的:(关于java.lang.VerifyError的另外一种错误原因)