热更新你都知道哪些?

热更新系列目录

  1. 热更新你都知道哪些?
  2. 热更新Sophix的爬坑之路
  3. 腾讯热更新Tinker的故事
  4. 阿里热更新Sophix的故事

博客创建时间:2020.05.16
博客更新时间:2021.02.24


前言

首先我们需要明白没有完美的热更新方案,只有更好的热更新方案,热更新不会有100%的成功率。截止2021上半年,我推荐使用Sophix,期待以后有更加强大的类似方案。

热修复因为大量涉及android底层知识,又因为android本身开源,华为vivo小米几大厂商都可能修改底层相关代码,兼容困难。所以热修复技术开发维护难度巨大,人力和时间投入不菲。目前主要有腾讯,阿里等几家互联网大厂因自身刚性需求,实现了此功能。


1. 什么是热更新?

对于“热”这个字从不同的角度会有不同的观点:

  1. 站在app开发者角度的“热”是指在不发版的情况来实现更新。
  2. 从Google提出的“热”是指值无需重新启动。

热更新就是不停机实时更新,HotUpdateHotFix,真正的热更新是不用重启就能更新,在Android 中还不能达到完全的真正热更新。

在热更新出现之前,通过反射注解、反射调用和反射注入等方式已经可以实现类的动态加载了。热更新的实质就是替换,需要替换运行时新的类和资源文件的加载,就可以认为是热操作了。热更新就是一种热操作,它是一种改变app运行行为的技术,其本质就是利用hook操作进行替换,在代码上是一种侵入性的操作。

google和苹果是不支持热更新的,只有在中国特殊国情下才出现了这种黑科技,主要是热更新对程序安全性有一定影响。

为什么需要热更新?
改善用户体验(节省流量、时间、操作程度),快速紧急修复Bug.修复立即生效,是热修复所追求的宗旨。


2. 主流热更新方案

首先我们需要认知没有完美的热更新方案,只有更好的热更新,热更新不会有100%的成功率。截止2020上半年最强大的热更新方案,我推荐使用Sophix。

热修复因为大量涉及android底层知识,又因为android本身开源,华为vivo小米几大厂商都可能修改底层相关代码,兼容困难。所以热修复技术开发维护难度巨大,人力和时间投入不菲。目前主要有腾讯,阿里等几家互联网大厂因自身刚性需求,实现此功能。

热更新的技术方案我将其分为3种:

  1. 腾讯系的热更新方案Tinker、Qzone。Tinker是腾讯系产品中热更新的主力技术。
  2. 阿里系的热更新技术,Andfix、阿里百川Hotfix1.X、Sophix。我们可以按顺序看作是技术方法的逐步升级。Sophix在技术层结合了Tinker和HotFix,吸取了两者之精华和优势,个人认为截止2020.05是目前最简单实用及稳定强大的热更新技术。
  3. 其他厂的热更新方案如美团点评Robust、饿了么 Amigo

在这里插入图片描述


不管多种热更新方案细节有多少不同,其底层的核心路线只有两条类加载替换底层替换
在这里插入图片描述
类加载替换
对于类加载在热更新中的使用,请查看我的另一篇博客《类加载机制原理解析》

底层替换
底层替换是一种nativite方案,其操作是在Native修改Filed指针的方式,实现方法的替换,达到即时生效无需重启,对应用无性能消耗的目的。
在这里插入图片描述
在类被加载后,类中的每个方法都会在虚拟机中对应ArtMethod,Artmethod记录了这个java方法的所属类、访问权限、代码执行内存地址等信息。

通过在运行时利用hook操作native指针,通过这种篡改ArtMethod指针的方式,将补丁方法ArtMethod的成员值逐一赋给旧方法实现替换。所以该种方案能及时生效。

Native修改Filed指针需要在native层进行三步操作:

  • 打开链接库获得操作句柄,获得native层的内部函数,得到ClassObject对象
  • 修改访问权限属性为public
  • 得到新旧方法的指针,新方法指向目标方法,实现方法的替换。

3. 腾讯系热更新

腾讯系的热更新方案主要有Qzone和Tinker两种,分别用于QQ和微信两大App中。关于其介绍请阅读我的博文《腾讯热更新Tinker的故事》


4. 阿里系热更新

腾讯系的热更新方案主要有Qzone和Tinker两种,分别用于QQ和微信两大App中。关于其介绍请阅读我的博文《阿里热更新Tinker的故事》


总结

我只使用过基于Bugly的Tinker和阿里的Sophix两种热更新方案。强烈推荐使用Sophix。为什么不推荐使用Bugly呢,虽然是免费的。

  1. Bugly的热更新免费意味着服务质量差,技术QQ支持群百年无响应,别指望能有技术人员来给你答疑。Sophix使用的是钉钉群进行技术支持,技术支持响应速度和态度简直天壤之别。
  2. 服务器时不时就会有崩溃问题,全量更新,热更新不敢使用了,这服务器宕机实在有损大厂威严
  3. 针对同一版本,Bugly集成的Tinker只能打一次补丁,第二次就失败了。Sophix可以对同一版本进行多次补丁修复
  4. Tinker的接入和打包都比较麻烦,代码侵入性高。Sophix接入简单,傻瓜式打包。
  5. 阿里有一整套的技术开发生态链,我可以服务器、后台、数据库、移动端测试、推送等都可以接入阿里云。
  6. Tinker的补丁包形式是.zip,Sophix的补丁包是.jar形式

相关链接

  1. 热更新你都知道哪些?
  2. 热更新Sophix的爬坑之路
  3. 腾讯热更新Tinker的故事
  4. 阿里热更新Sophix的故事

扩展链接:

  1. ART与Dalvik、JVM之间的关系你懂了吗?
  2. System.exit(0) 与 android.os.Process.killProcess(android.os.Process.myPid())

博客书写不易,您的点赞收藏是我前进的动力,千万别忘记点赞、 收藏 ^ _ ^ !

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值