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地址:github.com/Tencent/tin…
相关视频文档

相关文章

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

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

QZone

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

AndFix

GitHub地址:github.com/alibaba/And…
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
    常见问题及解决方案

    baichuan.taobao.com/docs/doc.ht…

    Robust

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

    其他相关

    Dexposed:github.com/rovo89/Xpos…
    比较文章:blog.zhaiyifan.cn/2015/11/20/…

    流行库比较

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

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

相关文章

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

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

Android 热修复其实很简单

浅谈Android热修复

布丁下发

布丁管理

总结

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

THANKS

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

    原文作者:Android
    原文地址: https://juejin.im/entry/58df77baac502e4957872346
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