你好 2017 | 微信开源计划项目鉴赏

2022年01月16日 阅读数:2
这篇文章主要向大家介绍你好 2017 | 微信开源计划项目鉴赏,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。



◆ ◆ ◆ ◆微信

2017新年快乐多线程

HAPPY NEW YEAR架构

◆ ◆ ◆ ◆并发


这是一个用秒计算的时代,咱们用3秒判断一场直播是否值得看,从一块四方屏幕获知温暖与黑暗,用优步和滴滴丈量世界,时常担忧跟不上时代,时常焦虑,时常不知所措。框架


时光的洪流里,有微末小事,也有科技巨变,一吻惊苍穹,一梦筑天宫,当川普把四川话推广到全国,咱们发现政治也能够这么娱乐化;英国脱欧,韩国肥皂剧,世界环境变幻莫测,时常提醒咱们,和谐稳定发展才是王道;对于有些人来讲,2016可能表明着离别,告别利物浦的足球之子,告别科比,咱们曾跟随这些年轻的面庞向全世界宣战,但终究仍是败给了时间;伦敦奥运,洪荒之力,女排精神,都是咱们学习的好榜样。墨子、嫦娥,航空事业,咱们的综合国力越来越强。咱们的时代历来未曾缺乏黑暗,但咱们仍然轻快地调侃着厚的载雾,自强不吸。ide


这就是2016年,历史的车轮滚滚前行,终究带走了美好的、骄傲的、痛苦的、绝望的从前。过去、如今、历史、将来,抚今追昔,咱们一直相信历史有其逻辑所在,能够看下视频,了解2016发生的大事记,以史为鉴,以知兴替。工具




2016 ,过去了布局

Code4App 感恩有你们性能

相逢是缘,相知是愿学习

Coding不易,且行且珍惜


不管这一年,你是否刚踏足社会(才华横溢)

仍是在码届多年的老油条(经验流)

2016确定是收获满满,感触良多


不要藏着掖着了,在元旦这个大喜日子

能够在留言区分享

你的 2016,或 2017 的愿望与展望

说不定就实现了呢


    新的一年,加油!



◆ ◆ ◆ ◆



初窥OCS


OCS是全新设计的iOS动态化方案。咱们定义了一套精确描述OC语义的字节码指令集(OCScript),开发了一套全自动编译器(OCSCompiler),实现了一个高性能的虚拟机(OCSVM)以及一个能够跟底层无缝对接的桥接器(OCSBridge)。咱们首先使用OCS编译器把OC源码转化成OCS字节码,而后经过OCS桥接器实现OCS虚拟机与Native运行时的互联,最后使用OCS虚拟机对OCS字节码进行解释运算,并驱动Native运行时完成逻辑的执行,以此达到Native代码动态化的效果。OCS被用于iOS APP安装包减包、功能插件化、HotPatch等方方面面动态化需求。


你好 2017 | 微信开源计划项目鉴赏_线程管理


那么,咱们为何要实现OCS呢?


OCS的发展背景



在手Q iPhone客户端的发展历史上,有两大众所周知的刚性技术需求一直是绕之不开的,一是安装包瘦身,二是打热补丁。为了进行减包和打热补丁,咱们跟不少APP同样,前后使用WaxPatch和JSPatch这两大神器(本文后面对同类型的使用第三方脚本语言做为中间语言实现的动态化方案都简称为XPatch)进行了普遍的尝试,取得了不少成果,也暴露了很多问题:


1、学习成本高。

要进行补丁/插件编写,必需要学习并掌握对应的脚本语言,其次还须要学习补丁脚本的编写方式,而且必须熟悉各类约定和潜规则,不然,很容易掉到各类各样的坑里去。


2、语义不一致。

XPatch使用的脚本语言的语义与OC的语义自然不一致,因此机械地把Native代码转化成脚本,很容易引入未定义行为。因为缺少高效的调试工具,Bug修复效率很是低下。


3、内存管理不一致

XPatch使用的解释引擎使用垃圾回收机制进行内存管理,而Native环境则使用MRC/ARC进行内存管理。二者并不兼容,很容易引入各类诡异的Crash。


4、线程管理不一致

XPatch使用的解释引擎自己只支持单线程,而Native运行环境则支持抢占式多线程。二者线程管理机制不可避免地相互冲突,很是容易引入隐秘的死锁和Crash风险。


5、性能低下。

XPatch对Native运行时进行消息发生的时候须要进行大量的字符串解析和数据转换操做,效率很是低下,很容易形成页面滑动卡顿和掉帧


你好 2017 | 微信开源计划项目鉴赏_内存管理_02


OCS又是如何解决这些问题的呢?



四大一致性原则



为了克服第三方脚本解释器动态方案存在的种种问题,咱们从2015年下旬开始了OCS动态化方案的设计与实现。为了让上述问题获得有效解决, 咱们提出了普适性的iOS动态化四大一致性原则:

开发体验一致性;

线程管理一致性;

内存管理一致性;

语义定义一致性。

