基本概念
热修复(也称热补丁、热修复补丁,英语: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有以下已知问题:
- Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件;
- 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
- 在Android N上,补丁对应用启动时间有轻微的影响;
- 不支持部分三星android-21机型,加载补丁时会主动抛出”TinkerRuntimeException:checkDexInstall failed”;
- 由于各个厂商的加固实现并不一致,在1.7.6以及之后的版本,tinker不再支持加固的动态更新;
- 对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。
如何使用Tinker
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/…流行库比较
库 | 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热修复方案对比文章
相关文章
布丁下发
总结
从目前的文档,技术支持来看微信的Tinker和阿里的HotFix比较好一些,其他的支持相对落后,如果需要接入最好是二选一,出现问题也比较容易解决,当然有些是需要成本的哦;如果作为学习研究那么都研究一下最好了。
THANKS
本文是基于以上开源库,以及优秀文章而总结收集的,首先感谢各位的贡献,如有侵权请联系作者将会及时更正,其次转载请注明出处,已尊重作者的劳动成果。
来源:www.lowett.com