参考:安卓App热补丁动态修复技术介绍——QQ空间终端开发团队
android分包方式:
1、dex分包;
2、插件化;
热更新相比插件化多做了两件事:
1、防止相关类打上CLASS_ISPREVERIFIED标签,就可以抢先加载旧的bug类;
2、热修复动态加载BaseDexClassLoader对象间接引用的DexElements;
总结:热修复是在插件化的基础上进行替换旧的bug类。
类加载最主要的是两个类:PathClassLoader和DexClassLoader
PathClassLoader只能去加载已经安装到Android系统中的apk文件
DexClassLoader可以用来从.jar和.apk类型的文件内部加载classes.dex文件
关于类是如何被打上CLASS_ISPREVERIFIED标签的?
虚拟机在启动的时候,会有许多的启动参数,其中一项就是verify选项,当verify选项被打开的时候,doVerify变量为true,那么就会执行dvmVerifyClass进行类的校验,如果dvmVerifyClass校验类成功,那么这个类会被打上CLASS_ISPREVERIFIED的标志!!
关于dvmVerifyClass类中的代码内容,主要是关于两个:
1、clazz->directMethods
2、clazz->virtualMethods
其中directMethods中涉及到的方法有statics方法、private方法、构造函数,而virtualMethods中涉及到的方法是override方法。
以上方法中直接饮用到的类和clazz都在同一个dex中的话,就会被打上CLASS_ISPREVERIFIED标签。
策略:往所有的类(Application除外)的构造方法中加入AntilazyLoad.class
不在Application中加入主要是因为dex分包也是在Application中加载的,如果在这里加载AntilazyLoad.class,势必会无法找到该类,就会有异常。
隐患:
当然了,android系统一开始设计CLASS_ISPREVERIFIED标签的意图肯定是为了提高性能,我们这样修改会不会对性能有所影响呢?不好说,但是因为现在很多大项目都已经采用了这种方式,性能问题应该是可以放心的