20220701

什么是热修复
定义:在我们应用上线后出现bug需要及时修复时,不用再发
新的安装包,只需要发布补丁包,在客户无感知下修复掉bug。

目前比较流行的热修复方案有微信的 Tinker,手淘的 Sophix,美团的 Robust,以及 QQ 空间热修复方案。

实例
Tinker框架:开源
微信——开源——冷启动修复
地址:https://github.com/Tencent/tinker
介绍
Tinker是适用于Android的修补程序库,它支持dex,库和资源更新,而无需重新安装apk。
使用
该框架最后一次的更新时间是2021年4月19日,详细使用说明可以参考官方文档。

Tinker 的实现过程更像是在 Qzone 热修复方案上做优化。核心点是性能最优,消耗最低。

优点
补丁包较小,消耗较小;
开发透明,文档丰富。

缺点
占用 ROM 较大;
需要重启才能生效。

1、Tinker不支持修改AndroidManifest.xml;
2、Tinker不支持新增四大组件;
3、在Android N上,补丁对应用启动时间有轻微的影响;
4、不支持部分三星android-21机型,加载补丁时会主动抛异常;
5、在1.7.6以及之后的版本,tinker不再支持加固的动态更新;
6、对于资源替换,不支持修改remoteView。例如transition动画,notification
icon以及桌面图标。
7、任何热修复技术都无法做到100%的成功修复。

Sophix框架:未开源
阿里——未开源(商业收费)——实时修复+冷启动修复
介绍
Sophix的核心设计理念,就是非侵入性。
我们的打包过程不会侵入到apk的build流程中。我们所需要的,只有已经生成完毕的新旧apk,而至于apk是如何生
成的——是Android Studio打包出来的、还是Eclipse打包出来的、或者是自定义的打包流程,我们一律不关心。
在生成补丁的过程中间既不会改变任何打包组件,也不插入任何AOP代码,我们极力做到了——不添加任何超出开
发者预期的代码,以避免多余的热修复代码给开发者带来困扰。

在Sophix中,唯一需要的就是初始化和请求补丁两行代码,甚至连入口Application类我们都不做任何修改,
这样就给了开发者最大的透明度和自由度。我们甚至重新开发了打包工具,使得补丁工具操作图形界面化,
这种所见即所得的补丁生成方式也是阿里热修复独家的。因此,Sophix的接入成本也是目前市面上所有方案里最
低的。

这种非侵入式热更新理念,是我们在设计过程中从用户使用角度进行了深入思考而提炼出的核心思想。
这里的用户,指的自然是广大的开发者。对于开发者而言,热修复应该是一个与业务无关的SDK组件,
在整个开发过程中感知不到它的存在。最理想的情况,就是开发者拿过来两个apk,一个是已经安装在手机上的
apk,另一个是将要发布出去的apk。我们直接通过工具,就可以根据这两个apk生成补丁,然后把这个补丁下发
给已经安装的旧app上,就可以直接加载,使旧app重生为新的app。而这个加载了补丁包新app,在功能和使用上
,将会和直接安装新apk别无二致。
至于Sophix这个名字,是来源于Sophic(明智的)+ FIX,一个更明智的热修复方案。
使用
该框架商用,每个账号可以有免费使用设备5万。

Sophix 不但支持即时修复,还支持再次启动修复类、so 文件、资源等。
作为商用 APP 集成 Sophix 是很好的选择。

Robust框架:Star 4k   开源
美团——开源——实时修复
地址:https://github.com/Meituan-Dianping/Robust
介绍
Robust是美团开发的一套热更新方案,它是基于Instant Run原理开发的一套新框架,相比于Tinker这种改变
DexElements加载顺序的方式只能重启生效,robust实现了对代码修改的实时生效(热插拔)。
使用
该框架最后一次的更新时间是2020年4月13日,详细使用说明可以参考官方文档。

Qzone超级补丁框架:
QQ空间——未开源——冷启动修复
介绍
Qzone 超级补丁技术基于dex分包方案,使用了多dex加载(multidex)的原理,大致的过程就是:
把BUG方法修复以后,放到一个单独的dex文件,然后插入到dexElements数组的最前面,
让虚拟机去加载修复完后的方法。

QFix框架:
手Q团队——开源——冷启动修复
介绍
QFix 是手Q团队推出的一种新的 Android 热补丁方案,在不影响 App 运行时性能(无需插桩去 preverify)
的前提下有效地规避了 dalvik 下”unexpected DEX”的异常,而且还是很轻量级的实现:只需调用一个很简单
的方法就能办到。

功能       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和Sophix比较有优势,并且都提供布丁部署服务,不过从售后还有成本上面来讲,
Sophix相对比较符合我们的预期。

阿里系:DeXposed、andfix:从底层二进制入手(c语言)。
腾讯系:tinker:从java加载机制入手。

Sophix热修复框架相比之前的热修复框架(Tinker,AndFix,QZone,Robust)有几项优势
一.
Sophix集成方式极其简单,相比之前的Tinker及其他的框架配置简单很多,这无疑大大提升了开发者的开发
销率
二.
Sophix补丁自动生成包生成的补丁具有安全性,可以概括为两点
1. 在old.apk与new.apk比较差异之后生成的补丁包可配置相应的AESKey,所以不用担心阿里云移动平台会利用
你们的补丁做一些非法的事情。
2. 在old.apk与new.apk比较差异之后生成的补丁包是以.jar呈现给开发者的,这就意味着这种方式能够在一定
条件下避免被运营商的劫持而导致的补丁在某些特定的机型热修复失效的情况。

对比的劣势
- Sophix平台下发的补丁在我本人的三星C9Pro上,可以加载出下发的补丁,但是我强制杀死App之后,
补丁包的代码就无效了,已经提交GitHub issus 目前未解决原因,之后我会通过Sophix调试工具V3来对错误
码进行排查开解决这个问题。
- Sophix平台与Tinker平台是按用户计量计费,属于资费平台,用户<1W皆都免费,
当>1W那么都是一样的。

     1. 使用成熟框架的优点:
   (1)成熟的框架往往集成了很多功能,而且有非常多的帮助文档和资料,很有利于快速开发;
   (2)成熟框架封装了底层代码,避免因失误操作底层代码而出问题;
   (3)成熟框架都是千锤百炼,所以性能都不错;
   (4)开发效率高,在开发中,有一些问题可能是你工作中一直遇不到的,
           但是在成熟框架中其实早就有了解决方案;

       2. 使用成熟框架的缺点:
     (1)由于有些框架集成的功能不是你需要的功能,所以造成效率低;
     (2)如果对框架不熟悉,那么在调试代码时难度较大;
     (3)框架的使用会弱化我们对基础知识的学习;