线上热修复技术
没学会、没接触的时候感觉很难,学会了也就没那么难
1.前言
2.相关技术
- 阿里巴巴 AndFix、Dexposed
- QQ空间 超级补丁
- 微信 Tinker
(一)AndFix与hotFix技术
AndFix不同于QQ空间超级补丁技术和微信Tinker通过增加或替换整个DEX的方案,提供了一种运行时在Native修改Filed指针的方式,实现方法的替换,达到即时生效无需重启,对应用无性能消耗的目的。
(二) 超级补丁
超级补丁技术基于DEX分包方案,使用了多DEX加载的原理,大致的过程就是:把BUG方法修复以后,放到一个单独的DEX里,插入到dexElements数组的最前面,让虚拟机去加载修复完后的方法。
修复的步骤为:
1. 通过获取到当前应用的Classloader,即为BaseDexClassloader
2. 通过反射获取到他的DexPathList属性对象pathList
3. 通过反射调用pathList的dexElements方法把patch.dex转化为Element[]
4. 两个Element[]进行合并,把patch.dex放到最前面去
5. 加载Element[],达到修复目的
(三) Tinker
微信针对QQ空间超级补丁技术的不足提出了一个提供DEX差量包,整体替换DEX的方案。主要的原理是与QQ空间超级补丁技术基本相同,区别在于不再将patch.dex增加到elements数组中,而是差量的方式给出patch.dex,然后将patch.dex与应用的classes.dex合并,然后整体替换掉旧的DEX文件,以达到修复的目的。