Android热补丁动态修复技术(二):实战!CLASS_ISPREVERIFIED问题!(热修复技术)
转载:http://www.2cto.com/kf/201604/498017.html看到这里可能就会问:为什么之前那么多项目都采用分包方案,但是却不会出现这个错误呢?我在这里总结了一个过程,想知道详细分析过程的请看QQ空间开发团队的原文。在apk安装的时候,虚拟机会将dex优化成odex后才拿去执行。在这个过程中会对所有class一个校验。 校验方式:假设A该类在它的s
·
-
转载:http://www.2cto.com/kf/201604/498017.html
看到这里可能就会问:
在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的类)
为什么之前那么多项目都采用分包方案,但是却不会出现这个错误呢?
我在这里总结了一个过程,想知道详细分析过程的请看QQ空间开发团队的原文。
更多推荐
已为社区贡献5条内容
所有评论(0)