前言
热修复即<打补丁>,当一个app上线后,如果发现重大的bug,需要紧急修复。常规的做法是修复bug,然后重新打包,再上线到各个渠道。这种方式的成本高,效率低。
于是热修复技术应运而生,热修复技术一般的做法是应用启动的时候,主动去服务端查询是否有补丁包,有就下载下来,并在下一次启动的时候生效,这样就可以快速解决线上的紧急bug。
热修复的优势
无需重新打包发布安装包,用户无感知修复,无需下载最新的应用,节省用户流量;修复的成功率高,避免线上bug带来的业务损失,把损失率降到最低。
热修复原理
热修复的原理主要是类替换。类的替换就涉及到ClassLoader的使用,Android中可用来动态加载代码的ClassLoader有PathClassLoader、DexClassLoader。
因为PathClassLoader在Dalvik虚拟机中只能用来加载已安装apk的类,而DexClassLoader在Dalvik和ART虚拟机中都能加载未安装apk或者dex中的类,所以热修复使用DexClassLoader来加载补丁包中的类。
我们可以使用DexClassLoader加载我们的补丁,再利用反射获取到PathClassLoader中的dexElements,以及DexClassLoader中的dexElements,将二者合并(补丁放前面,原来的放后面),再通过反射重新赋值给PathClassLoader中的dexElements,这样实现了热修复的效果。
实时修复
替换方案限制多,但是时效性好,加载轻快,立即见效;
在已经加载的类中替换掉原来的方法,基于原有的类修改;
既然是基于原有的类,这个方案无法对类中方法和字段进行增减,因为这样会破坏类的结构。
冷启动修复
冷启动修复就是合成全新的dex文件来替换原有的dex文件(dex文件包含了所有app代码),其作用在于突破热替换方案无法新增类方法的限制,如果代码变动大,比如在已存在的类中新增方法,修改了so等情况,可以更好的达到修复目的。
常用热修复框架
Dexposed框架:Star 4.4k
阿里——开源——实时修复
项目地址:https://github.com/alibaba/dexposed
介绍
Dexposed是一个阿里巴巴手机淘宝基于开源Xposed框架项目的工作,Dexposed是一个功能强大且非侵入性的运行时AOP(面向方面的编程)框架,用于Android应用程序开发。
Dexposed的AOP完全是非侵入性的,无需任何注释处理器,编织器或字节码重写器。集成就像在应用程序的初始化阶段仅用一行代码加载一个小的JNI库一样简单。
不仅可以挂钩您的应用程序代码,而且还可以挂钩在您的应用程序进程中运行的Android框架代码。此功能在Android开发中非常有用,因为我们的开发人员严重依赖零散的旧版Android平台(SDK)。
与动态类加载一起,可以将一小段已编译的Java AOP代码加载到正在运行的应用程序中,从而有效地改变目标应用程序的行为而无需重新启动。
使用
该框架最后一次的提交记录是2015年10月21日,已经停止更新很久了,暂不推荐使用
AndFix框架:Star 6.9k
阿里——开源——实时修复
项目地址:https://github.com/alibaba/AndFix
介绍
AndFix是一种在线修复错误而不是重新分发Android App的解决方案,它作为Android库分发。
AndFix支持Android版本从2.3到7.0,ARM和X86体系结构,Dalvik和ART运行时(32位和64位)。
AndFix补丁的压缩文件格式为.apatch,它从您自己的服务器分发到客户端,以修复您的应用程序错误。
使用
该框架最后一次的提交记录是2016年12月26日,已经停止更新很久了,暂不推荐使用
阿里百川HotFix框架:
阿里——未开源——实时修复
地址:http://baichuan.taobao.com/product/hotfix.htm
介绍
阿里百川HotFix是阿里百川旗下全平台App热修复服务方案,产品基于阿里巴巴首创hotpatch技术,提供最细粒度热修复能力。
使用
该框架最后一次的更新时间是2017年6月7日
阿里热修复Sophix已全面升级至3.0,可以参考官方文档的接入说明进行快速集成使用
Qzone超级补丁框架:
QQ空间——未开源——冷启动修复
介绍
Qzone 超级补丁技术基于dex分包方案,使用了多dex加载(multidex)的原理,大致的过程就是:把BUG方法修复以后,放到一个单独的dex文件,然后插入到dexElements数组的最前面,让虚拟机去加载修复完后的方法。
QFix框架:
手Q团队——开源——冷启动修复
介绍
QFix 是手Q团队推出的一种新的 Android 热补丁方案,在不影响 App 运行时性能(无需插桩去 preverify)的前提下有效地规避了 dalvik 下”unexpected DEX”的异常,而且还是很轻量级的实现:只需调用一个很简单的方法就能办到。
Robust框架:Star 4k
美团——开源——实时修复
地址:https://github.com/Meituan-Dianping/Robust
介绍
Robust是美团开发的一套热更新方案,它是基于Instant Run原理开发的一套新框架,相比于Tinker这种改变DexElements加载顺序的方式只能重启生效,robust实现了对代码修改的实时生效(热插拔)。
使用
该框架最后一次的更新时间是2020年4月13日,详细使用说明可以参考官方文档。
Nuwa框架:
大众点评——参考Qzone实现开源——冷启动修复
地址:https://github.com/jasonross/Nuwa
介绍
女娲是中国古代神话中的女神,以修复天柱而闻名。
通过此Nuwa项目,您还可以具有修复能力,无需将新的APK发布到appstore即可修复您的android应用程序。
使用
该框架最后一次的更新时间是2015年11月14日,已经停止更新很久了,暂不推荐使用
RocooFix框架:Star 1.6k
百度金融——开源——冷启动修复
地址:https://github.com/dodola/RocooFix
使用
该框架最后一次的更新时间是2016年6月26日,已经停止更新很久了,暂不推荐使用
Aceso框架:Star 790
美丽说蘑菇街——开源——实时修复
地址:https://github.com/meili/Aceso
介绍
Aceso是通过优化AOSP的<InstantRun HotSwap>解决方案而开发的Android HotFix,用于修复在线错误,而无需发布新的APK。
使用
该框架最后一次的更新时间是2018年1月31日,详细使用说明可以参考官方文档。
Amigo框架:Star 1.4k
饿了么——开源——冷启动修复
地址:https://github.com/eleme/Amigo
介绍
Amigo是一个修补程序库,可以为您的Android应用程序修复所有问题。
使用
该框架最后一次的更新时间是2017年8月21日,详细使用说明可以参考官方文档。
Tinker框架:
微信——开源——冷启动修复
地址:https://github.com/Tencent/tinker
介绍
Tinker是适用于Android的修补程序库,它支持dex,库和资源更新,而无需重新安装apk。
使用
该框架最后一次的更新时间是2021年4月19日,详细使用说明可以参考官方文档。
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万。
简单分类
Native hook:
RocooFix,AndFix,阿里百川HotFix
Java:
Qzone超级补丁,QFix,Robust,Nuwa,RocooFix,Aceso,Amigo,Tinker
混合:
Sophix
合理的分类
Native hook:
RocooFix,AndFix,阿里百川HotFix
Java multidex:
Qzone超级补丁,QFix,Nuwa,RocooFix
Java hook:
Robust,Aceso
Dex替换:
Amigo,Tinker
混合:
Sophix
网友评论