魏名华

不要偷懒,做更好的自己

Nothing


No Welcome Message

iOS热更新

背景

总是有产品或同事提到热更新的问题,之前公司也有做过,只是苹果禁了,现在重新梳理一下。

ps:

  1. 很多网上的人说,国内才热衷热更新,国外很少用的,做好单元测试就解决hotfix,新功能发版本即可。

  2. 不过国内环境不一样,还是研究下,可以吹牛逼,也仅此而已,我个人是真的不认同这些动态化技术的。比如iOS,其实只要苹果愿意开放动态库的功能,实现超级简单的,人家就是封了,说明我们做的这么多,其实就是如这位所说,技术本身意义不大的,没有价值。

Geek_4b0e72 2019 年 03 月 07 日 15:05
 3 
恕我直言 你所谓理解的“酷炫的黑科技”,就是一些小优化,如果苹果谷歌想实现就分分钟的事,不要用这些小技就如发现新大陆一样,国内IT技术发展20多年,还在跟着美国平台上玩,就注定被人家掐住咽喉,情记住:技术服务商业,商业决定技术环境、规则。
  1. 很少有其他的技术栈需要热更新技术,前端,服务端,都是发版,只有客户端才热衷这块,因为只有客户端,在功能变化时,是需要用户升级,否则无法实现功能更新,造成版本分裂和碎片化。

  2. 这就是2种哲学思想了:1、如果iOS允许动态库热更新,那多好啊,用户可以实时使用最新的功能,完全无感知,对用户来说,根本没有版本的概念,就像网页改版了,除非刻意提供入口,一般用户不可能可以再用旧版,即使他更喜欢。(也许苹果是为了安全,但我可以将更新的库提交你审核就是,虽然也是有审核时间,但是没有了碎片化,多好);2、不允许热更新,完全按照版本走。

  3. 就像bang说的,除了工具,根本没有真的不动态的东西,APP的内容,都是服务端下发的,都是新的,既然内容可以下发,内容展示的形式,就不能让我们热更新一下吗。

  4. 我更倾向于热更新,我觉得用户使用APP,就应该像网页一样,时刻都使用最新版,即使他觉得旧的更好,不喜欢的话,卸载换其他的APP就是。而不应该是现在这样,用户需要不停的下载更新APP版本,才能使用新版功能,有时候2个版本之间,只相差那么一丁点优化而已,但是要重新下载几十M,这么看,热更新其实非常的“环保”。

  5. 假设操作系统也能热更新,哪有那么多的碎片化啊。

  6. 唯一的问题是,如果都热更新了,就没有历史版本的使用记录的,不对,应该是有的,有日志啊。

  7. 也许需要动态的时候,用web是政治正确的,但是原生既然体验这么好,如果顺便动态了,那多好啊。

方案

目前移动端流行的动态化方案有,Facebook的React Native,阿里的Weex,它们都是采用了JavaScript与Native之间的桥接,使JavaScript开发的App拥有近似于原生应用的性能。

其他的一些动态化方案,像历史悠久的WaxPatch动态化方案,已经被App Store禁止的JSPatch,阿里的LuaView,腾讯的OCS,滴滴的DynamicCocoa。

ps:为什么不用动态库: 苹果把加载动态库的功能给封了,动态库必须跟随安装包一起签名才能被加载,无法通过别的途径签名后再下发。

方案简介

  1. RN和wexx:暂无定论,多数不看好,不用;不过阿里、携程、京东,这些用的多,阿里甚至完全不用webview了,不过这里更多的是用来替换webview,而不是用来实现原生自身代码的动态更新。

  2. WaxPatch:停止维护

  3. JSPatch:我们使用过,也被苹果封了。所对应的技术,是下发js脚本,app通过JavaScript core framework,执行js脚本,手动将js脚本的执行翻译到OC提供了整套的runtime,实现动态加载进而热更新。滴滴的DynamicCocoa是同样的原理。

  4. LuaView:类似WaxPatch,阿里开源

  5. DynamicCocoa:跟JSPatch的原理是一致的,只是增加了更多的工具,无需手动写js脚本

  6. 手机 QQ ,他们通过 clang 把 OC 代码编译成自己定制的字节码动态下发,然后开发一个虚拟机去执行(惊呆了),同样实现了原生开发,动态运行。

我的想法

既然OC提供了整套的runtime,那能不能不经过JavaScript core,自己解析源代码并通过runtime执行呢?即原本是OC代码经LLVM编辑链接,而热更新时只能下载到源代码,解析OC源代码并通过runtime执行?效率应该比JavaScript core中转一次更高,怎么设计代码解析的程序,类似WSDL?

  2019-06-11: 可以动态生成类、属性、方法,但是怎么动态生成方法的实现呢?

OCEval: 这个跟我想的差不多,看看

需求分析

2019-6-11

热更新的需求可以分为:1、hotfix;2、feature

1、hotfix: 这个比较合理的需求,但也不好实现,容易实现的方案都被苹果封了。

2、feature:通过热更新实现新功能不合理,理由:1、软件开发的实践,发版都是主流,无论前端后端客户端;2、即使客户端有版本分裂的问题,影响的用户也是少数,大多数用户在不长的时间内都会更新到最新版本;3、在动态库不能用的情况下,很难实现;4、对于不允许版本分裂的部分产品功能,H5是最好的方案,rn/weex也可以用,但是这些技术比较难落地。

2019-7-12

还是认真考虑下怎么实现吧

实现

  • [ ]了解LLVMv
  • [ ]了解Clang
  • [ ]了解Clang编译OC的过程

结论

2019-6-11

通过各种方案,去优化H5吧。

2019-7-12

还是认真考虑下怎么实现吧

参考:

iOS 动态化的故事: bang写的,解释了为什么做jspatch JSPatch 实现原理详解 DynamicCocoa:滴滴 iOS 动态化方案的诞生与起航:我真的不喜欢这个 OCS ——史上最疯狂的 iOS 动态化方案:QQ的方案介绍 一个可动态扩展的互动系统:主要介绍LuaView 移动开发的罗曼蒂克消亡史:介绍Android和iOS各种动态化的历史 [Cocoa]深入浅出 Cocoa 之消息: 介绍runtime Objective-C Runtime 运行时之一:类与对象: 很全的runtime介绍,不过有些错误,搞得云里雾里 Objective-C运行时编程指南: 官方文档