Android热补丁动态修复技术(二):实战!CLASS_ISPREVERIFIED问题!(热修复技术)

本文探讨了在Android应用中使用Dex分包技术时遇到的CLASS_ISPREVERIFIED标记错误,并分析了其背后的原因。文章指出,在安装APK时,虚拟机会将Dex文件优化为Odex文件,并在此过程中对所有类进行校验。当某个类在特定类型的函数中直接引用了另一个不在同一Dex文件中的类时,会触发错误。

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

转载:http://www.2cto.com/kf/201604/498017.html



看到这里可能就会问:
为什么之前那么多项目都采用分包方案,但是却不会出现这个错误呢?

我在这里总结了一个过程,想知道详细分析过程的请看QQ空间开发团队的原文。

在apk安装的时候,虚拟机会将dex优化成odex后才拿去执行。在这个过程中会对所有class一个校验。 校验方式:假设A该类在它的static方法,private方法,构造函数,override方法中直接引用到B类。如果A类和B类在同一个dex中,那么A类就会被打上CLASS_ISPREVERIFIED标记 被打上这个标记的类不能引用其他dex中的类,否则就会报图中的错误 在我们的Demo中,MainActivity和Cat本身是在同一个dex中的,所以MainActivity被打上了CLASS_ISPREVERIFIED。而我们修复bug的时候却引用了另外一个dex的Cat.class,所以这里就报错了 而普通分包方案则不会出现这个错误,因为引用和被引用的两个类一开始就不在同一个dex中,所以校验的时候并不会被打上CLASS_ISPREVERIFIED 补充一下第二条:A类如果还引用了一个C类,而C类在其他dex中,那么A类并不会被打上标记。换句话说,只要在static方法,构造方法,private方法,override方法中直接引用了其他dex中的类,那么这个类就不会被打上CLASS_ISPREVERIFIED标记。(可通过字节码技术保证每个类引用其他DEX的类)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值