一. 热更新的历史使命
有文章指出,国内的产品发布比较快速,试错成本相对便宜,所以才造就了国内热更新技术的强盛需求。(国外是再produce/code review阶段做到严格对待,保证质量)。
热更新(hotfix)跟patch还不是一个概念,前者是针对线上的程序存在的bug,做一个快速响应的过程。patch相对来讲,可以包括一个新的试错内容,内容可以宽泛一些。两者都是为了解决产品快速发布的过程。
二. 热更新的技术背景
热更新为了完成在不完全替换原来的代码的背景下,完成对原程序功能的修改,所以就是利用了动态的技术(暂且不提图片等资源文件的替换等非代码部分)。
1 类似钩子(Hook技术),对原有的文件中的调用做拦截,然后修改调用顺序,这个在window系统下的一些技术上是常用的。
2 保留注入接口,可以在一些关键接口预留注入接口,比如说,在某个类的启动初始函数,比如ViewDidLoad函数,插入一段读取动态的脚本(如果有的话),这段脚本可能在特定的hotfix上就可以派上用场,改变/替换类内部的功能。
3 直接用webview的动态脚本技术,出现问题,替换脚本。
三. 几大产商的hotfix技术
由于Hybrid的技术方案,由于js脚本执行相对native来讲效率欠佳,只在一些体验要求不高的app上采用,所以webview的动态脚本技术暂且不提。
由于iOS 7.0之后iphone系统包含了JavaCoreScript的sdk包,这个包能够直接跟native进行高效交互,相对催生了一些流行的产商产品推出。
1 美团的CocoaDynamic 采用了Clang编译,针对OC的代码,生产中间代码JS,然后通过JavaCoreScript技术,达到动态fix掉线上的逻辑。从程序员的角度来讲,这个方案由于只设计OC的源码,没有JS语法的学习曲线,思想非常好。
2 JSPatch 重度采用了JavaCoreScript接口进行OC代码的替换(应用接口中block内容)。其中的替换逻辑,类似Swizzle技术,对原有的类方法的selector的IMP替换为_obj_msg_forward(跳过实际的IMP查找),然后拦截随后的forwadInvocation调用,替换成目标方法体的invoke。
3 Rollout.io 是一个商业软件,按照官方作者的说法也是采用Swizzle技术,跟JSPatch类似的实现。能提供一个平台,可以在平台上修改对应的bug,然后通过平台发布patch。
以上的各种方案,均是几年前的热点,最近没有提及。所以后面的文章会讲解一下最新的跨平台方案(Flutter,Reactive Native等),以及各自的hotfix方法。