本来准备在后续的文章中,陆续写下自己对现有的热修复框架(主要为Qzone团队方案和阿里的AndFix)原理的理解,以方便自己日后查看,不过今天看到新的文章微信Android热补丁实践演进之路,感觉微信团队的技术真是强大,研究的很深入透彻,对之前的方案又有了新的认识。下面只是简要的记下自己的一些认知吧。
- QZone方案
QQ空间团队的方案github上有很多扩展的项目,不过大致原理应该是类似的。在(二)中我们看到multidex是利用了DexPathList的Element[],通过反射在把映射了其它dex的Element和之前的数组合并到新的数组,然后反射设置回DexPathList,从而达到动态加载多个dex的目的。
而QQ空间团队不光是改变了Element[]的大小,而且还把后来增加的插入到数组的最前面,这样就会先加载后来增加的dex。如果增加的Element里面有之前Element包含的类,则会替换掉之前Element里相同的类,因为的DexPathList的findClass()
方法在前面的Element成功加载类后,就直接返回了,后面的Element根本没机会去加载这个类,这个在(一)中有讲过。
这个原理很简单,但是实践中总会出现很多没有预期的问题。apk安装的时候apk中的classes.dex会被虚拟机(dexopt)