背景
总是有产品或同事提到热更新的问题,之前公司也有做过,只是苹果禁了,现在重新梳理一下。
ps:
-
很多网上的人说,国内才热衷热更新,国外很少用的,做好单元测试就解决hotfix,新功能发版本即可。
-
不过国内环境不一样,还是研究下,可以吹牛逼,也仅此而已,我个人是真的不认同这些动态化技术的。比如iOS,其实只要苹果愿意开放动态库的功能,实现超级简单的,人家就是封了,说明我们做的这么多,其实就是如这位所说,技术本身意义不大的,没有价值。
Geek_4b0e72 2019 年 03 月 07 日 15:05
3
恕我直言 你所谓理解的“酷炫的黑科技”,就是一些小优化,如果苹果谷歌想实现就分分钟的事,不要用这些小技就如发现新大陆一样,国内IT技术发展20多年,还在跟着美国平台上玩,就注定被人家掐住咽喉,情记住:技术服务商业,商业决定技术环境、规则。
-
很少有其他的技术栈需要热更新技术,前端,服务端,都是发版,只有客户端才热衷这块,因为只有客户端,在功能变化时,是需要用户升级,否则无法实现功能更新,造成版本分裂和碎片化。
-
这就是2种哲学思想了:1、如果iOS允许动态库热更新,那多好啊,用户可以实时使用最新的功能,完全无感知,对用户来说,根本没有版本的概念,就像网页改版了,除非刻意提供入口,一般用户不可能可以再用旧版,即使他更喜欢。(也许苹果是为了安全,但我可以将更新的库提交你审核就是,虽然也是有审核时间,但是没有了碎片化,多好);2、不允许热更新,完全按照版本走。
-
就像bang说的,除了工具,根本没有真的不动态的东西,APP的内容,都是服务端下发的,都是新的,既然内容可以下发,内容展示的形式,就不能让我们热更新一下吗。
-
我更倾向于热更新,我觉得用户使用APP,就应该像网页一样,时刻都使用最新版,即使他觉得旧的更好,不喜欢的话,卸载换其他的APP就是。而不应该是现在这样,用户需要不停的下载更新APP版本,才能使用新版功能,有时候2个版本之间,只相差那么一丁点优化而已,但是要重新下载几十M,这么看,热更新其实非常的“环保”。
-
假设操作系统也能热更新,哪有那么多的碎片化啊。
-
唯一的问题是,如果都热更新了,就没有历史版本的使用记录的,不对,应该是有的,有日志啊。
-
也许需要动态的时候,用web是政治正确的,但是原生既然体验这么好,如果顺便动态了,那多好啊。
方案
目前移动端流行的动态化方案有,Facebook的React Native,阿里的Weex,它们都是采用了JavaScript与Native之间的桥接,使JavaScript开发的App拥有近似于原生应用的性能。
其他的一些动态化方案,像历史悠久的WaxPatch动态化方案,已经被App Store禁止的JSPatch,阿里的LuaView,腾讯的OCS,滴滴的DynamicCocoa。
ps:为什么不用动态库: 苹果把加载动态库的功能给封了,动态库必须跟随安装包一起签名才能被加载,无法通过别的途径签名后再下发。
方案简介
-
RN和wexx:暂无定论,多数不看好,不用;不过阿里、携程、京东,这些用的多,阿里甚至完全不用webview了,不过这里更多的是用来替换webview,而不是用来实现原生自身代码的动态更新。
-
WaxPatch:停止维护
-
JSPatch:我们使用过,也被苹果封了。所对应的技术,是下发js脚本,app通过JavaScript core framework,执行js脚本,手动将js脚本的执行翻译到OC提供了整套的runtime,实现动态加载进而热更新。滴滴的DynamicCocoa是同样的原理。
-
LuaView:类似WaxPatch,阿里开源
-
DynamicCocoa:跟JSPatch的原理是一致的,只是增加了更多的工具,无需手动写js脚本
-
手机 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运行时编程指南: 官方文档