导语

什么是热修复?热修复又称热补丁,一般是用事先定义好的接口,从网络下载代码并更新客户端代码,从而在用户无感知、也无需重装App的情况下,实现动态修复或动态更新。这样带来的优势就是成本低、效率高,快速作用,节省应用发布时间,缩短开发周期,降低开发成本;方便数据统计和测试反馈,有利于更好地改进App。

 

正常的流程:

android root 热修复 android最新热修复_android root 热修复

热修复流程:

android root 热修复 android最新热修复_热修复_02

热修复特点:

  • 无需重新发版,实时高效热修复;
  • 用户无感知修复,无需下载新的应用,代价小;
  • 修复成功率高,把损失降到最低。

一、开源流行方案对比:

如今的热修复技术可谓是百花齐放,每个产品都各有优势和特点,不过各自都存在局限性,或不稳定、或补丁大、或效率低、或接入繁琐,大部分技术上看起来似乎可行,但实际体验并不好。大体上从Githup星评能直观了解到各大平台方案受欢迎程度,即开发者信赖程度。

方案名称

方案开发公司 

     开发时间

             Github星评

Robust

美团(Java派系)

2016年

2500

Andfix

阿里(Native派系)

2015年

5994

Nuwa

           大众点评(dex文件补丁)

2015年

2880

Dexposed

阿里(不考虑,需要root权限)

 

 

Amigo

饿了么(apk补丁)

2016年

1231

Tinker

微信(apk补丁)

2016年

11259

RocooFix

百度金融(Nuwa改进版)

2016年

1599

1、美团Robust,基于Instant Run的原理兼容性高,实时生效,但是apk的体积会增大,so和资源的替换暂时不支持,侵入式打包,且接入复杂。

2、女娲Nuwa,坑比较多,比如不支持Gradle1.5以上、补丁包没有签名校验、字节码注入复杂,维护成本高。

3、QQ空间QZone,兼容性高,侵入式,不即时生效,混淆对性能会有一定的影响,且在Art模式下出现内存错乱(是Tinker在MDCC上指出的);

4、饿了么Amigo,目前使用人数最少,网上可参考资料太少,几乎查不到优接入经验和踩坑经验的文章。

平台

HotFix

AndFix

Tinker

Qzone

Robust

即时生效

yes

yes

no

no

yes

性能损耗

较小

较小

较小

较大

较小

侵入式打包

无侵入式打包

无侵入式打包

依赖侵入式打包

依赖侵入式打包

依赖侵入式打包

Rom体积

较小

较小

Dalvik较大

较小

较小

接入复杂度

傻瓜式接入

比较简单

比较复杂

比较简单

复杂

补丁包大小

较小

较小

较小

较大

一般

全平台支持

yes

no

yes

yes

yes

类替换

yes

yes

yes

yes

no

so替换

yes

no

yes

no

no

资源替换

yes

no

yes

yes

no

 

一、阿里热修复

方案对比 

Andfix开源版本 

阿里Hotfix 1.X

阿里Hotfix 最新版 (Sophix)

方法替换 

支持,除部分情况

支持,除部分情况 

全部支持

方法增加减少 

不支持

不支持

以冷启动方式支持

方法反射调用 

只支持静态方法

只支持静态方法

以冷启动方式支持 

即时生效 

支持

支持

视情况支持

多DEX 

不支持

支持

支持

资源更新 

不支持

不支持

支持

so库更新 

不支持

不支持

支持

Android版本 

支持2.3~7.0

支持2.3~6.0 

全部支持包含7.0以上

已有机型 

大部分支持

大部分支持 

全部支持

安全机制 


加密传输及签名校验

加密传输及签名校验

性能损耗 

低,几乎无损耗

低,几乎无损耗

低,仅冷启动情况下有些损耗

生成补丁 

繁琐,命令行操作

繁琐,命令行操作

便捷,图形化界面

补丁大小 

不大,仅变动的类

小,仅变动的方法

不大,仅变动的资源和代码

服务端支持 


支持服务端控制

支持服务端控制

1、AndFix(开源):阿里热修复从支付宝推出AndFix热修复方案的引起业界广泛关注。Andfix是一种Native底层结构替换的方案,达到了运行时生效即时修复的效果。但Andfix本身具有局限性,且不说其底层固定结构的替换方案稳定性不好,其使用范围只提供了代码层面的修复,对于资源和so的修复都还未能实现。

优点:

        1. 不侵入打包, 性能无损耗;    

        2. 即时生效。
缺点:

    1. 需要考虑指令集的兼容问题,需要native代码支持,兼容性上会有一定的影响; 

    2. 不支持新增类方法和字段,以及修改<init>方法,也不支持对资源和so的替换。

HotFix2.0总体来说最大的优势在于:

  • 补丁即时生效,不需要应用重启;
  • 灵活切换热部署和冷部署的方案;
  • 实现了资源、SO文件、类修复的实时生效;
  • 补丁包体积小,可视化UI界面操作;
  • 对应用无侵入,几乎无性能损耗;
  • 兼容Android所有机型,傻瓜式接入。

产品收费问题,阿里百川HotFix在2.0版本的规划完全实现前完全免费,可放心使用。

3、Sophix(Hotfix3.0):在2017年6月11日,手淘技术团队联合阿里云正式发布了史上首个非侵入式移动热更新解决方案。核心设计是非侵入性,即不添加任何超出开发者预期的代码,以避免多余的热修复代码给开发者带来困扰,给了开发者最大的透明度和自由度,接入成本在所有方案里最低的。
Sophix提供了一套更加完美的客户端服务端一体的热更新方案,做到了图形界面一键打包、加密传输、签名校验和服务端控制发布与灰度功能,让你用最少的时间实现最强大可靠的全方位热更新。这也是Hotfix3.0开始收费的原因。

下面是Sophix与Tinker和Amigo方案对比:

android root 热修复 android最新热修复_android_03

目前,Sophix在各个指标上全面占优。唯一不足的是不支持的地方就是四大组件的修复。这是因为如果要修复四大组件,必须在AndroidManifest里面预先插入代理组件,并且尽可能声明所有权限,而这么做就会给原先的app添加很多臃肿的代码,对app运行流程的侵入性很强。

产品收费标准介绍:

官方文档 
它有一个收费阀值 ,超过这个阈值会从账户扣除费用。
每个账号,每月5万台设备免费。 
每个账号,平均到每台设备,一天免费调用20次。 
补丁包使用,完全不做限制。不额外计费。 

二、Tinker (微信开源热修复)

Tinker已运行在微信的数亿Android设备上,那么为什么你不使用Tinker呢?

 

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体积

较大

较小

较小

较小

成功率

较高

较高

一般

最高

优点:

  1. 项目成熟,文档健全;
  2. 集成简单;
  3. 支持资源文件和so文件的修复替换。

由于原理与系统限制,Tinker有以下已知问题:

  1. Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件(1.9.0支持新增非export的Activity);
  2. 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
  3. 在Android N上,补丁对应用启动时间有轻微的影响;
  4. 不支持部分三星android-21机型,加载补丁时会主动抛出"TinkerRuntimeException:checkDexInstall failed";
  5. 对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。

修复原理:通过新旧apk比较,使用gradle从插件生成.dex补丁文件(并不是真正的dex文件),补丁通过服务器下发后尝试对dex文件二路归并进行合并,最终生成全量的dex文件,与生成补丁互为逆过程,生成全量dex文件后进行optimize操作,最终生成odex文件。在Application中进行反射调用已经合成的dex文件。


android root 热修复 android最新热修复_android_04