Android热修复你想知道的一切都在这里了

基本概念

热修复(也称热补丁、热修复补丁,英语:hotfix)是一种包含信息的独立的累积更新包,通常表现为一个或多个文件。这被用来解决软件产品的问题(例如一个程序错误)[1]。通常情况下,热修复是为解决特定用户的具体问题而制作。– 维基百科

相关解释

热更新和热修复是同一个概念?

Google I/O的Instant Run提出了几个概念:

+ Hot swap - 热替换:无需重启Application、无需启动Activity即可更新Java方法
+ Warm swap - 暖替换:重启Activity可更新Android资源
+ Code swap - 冷替换:重启Application达到更新效果
所以,狭义上来说“热”可以理解为“应用正在跑”,在“正在跑”的时候完成“xx”操作,才可以称之为“热xx”。

安卓代码要达到真正“热”更新的效果,也只有基于AOP这种技术,就是在方法级别这个粒度做替换。
如果是dex级别的,由于Application会缓存加载好的类,所以必须要重启Application,只能算“冷”更新。

所以Small的这条TODO理论上无法实现。现在的解决方案是在用户退到后台时,完成升级操作,基本上可以满足业务场景。这个方案我认为是在Code跟Warm之间 -- “这个更新不太冷”。

当然,现在广义上的“热更新”指的是“不用发版”达到更新的效果。这个也是技术人员比较好向产品等非技术人员吹牛逼的一个点:“看,我这个框架支持热更新”。实际上这里的“热”还不是那么回事.

原理分析

基本概念,原理分析,库分析文章

最全面的 Android 热修复技术
Android 热补丁技术——资源的热修复
Android Patch 方案与持续交付
安卓App热补丁动态修复技术介绍

解决方案

Tinker

Tinker是什么?

Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新。同时也支持更新插件。

结构
  • gradle编译插件: tinker-patch-gradle-plugin
  • 核心sdk库: tinker-android-lib
  • 非gradle编译用户的命令行版本: tinker-patch-cli.jar
由于原理与系统限制,Tinker有以下已知问题:
  1. Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件;
  2. 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
  3. 在Android N上,补丁对应用启动时间有轻微的影响;
  4. 不支持部分三星android-21机型,加载补丁时会主动抛出”TinkerRuntimeException:checkDexInstall failed”;
  5. 由于各个厂商的加固实现并不一致,在1.7.6以及之后的版本,tinker不再支持加固的动态更新;
  6. 对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。
如何使用Tinker
  1. 快速接入,快速接入指南
  2. 自定义类自定义扩展
  3. API预览API概览
  4. 其他问题常见问题
  5. 布丁下发平台参考文档

GitHub地址:https://github.com/Tencent/tinker
相关视频文档

相关文章

微信Tinker负责人张绍文关于Android热修复直播分享记录
微信Android热补丁实践演进之路
Tinker MDCC会议 slide(微信热修复演进PDF)
微信Android热补丁实践演进之路
微信Tinker的一切都在这里,包括源码(一)
Android_N混合编译与对热补丁影响解析
【Dev Club 分享第六期】微信热补丁 Tinker 的实践演进之路
Tinker Dexdiff算法解析
DexDiff格式查看工具
RT下的方法内联策略及其对Android热修复方案的影响分析

微信动态库下发支持:
http://tinkerpatch.com/Docs/intro

QZone

GitHub地址:https://github.com/jasonross/Nuwa
Android 热补丁技术的探索与简单实战—-Qzone方案 http://blog.csdn.net/u012760183/article/details/52050789

AndFix

GitHub地址:https://github.com/alibaba/AndFix
Android热修复实践应用–AndFix

阿里百川HotFix

当前版本:Hotfix2.0
开源:否
官方文档
Android Hotfix2.0集成文档

HotFix总体来说最大的优势在于:
  • 补丁即时生效,不需要应用重启;
  • 补丁包同样采用差量技术,生成的PATCH体积小;
  • 对应用无侵入,几乎无性能损耗;
  • 傻瓜式接入。
    已知问题
  • 暂时不支持新增方法, 新增字段, 但是支持新增类, 所以需要新增方法/字段可以通过新增类来实现
  • 不支持资源修复, so修复
  • 三星note3,S4,S5的5.0设备以及X86设备不支持(点击查看具体支持的机型)
  • 参数包括long,double,float基本类型的方法不能被patch, 不包括基本类型封装类Long,Double,Float
  • 被反射调用的非静态方法不能被patch
  • 参数超过8的方法不能被patch
  • 构造方法不能被patch
  • 使用注解的方法视情况而定是否支持被patch(详细说明参考Demo工程BaseBug.md文件中关于注解的说明)
  • 泛型参数的方法如果patch存在兼容性问题
  • 在打包的时候偶尔会存在两次打包内部类的名字不一致问题,这种情况会导致打AndFix打包失败,暂时无解
  • 我们建议不要通过GooglePlay发布带热修复SDK的APP,存在政策风险
  • 暂不支持android7.0
    常见问题及解决方案
    http://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.yuJdBV&treeId=234&articleId=105843&docType=1

    Robust

    GitHub地址:https://github.com/Meituan-Dianping/Robust
    Android热更新方案Robust

    其他相关

    Dexposed:https://github.com/rovo89/Xposed
    比较文章:http://blog.zhaiyifan.cn/2015/11/20/HotPatchCompare/

    流行库比较

Tinker QZone AndFix Robust
类替换 yes yes no no
So替换 yes no no no
资源替换 yes yes no no
全平台支持 yes yes yes yes
即时生效 no no yes yes
性能损耗 较小 较大 较小 较小
补丁包大小 较小 较大 一般 一般
开发透明 yes yes no no
复杂度 较低 较低 复杂 复杂
gradle支持 yes no no no
Rom体积 较大 较小 较小 较小
成功率 较高 较高 一般 最高

注:表格来源Tinker文档,阿里也有类似比较,仅供参考
Diycode热修复方案对比文章

相关文章

Android热修复技术选型——三大流派解析

Android热补丁动态修复框架小结

Android 热修复其实很简单

浅谈Android热修复

布丁下发

布丁管理

总结

从目前的文档,技术支持来看微信的Tinker和阿里的HotFix比较好一些,其他的支持相对落后,如果需要接入最好是二选一,出现问题也比较容易解决,当然有些是需要成本的哦;如果作为学习研究那么都研究一下最好了。

THANKS

本文是基于以上开源库,以及优秀文章而总结收集的,首先感谢各位的贡献,如有侵权请联系作者将会及时更正,其次转载请注明出处,已尊重作者的劳动成果。
来源:www.lowett.com

坚持原创技术分享,您的支持将鼓励我继续创作!