为什么要热修复

在软件开发过程中,很难避免 BUG 的存在,尤其是对于一些达到一定规模的 App 因为协作模式错综复杂,就很容易带着问题上线。

一旦问题上线之后,问题就麻烦了,不仅需要重新打包、测试,而且还需要重新提交审核,而这种修复问题的方式往往是低效且漫长的。

因此,在开发一个 App 的过程中,稳定性的就变成了一个难题,唯一的原因就是不希望带着问题上线导致用户对 App 失去信任。

热修复就可以很好的解决这类棘手的问题,因此带着好奇之心,研究了一下热修复在 iOS 端的可行性,实现 了一个较为完备的热修复框架,我把它叫做 OCRunner。

我也会在未来几个月,把我做 OCRunner 的一些经验总结成博文,在「老司机技术周报」的公众号上与大 家分享。

已有的开源方案

采用 JavaScriptCore 的方案

*JSPatch*[1]通过下发 JavaScript 脚本,使用系统提供的  JavaScriptCore 执行 JavaScript 脚本,通过 JavaScript 代码解析代码中的类信息,动态调用相应的 Objective-C 函数,然后配合 libffi 修改 Runtime,最终实现热更新,奠定了 Objective-C 的热修复基础。

*TTPatch*[2]和 JSPatch 一样使用 JavaScriptCore 执行 JavaScript 脚本,但支持实时预览,这个是我超级喜欢的功能。

自实现脚本解释器的方案

*OCEval*[3]下发 Objective-C 源码解释执行,但支持的语法有限。作者lilidan[4]自己实现了 Objective-C 的词法分析器和语法分析器。其中的FunctionSearch的实现[5]也帮助了我许多。DynamicOC[6]将 OCEvel 的词法解析器和语法解析器使用 lex&yacc 实现。

*Mango*[7]作者设计了 Mango 的脚本语言(和 Objective-C 极为相似),使用 lex&yacc 生成语法树,然后再将 Mango 脚本的语法树解释执行。这也就是 OCRunner 的起源。

OCRunner[8]是我在 Mango 的基础之上优化后的一个方案。和 Mango 相同的是,采用lex&yacc生成语法树后解释执行、JSPatch 的 Runtime 的思想。但这一次,我们可以书写 Objective-C,然后直接动态执行它。同时也支持了许多特性:结构体、枚举、函数指针等。

其他库不足的问题:

  1. 支持不够完善:结构体、系统函数、枚举等。

  2. 语法问题:一些语法上的小问题,有时候无异于回炉重造,也是需要时间成本的。有时候一些奇怪的语法问题,或许都要花你一个下午的时间。

  3. 传输加解密:  JSPatch 等均采用 RSA (非对称加密)对整个脚本进行加密,个人认为着实耗费性能了一些。

为什么要写 OCRunner

这次可以慢慢的讨论这个问题了~

19 年 4 月的时候,刚好在趋势榜上看见了Mango[9]项目,发现它是使用自定义的、和 Objective-C 语法非常相似的脚本语言(相当于自己创造一名语言吧,balabala),当时早已对编译相关的心驰神往,奈何一直没有一个合适的机会去学习,再加上当时的公司有热更新的需求,就想着试一试,看能不能写一个将 Objective-C 代码转换为 Mango 脚本的转换器(也想过能不能借此自己完成一个热更新库)。

19 年 4 月 晚上 10 点正式开启了每天回家爆肝 lex&yacc 的升级打怪之路,各种各样的问题炸得我在锅里反复横跳(解决办法: 「  lex&yacc.pdf 」抱着啃),但最严重的的莫过于指针相关的,参考了好几个基于 lex&yacc 的开源编译器,才得以找到折中的解决办法。中间也发生了许多事情,从 19 年 7 月后,我休息了4个月。

20 年 3 月的时候,想着 oc2mango 做了那么久,得把翻译器做出来了才能给自己一个交代,肝了一段时间,正确的使用 yyless 后,问题相较之前已经少了很多。这个时候 oc2mango 翻译器也能正常使用了,虽然仍有一些小问题。这个时候翻译器的小目标也就完成了✌️。