你好 2017 | 微信开源计划项目鉴赏_线程管理_03


这四大一致性原则贯穿于OCS整个设计实现过程。OCS从无到有,从只支持基本特性到功能日趋完善,从首发到迭代升级,OCS的架构从未发生重大更改。

OCS 1.0版本于2016年8月在手Q成功上线。到目前为止,OCS已经获得大规模代码转化与海量用户使用实战验证。从统计数据来看,咱们的设计目标基本获得实现,传统脚本动态化方案存在的种种弊端几近获得完美的解决。



OCS有哪些众不一样之处



OCS是严格遵循四大一致性原则设计实现出来的,那么它有哪些鲜明的特色呢?


1、语义与OC保持严格一致

OCS字节码指令集语义与OC/的语义保持严格一一对应关系,支持的数据类型也彻底等同,运行过程无需进行任何转换,所以效率很是高。


2、自动化工具支持

OCS拥有完善的自动化工具链,OCS转化器支持绝大多数OC/C语法的转化,包括C方法、任意自定义结构体、任意自定义block。对于少数不支持的的语法,能够准确报错,引导用户进行规避,避免产生未定义行为。OCS转化器还能够准确识别OC/C代码的内存管理语义,能够正确生成内存管理相关的代码。特别对于ARC来讲,能够准确生成Retain、Release代码,正确插入到生成代码中去。


3、原生OC内存管理机制

OCS解释器彻底支持Native的内存管理机制,能够在正确的时机执行正确的内存释放逻辑,绝无延迟操做,完全杜绝了Crash和爆内存风险的引入。


4、抢占式多线程

OCS解释器支持Native的抢占式多线程线程管理支持,彻底支持Pthread、 GCD、 NSOperationqueue、 NSThread等各类线程模型,彻底避免了额外引入Crash、卡顿与死锁风险。


5、高性能汇编ABI

OCS桥接器根据过程调用约定实现自定义OCSABI,使得解释器与Native底层实现直接通讯,保证Native代码动态化引入额外性能损耗最小化,使得OCS动态化不只广泛适用于普通逻辑转化,对于对性能要求苛刻的有复杂排版的滑动列表,OCS也有极佳的表现,动态化后掉帧率增加量几乎能够忽略不计。


你好 2017 | 微信开源计划项目鉴赏_线程管理_04


那么OCS框架的各个组成部分究竟是怎样的呢?


OCS是一个四位一体的自研动态化方案,其中包含细节很是多。限于文章篇幅和读者的流量,咱们下面仅对核心模块作简单的介绍。


OCScript



OCScript与OC存在语义上的一一对应关系。跟OC同样,OCScript也是图灵完备性的语言。下面咱们看看OCScript的指令集概况


你好 2017 | 微信开源计划项目鉴赏_字节码_05


基本运算指令使得OCScript具备加、减、乘、除、移位等各类基本算术、逻辑运算能力。

内存操做指令使得OCScript具备在内存中的读写各类数据的能力;

地址指跳转指令使得OCScript具备分支判断与控制转移的能力;

强类型转换指令使得OCScript具备对数据类型进行强制转化能力;

OC调用指令使得OCScript具备指令级别的消息发生能力,根本性地提升了执行效率。

OCScript中每一个指令编码占一个字节,因此储存空间很是紧凑。



OCSCompiler



咱们基于Clang构建了编译器


你好 2017 | 微信开源计划项目鉴赏_内存管理_06


在编译器中,咱们根据AST来生成OCScript。举个例子


你好 2017 | 微信开源计划项目鉴赏_内存管理_07

图中左侧的源码使用Clang转成右侧的AST语法树。而后遍历每一个AST节点,便可生成对应的OCScript字节码


你好 2017 | 微信开源计划项目鉴赏_字节码_08



它的具体含义能够根据对应的符号信息翻译获得


你好 2017 | 微信开源计划项目鉴赏_内存管理_09


从上面的汇编符号信息咱们不难看出,OCScript的语义跟OC Native代码的语义彻底一致。


OCScript字节码按以下文件格式进行存储

而后由OCSVM加载执行。


OCSVM



OCSVM是OCS动态化方案的核心,它不只具有了解释执行OCScript的能力,它还承担了不可或缺的内存管理任务和线程管理任务

你好 2017 | 微信开源计划项目鉴赏_内存管理_10

内存管理系统

咱们深刻剖析了操做系统和OC运行时的内存管理相关的自动控制原理,构建了跟Native一致的内存管理机制,确保全部数据类型的内存获得妥善管理与正确释放。


解释执行系统

咱们以图灵机做为计算模型,构造了具备强大通用计算能力、能够正确识别OC语义的专有计算系统


你好 2017 | 微信开源计划项目鉴赏_内存管理_11


线程管理系统

为了支持跟Native一致的支持抢占式多线程的线程管理机制,咱们构造了多核心并发多任务执行框架

你好 2017 | 微信开源计划项目鉴赏_字节码_12


一个运算核心对应一个线程

