妖怪般的VerifyError | 奇形怪状的bug

本文探讨了在Android开发中遇到的VerifyError问题,指出该异常源于类加载时字节码验证失败。作者分享了排查过程,包括如何借助Android Studio查看Apk的字节码,并提供了参考资料。问题起因于AndroidX库升级导致的构造函数冲突,特别是在低版本设备上。解决方案涉及字节码操作,文章鼓励开发者多交流学习以提升问题解决能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

任何的Transform的字节都是危险的,所以如果真的觉得自己不能解决所有线上奇奇怪怪的问题,对这门技术还是要慎重。 出自很菜的虾。

如果你是因为这个bug,不幸点入这篇文章,我想说你运气属实不好,那么让我们掌声欢迎这个受害者。

首先我个人觉得这个问题非常难排查和定位,光从堆栈日志来说,你可能会一头雾水。

VerifyError问题排查

首先先看下这个异常的定义。

java.lang.VerifyError 是说 JVM 在加载一个类时,会去校验类的正确性,只有类文件不合法才会报这个Error,这个异常发生在类的加载过程中。

这个问题发生在类的生命周期的过程中。大体上还是和之前我写的那篇文章一个一年没解决的ClassNotFoundException|类加载机制探索这个问题非常类似。这个也是来b之前和字节大佬面试切磋时的一个问题吧,现在回头看看,其实还是受益匪浅,也大概知道这种问题如何去查看和调试了。

问题的本质还是之前说的androidx的升级。因为升级了fragment的版本到1.4.3,对于基础的fragment构造增加了一个有参的构造函数,之后导致了这个奇怪的问题。

在线上灰度的期间,我们发现了4.4的设备有这么个奇怪的crash异常。而在别的系统的设备则都是正常的。之后我们找了一台4.4的设备,发现在release版本的确会出现这个问题,异常情况如下所示。

FATAL EXCEPTION: main
at java.lang.VerifyError: androidx/fragment/app/DialogFragment
at androidx.fragment.app.Fragment.performCreate(Fragment.java:2949)
at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.j
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值