iOS热修复MangoFix原理分析

作者 : 开心源码 本文共1704个字,预计阅读时间需要5分钟 发布时间: 2022-05-12 共239人阅读

??在上次写了一篇名为MangoFix:iOS热修复另辟蹊径的iOS热修复文章之后,很多朋友问我MangoFix的原理是什么呢?所以今天决定再写一篇详情MangoFix运行原理的一篇文章,以解大家的少量疑惑。

??MangoFix项目主页上中已经讲到,MangoFix既是一个iOS热修复SDK,但同时也是一门DSL(领域专用语言),即iOS热修复领域专用语言。既然是一门语言,那一定要有相应的编译器或者者解析器。相对于编译器,使用解析器实现语言的执行,尽管效率低了点,但显然更加简单和灵活,所以MangoFix选择了后者。下面我们先用一张简单流程图,看一下MangoFix的运行原理,而后逐一解释。

MangoFix运行原理.png

1、MangoFix脚本

??首先热修复之前,我们先要准备好热修复脚本文件,以确定我们的修复目标和执行逻辑,这个热修复脚本文件便是我们这里要详情的MangoFix脚本,正常是放在我们的服务端,而后由App在启动时或者者适当的运行期间进行下载,利用MangoFix提供的MFContext对象进行解析执行。对于MangoFix脚本的语法规则,这点可以参考MangoFix Quick Start,和OC的语法非常相似,你假如有OC开发经验,相信你花10分钟便可以学会。当然,在后续的文章中我可能也会详情这一块。

2、词法分析器

??几乎所有的语言都有词法分析器,主要是将我们的输入文件内容分割成一个个token,MangoFix也不例外,MangoFix词法分析器使用Lex所编写,假如你想理解MangoFix词法分析器的代码,可以点击这里。

3、语法分析器

??和词法分析器相似,几乎所有语言也都有自己的语法分析器,其主要目的是将词法分析器输出的一个个token构建成一棵笼统语法树,而且这颗笼统语法树是符合我们预先设计好的上下文无关文法规则的,假如你想理解MangoFix语法分析器的代码,可以点击这里。

4、语义检查

??因为语法分析器输出的笼统语法树,只是符合上下文无关文法规则,没有上下文语义关联,所以MangoFix还会进一步做语义检查。比方我们看下面代码:

@interface MyViewController : UIViewController@end
class MyViewController : BaseViewController{- (void)viewDidLoad{    //TODO}}

上面部分是OC代码,下面部分是MangoFix代码,从文法角度MangoFix这个代码是没有问题的,但是在逻辑上却有问题, MyViewController在原来OC中和MangoFix中继承的父类不一致,这是OC runtime所不允许的。

5、创立内置对象

??MangoFix脚本中很多功能都是通过预先创立内置对象的方式支持的,比方常用结构体的公告、变量、宏、C函数和GCD相关的操作等,假如想详细理解MangoFix中有哪些内置对象,可以点击这里。当然MangoFix也开放了相关接口,你也可以向MangoFix执行上下文中注入你需要的对象。

6、执行顶层语句

??在做完上面的操作后,MangoFix解析器就开始真正执行MangoFix脚本了,比方顶层语句的执行、结构体的公告、类的定义等。

7、利用runtime热修复

?? 现在就到了最关键一步了,就是利用runtime替换掉原来Method的IMP指针,MangoFix利用libffi库动态创立C函数,在创立的C函数中调用MangoFix脚本中方法,而后用刚刚创立的C函数替换原来Method的IMP指针,当然MangoFix也会保留原有的IMP指针,只不过这时候该IMP指针对应的selector要在原有的基础上在前面拼接上ORG,这一点和JSPatch一致。当然,MangoFix也支持对属性的增加。

8、MangoFix方法执行

??最后当被修复的OC方法在被调用的时候,程序会走到我们动态创立的C函数中,在该函数中我们通过查找一个全局的方法替换表,找到对应的MangoFix方法实现,而后利用MangoFix解析器执行该MangoFix的方法。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » iOS热修复MangoFix原理分析

发表回复