你好 2017 | 微信开源计划项目鉴赏_线程管理_13

咱们通过精心设计的运算核心结构很是紧凑,对内存的占用量几乎能够忽略不计,就是有上百个线程在APP中运行,也表示毫无压力。

OCSBridge



桥接器主要由三部分组成

你好 2017 | 微信开源计划项目鉴赏_线程管理_14


OCSBridge各个部分都基于OCSABI来构建,OCSABI使用汇编来实现,确保了解释器能够与Native最底层进行直接高速通讯

你好 2017 | 微信开源计划项目鉴赏_字节码_15

值得一提的是,Block Bridge实现最复杂,它必须符合“OCS——Native互调完备性矩阵”

你好 2017 | 微信开源计划项目鉴赏_线程管理_16

显然只有这样,才能实现任意自定义Block的双向互调。

OCSEngine



拥有解释器和桥接器后,咱们就能够构造出强大的动态化引擎,并植入到任意APP中去。

OCSEngine框架图以下

你好 2017 | 微信开源计划项目鉴赏_内存管理_17


配置系统,解析动态化配置文件,使用OC Runtime时特性,为进程动态添加/替换OC 方法。

运算系统,职责由OCSVM承担。

通讯系统,职责由OCSBridge承担。

OCSEngine启动流程以下

你好 2017 | 微信开源计划项目鉴赏_字节码_18

OCSEnging完成启动后,就能够和Native环境融为一体,流畅地完成各类逻辑执行。



OCS化Native代码流程



只须要使用OCS转化宏把代码包裹起来,就能够由OCSCompiler自动完成转化流程。不管是几百行代码的迷你小模块,仍是上万行代码的超级巨无霸类,都可一网打尽,便捷性不言而喻。

你好 2017 | 微信开源计划项目鉴赏_字节码_19



性能测试


OCS上线前,咱们邀请了手Q性能专项测试团队进行对OCS进行了性能专项测试。

咱们使用手Q挂件商城做为测试案例,主要缘由以下:


1.挂件商城是XPatch插件实现的,而且保留了完整的Native代码。


2.挂件商城使用了布局很是复杂、内容丰富的的列表,这为测试滑动流畅度提供了绝佳的场景。

你好 2017 | 微信开源计划项目鉴赏_内存管理_10

测试方法:分别针对不一样实现分别编写不一样测试包,使用相同的测试环境进行测试。

测试机器:iPhone 5s。


各项测试数据以下图表:


你好 2017 | 微信开源计划项目鉴赏_内存管理_21

你好 2017 | 微信开源计划项目鉴赏_线程管理_22

你好 2017 | 微信开源计划项目鉴赏_线程管理_23

你好 2017 | 微信开源计划项目鉴赏_内存管理_24


从以上各数据都不难看出,OCS性能跟Native至关接近。特别是对用户体验影响最大的滑动流畅度方面,OCS的表现几乎跟Native持平,事实上,咱们从肉眼上已经难以分辨出页面究竟是用Native实现仍是OCS实现的了。


海量用户实战



OCS自9月份在手Q上线,目前已经已经有近20个业务、数万行代码使用OCS进行了动态化,安装包减量接近1M。所转业务日PV高达千万级别,并快速向亿级别挺进。同时,Crash率呈逐步降低趋势(OCS的自己的Bug不断获得收敛),最新线上版本全量OCS插件日Crash率(Crash总次数/打开总次数)为十万分之二。另外,还没有收到性能测试部门或外部用户遇到OCS业务出现卡顿、死锁相关反馈。


你好 2017 | 微信开源计划项目鉴赏_字节码_25

你好 2017 | 微信开源计划项目鉴赏_线程管理_26


实战数据也代表,在四大一致性原则指导下设计实现的OCS动态化框架,其易用性、稳定性、和流畅性,都经得起大规模代码转化与海量用户验证的实战考验。




常见问题与解答



问:OCSEngine的安装包大小如何?

答:OCSEngine编到APP中的安装包增量不到200k。对,你没看错,不到200k。


问:OCS为啥不用JS做为中间语言呢?

答:这是一个好问题,从图灵等价的角度来看,咱们可使用JS、Lua甚至甲骨文来做为中间语言,只要你喜欢就好。但通过理论验证,在咱们看来,OCScript会是更好的选择。为何呢?事实上咱们可使用计算理论和信息论来进行论证,但限于篇幅,咱们就不在这里展开。后续咱们会专门写一篇论文性质的文章来讨论这一课题,文章题目初步拟为《第三方脚本语言做中间语言的iOS动态化方案探索,从快速入门到果断放弃》,后续欢迎关注。


问:OCS有开放计划吗?

答:咱们很是愿意与业界同行相互交流学习,一同促进iOS动态化方案的进步。对于方案原理,咱们已经在实践开放计划,而对于具体工程实现开放,因为受到法律约束,目前尚未明确时间表,但咱们也在积极推进之中。


感谢 OCS 团队受权文章。




你好 2017 | 微信开源计划项目鉴赏_字节码_27