iOS Runtime

一、引子
最近在看JSPatch,一个使用了JavaScriptCore和runtime特性实现代码的热更新技术。核心是利用了JavaScriptCore实现了Objective-C和JavaScript提供简单直接的交互,能够将JS代码翻译成OC代码,再利用runtime的特性对object进行动态管理,最终实现热更新。

更直白的说,就是javaScript代码在通过JSPatch“翻译“成Objective-C的代码,利用runtime动态特性,加载对应的代码。类比之前用到过的waxPatch,基础都是runtime的动态特性。

二、runtime知识点
而这一块知识点一直属于自己的盲区,最近决定进行集中的学习和研究。所限将runtime的函数进行分类,方便分布模块化学习。

Objective-C的动态特性

函数的定义分类

对对象进行操作的方法一般以object_开头

对类进行操作的方法一般以class_开头

对类或对象的方法进行操作的方法一般以method_开头

对成员变量进行操作的方法一般以ivar_开头

对属性进行操作的方法一般以property_开头开头

对协议进行操作的方法一般以protocol_开头

根据以上的函数的前缀
可以大致了解到层级关系。对于以objc_开头的方法,则是runtime最终的管家,可以获取内存中类的加载信息,类的列表,关联对象和关联属性等操作。

runtime本身提供的函数非常明晰,稍加用心可以对各个接口能够熟悉起来。但是如何运用自如就是另外一个事情了。在本文开始提到的两种动态更新技术便是runtime用的非常好的地方、也是IOS APP希望能够用的能力:动态更新。

三、动态更新

原生APP从架构层面而言是C/S架构,客户端的APP是client,逻辑在本地,从后台server获取数据,在客户端本地进行对应的展示和交互。

动态更新从架构层面而言,则类似与B/S,部分逻辑可以部署在服务端,在需要的时候能够将对应的逻辑在客户端内执行。

动态更新是一把双刃剑,有利:可以在不进行APP重新安装下,调整部分逻辑,快速修改、部署业务;有弊:安全性受到考验,尤其是对于IOS平台而言,良好的环境是依赖于AppStore的严格监管,有了动态更新的能力,也就意味着可以绕过AppStore的审核做一些事情。JSPatch引入的安全隐患

在本文讨论中、或者放大到JSPatch的本身,能够被开源出来,能够被很多知名APP使用,假设是不存在“作恶“的。

四、动态更新的实现

实现动态更新无非是通过两点实现:一是修改object成员变量,修改对象属性;二是修改object接口,修改对象的方法。通过以上两点,就可以实现对已经上线的代码进行动态更新。

首先使用runtime对object成员变量、属性进行修改算是比较基础简单,通过property_簇接口得到变量后,在使用ivar_ 进行修改。

其次对于接口的更新稍显复杂,因为接口是IMP、SEL、method_types三部分组成,可以通过在runtime中修改、甚至交换SEL、IMP实现method swizzling,这也是大家所说的“黑魔法“,其实本质是底层良好的语言设计提供出的足够的灵活性的体现。

在使用纯ObjectiveC语言实现method swizzling是比较简单,因为写在m文件中的函数会被编译对应的IMP,然后使用runtime中method_簇方法进行接口的添加、重写等操作基本是几行代码的事情。

难点在于如果是需要自己将“字符串“式的函数编译呢?在对JSPatch学习研究的过程中,自己在想是否可以自己设计一个利用runtime动态特性实现热更新的engine?不使用脚本语言,直接使用Objective-C语言,客户端从服务端下载到了片段代码后,在引擎中将字符串代码转换为可执行代码,在runtime中进行method管理。

基本的思路是将Objective-C语言风格的patch代码[只是一段字符串]部署在服务端,通过downloadPatch、loadPatch、最后实现executePatch。尝试设计这种方案时,发现了最大的问题就是在于如何将字符串的代码进行编译,于是我想到了objc_msgSend(),对每一行代码进行解析翻译,但是再深究,如何对代码进行语法检查等等复杂的逻辑。

中断一下自己的思考后,其实发现已经是向着编程语言的底层进行摸索,但是因为目前自己还没有这方面足够的知识储备。所以自己编写engine的方案暂时搁置。

再回到JSPatch中,核心是利用了JavaScriptCore实现了Objective-C和JavaScript提供简单直接的交互,能够将JS代码翻译成OC代码,再利用runtime的特性,对method进行添加、重写。最终实现热更新。

对目前的一些思考进行记录,后续学习相关知识后,自设计动态更新的方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值