当翻译器完成以后,我的野心变大了,我想试试我自己能不能完成一个像 Mango 一样的热更新库(内心戏:lex&yacc 就是从它那儿学来的,应该不难吧?

OCRunner 第零篇:从零教你写一个 iOS 热修复框架相关推荐

  1. 后端思维篇:手把手教你写一个并行调用模板

    前言 36个设计接口的锦囊中,也提到一个知识点:就是使用并行调用优化接口.所以接下来呢,就快马加鞭写第二篇:手把手教你写一个并行调用模板~ 一个串行调用的例子(App首页信息查询) Completio ...

  2. 手把手教你写一个Java的orm框架(4)

    开始准备生成sql 在上一篇里,我们已经取到了我们在生成sql语句中所需要的信息,这一篇里我们开始根据class来生成我们需要的sql.在这之前我们先确认几件事情 sql里的参数我们使用占位符的形式. ...

  3. 手把手教你写一个生成对抗网络

    成对抗网络代码全解析, 详细代码解析(TensorFlow, numpy, matplotlib, scipy) 那么,什么是 GANs? 用 Ian Goodfellow 自己的话来说: " ...

  4. OpenGL.Shader:志哥教你写一个滤镜直播客户端:仿3个抖音滤镜效果(4镜像/电击/灵魂出窍)

    OpenGL.Shader:志哥教你写一个滤镜直播客户端(可能是结束篇) OpenGL.Shader基本的图像处理知识已经学习的7788了,所以这篇应该是滤镜直播客户端的最后一篇了,之后会出基于FFm ...

  5. 手把手教你写一个中文聊天机器人

    本文来自作者 赵英俊(Enjoy) 在 GitChat 上分享 「手把手教你写一个中文聊天机器人」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 一.前言 发布这篇 Chat 的初衷是想和 ...

  6. python k线合成_手把手教你写一个Python版的K线合成函数

    手把手教你写一个Python版的K线合成函数 在编写.使用策略时,经常会使用一些不常用的K线周期数据.然而交易所.数据源又没有提供这些周期的数据.只能通过使用已有周期的数据进行合成.合成算法已经有一个 ...

  7. cmd管道无法接收特定程序返回值_渗透不会反弹shell?来教你写一个cmd的shell

    渗透不会反弹shell?来教你写一个cmd的shell 包含的库: #include #include #include #include #include #pragma comment(lib, ...

  8. 手把手教你写一个spring IOC容器

    本文分享自华为云社区<手把手教你写一个spring IOC容器>,原文作者:技术火炬手. spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功 ...

  9. 手把手教你封装一个自己的数据库框架~

    本教程将给大家深度剖析数据库框架底层实现的原理,然后采用泛型.反射.注解机制来教大家做一个自己的数据库框架. 前面学习了很多教程,我们转换了一下风格,开始从一个点切入,做更加深入的提升,这也是符合人的 ...

最新文章

  1. java某市出租车_智慧职教mooc的APPJavaEE企业级网站开发章节测验答案
  2. android application常见错误
  3. cv2 画多边形不填充_OpenCV python: 任意多边形填充和凸多边形填充(fillPoly和fillConvexPoly的区别,有图有真相!)...
  4. 【pmcaff】苏杰:产品经理对技术做这些,就完蛋了
  5. 天池读书会来啦,带你体验沉浸式读书新方式
  6. MySQL高级 - 案例 - AOP记录日志
  7. Android Studio编译提示如下attribute layout_constraintBottom_toBottomOf (aka com.luck.pictureselector:layou
  8. 牛客网 【每日一题】[SCOI2009]粉刷匠
  9. 企业Java中事务隔离级别的初学者指南
  10. 字符串对象数组集合非空判断
  11. 意大利_【解读】去意大利留学,一定要学意大利语吗?意大利语难吗?
  12. python相对路径import 方法_Python 从相对路径下import的方法
  13. 最新电脑为什么用ghost无法安装系统?安装版正常,是何原因?
  14. 微软开放Windows Phone 7中文开发中心
  15. mac os 下安装mysql
  16. poj1017----模拟
  17. 潇洒老师教你注塑模具使用顶针油需要注意的问题
  18. 01 - Kali笔记_Linux_Kali环境熟悉
  19. 目标检测之DarkNet-DarkNet源码解读<二>训练篇
  20. MacOS修改Hosts文件

热门文章

  1. pandas美国人口分析实例
  2. 计算机三级网络技术最全知识点总结【2】
  3. 6 生僻字_戓、弚、圡什么鬼?这些生僻字逼死强迫症!
  4. android GoogleMap画导航线路图 路径规划
  5. 嵌入式的可移植性和可复用性
  6. Python脚本调用腾讯地图接口
  7. 利用C51单片机模拟SPI进行双机通信
  8. 机器学习线性回归实践,广告投放收益预测,手写梯度下降
  9. Uniforms(uniform变量)
  10. 4G模组通信配置相关概念及流程