2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也出现了一些不同的解决方案,如QQ空间补丁方案、阿里AndFix以及微信Tinker,它们在原理各有不同,适用场景各异,到底采用哪种方案,是开发者比较头疼的问题。最近项目里要用热修复技术,调研了许久,算是摸到门路了,和大家分享下,希望这篇文章能给大家些参考,好了,闲话不多说,正文开始..
技术背景
本次调研分别从实现原理,类、so、资源替换,性能损耗,接入流程,修复成功率,兼容性等较多方面比选了四个当
下 主流的框架,由于阿里百川尚未推出hotfix2.0版本,暂时推荐微信团队的tinker
比选框架: QZone补丁方案, 微信团队Tinker, 阿里百川hotfix, 美团Robust
建议大家先了解下dex分包原理,便于大家更好的理解
http://blog.csdn.net/u010386612/article/details/50885320
各框架采用原理分类:
multidex: QZone补丁方案, 微信团队Tinker
native hook: Andfix
Instant Run: Robust
原理简述:
multidex: 把BUG方法修复以后,放到一个单独的DEX里,插入到dexElements数组的最前面,让虚拟机去加载修复完后的方法。
native hook: 运行时在Native修改Filed指针的方式,实现方法的替换,达到即时生效无需重启,对应用无性能消耗的目的
Instant Run: 对每个产品代码的每个函数都在编译打包阶段自动的插入了一段代码,类似于Android Studio Instant Run原理
QZone超级补丁技术
超级补丁技术基于DEX分包方案,使用了多DEX加载的原理,大致的过程就是:把BUG方法修复以后,放到一个单独的DEX里,插入到dexElements数组的最前面,让虚拟机去加载修复完后的方法。
修复原理
整体流程
QZone总结
优势:
没有合成整包(和微信Tinker比起来),产物比较小,比较灵活可以实现类替换,兼容性高。(某些三星手机不起作用)
不足:
1. 不支持即时生效,必须通过重启才能生效。
2. 为了实现修复这个过程,必须在应用中加入两个dex!dalvikhack.dex中只有一个类,对性能影响不大,但是对于patch.dex来说,修复的类到了一定数量,就需要花不少的时间加载。对手淘这种航母级应用来说,启动耗时增加2s以上是不能够接受的事。
3. 在ART模式下,如果类修改了结构,就会出现内存错乱的问题。为了解决这个问题,就必须把所有相关的调用类、父类子类等等全部加载到patch.dex中,导致补丁包异常的大,进一步增加应用启动加载的时候,耗时更加严重。
微信Tinker
微信针对QQ空间超级补丁技术的不足提出了一个提供DEX差量包,整体替换DEX的方案。主要的原理是与QQ空间超级补丁技术基本相同,区别在于不再将patch.dex增加到elements数组中,而是差量的方式给出patch.dex,然后将patch.dex与应用的classes.dex合并,然后整体替换掉旧的DEX,达到修复的目的
修复原理