热更新系列目录

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

Android热更新

  • 前言
  • 1. 什么是热更新?
  • 2. 主流热更新方案
  • 3. 腾讯系热更新
  • 4. 阿里系热更新
  • 总结

博客创建时间: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())

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

热更新你都知道哪些?相关推荐

  1. Unity3D热更新技术点——ToLua(上)

    注: 本文主要介绍tolua的基本原理及其在unity中的使用,希望阅读本文的读者有lua基础,可通过Lua教程 (其中也有IDE的推荐等)或其他途径先进行lua 的学习 热更新 在介绍tolua前, ...

  2. unity python热更新_Unity热更新介绍和测试方法

    最近项目中增加了热更新了功能,程序也完成了相应的开发,接下来就需要对这个模块进行相应的测试工作了,在测试开始之前,了解下其原理总是很有好处的. 1:什么是热更新 简单的理解就是:用户重启客户端就能实现 ...

  3. SDK全局热更新方案(全网唯一)

    大家好,我是拭心,这篇文章是一个好友 Divin 的投稿,介绍 SDK 热更新的一种实现思路,希望对你有所启发. 一.背景 App热更新 目前市面上成熟的商业热更新方案不少,有腾讯Bugly的Tink ...

  4. 【热更新】游戏热更新方案

    游戏热更新方案 热更新演化 热更新方案 [1] 进程切换 1.1 利用fork.exec切换 1.2 利用网关切换 1.3 微服务 - 进程切换注意要点 [2] 动态库替换 [3] 脚本语言热更新 热 ...

  5. Android 腾讯Bugly使用(异常上报,全量升级,热更新)

    1.0.1腾讯Bugly使用(异常上报,全量升级,热更新) 说明 Bugly全量升级,热更新以及异常上报是一起集成的,还包括运营统计,本文档着重演示热更新功能. 接入步骤 1.在Project的bui ...

  6. webpack热更新原理-连阿珍都看懂了

    前言 在旧开发的时代,前端项目在开发的过程中修改代码,很有可能是手动切到浏览器刷新页面来看到改动效果.操作不方便且页面之前的编辑记录也都丢失,体验可以说为0.想象一下一个表达你努力填满了所有输入项,结 ...

  7. 苹果禁止使用热更新 iOS开发程序员新转机来临

    今天本是女神们的节日,所有iOS程序员沸腾了!原因是苹果爸爸发狠了,部分iOS开发者收到了苹果的这封警告邮件: [图一 苹果邮件] 消息一出,一时间众多开发者众说纷纭,以下是来源于网络的各种看法: 有 ...

  8. 热更新 FrameWork

    工作中遇到想要绕过AppStore直接更新App的要求!这里友情提示下,看了很多资料只是是实现了功能,但在项目中并没有真正用到!资料大多都显示会被拒,这个说的是个人级的,好像企业级的不会这样,仅仅是项 ...

  9. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用原型链和EventTrigger

    原型链是JS的必备,作为ECMAScript4,原型链也是支持的. 特别说明,ActionScript3是支持完整的面向对象继承支持的,原型链只在某些非常特殊的情况下使用. 本文旨在介绍如何使用原型链 ...

最新文章

  1. maven 下载 源码和javadoc命令
  2. 【正则表达式1】C++11正则表达式
  3. Ibatis2到mybatis3的转变1
  4. (NFS)mount.nfs: access denied by server while mounting localhost:/home/xuwq/minilinux/system
  5. php接口返回一个数组怎末写_php api返回json数组
  6. pip 安装 tensoflow
  7. category与extension
  8. 28.Linux/Unix 系统编程手册(上) -- 详述进程创建和程序执行
  9. atlas 力矩计算_Atlas 2.1.0 实践(2)—— 安装Atlas
  10. 文件已被占用的解决方法
  11. 超详细,手把手 教你 SQLyog 安装教程
  12. MATLAB代码:电-气-热综合能源系统耦合优化调度 关键词:综合能源系统 优化调度 电气热耦合 主要内容:代码主要做的是一个考虑电网、热网以及气网耦合调度的综合能源系统优化调度模型
  13. 全球及中国电力行业建设策略与十四五供需战略规划报告2021-2027年
  14. 非洲正在打造一个完全不同的人工智能产业
  15. WPF学习之绘图和动画--DarrenF
  16. 五笔打字怎么学,负基础
  17. 关于python搞笑段子精选_搞笑却有哲理的段子
  18. CSS实验案例02简单专业介绍网页
  19. 理解CTP/XTP柜台对接
  20. 2021-4-19学习笔记

热门文章

  1. 《用计算机画画》教学设计,第8课《简简单单画幅画》教学设计
  2. 广告屏蔽案件的中美相关司法实践初探
  3. 万能通用!权限系统就该这么设计!
  4. 休闲一下---沙雕朋友圈的日常
  5. Android12之OpenSL ES中IObject_GetInterface获取引擎接口(十五)
  6. html防止浏览器表单自动填充,禁止浏览器input表单自动填充
  7. mSystems | 中农汪杰组揭示影响土壤“塑料际”微生物群落的机制
  8. ppt输出图片更改分辨率设置
  9. 【AMD、CMD和CommonJS】
  10. 树莓派开箱点亮(无屏幕)