阅读更多

0顶
0踩

编程语言

转载新闻 OCS:史上最疯狂的iOS动态化方案

2016-12-30 14:34 by 副主编 jihong10102006 评论(0) 有11489人浏览
在iOS的发展历程上,涌现了很多动态化方案,有历史悠久的WaxPatch动态化方案,有远近闻名的JSPatch动态化方案。今天我们向大家介绍一款堪称“史上最疯狂”的iOS动态化方案——OCS.

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

那么,我们为什么要实现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运行时进行消息发送的时候需要进行大量的字符串解析和数据转换操作,效率非常低下,很容易造成页面滑动卡顿和掉帧

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

四大一致性原则
为了克服第三方脚本虚拟机动态方案存在的种种问题,我们从2015年下旬开始了OCS动态化方案的设计与实现。为了让上述问题得到有效解决, 我们提出了普适性的iOS动态化四大一致性原则:
  • 开发体验一致性;
  • 线程管理一致性;
  • 内存管理一致性;
  • 语义定义一致性。

这四大一致性原则贯穿于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也有极佳的表现,动态化后掉帧率增长量几乎可以忽略不计。

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

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

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

  • 基本运算指令使得OCScript具有加、减、乘、除、移位等各种基本算术、逻辑运算能力。
  • 内存操作指令使得OCScript具有在内存中的读写各种数据的能力;
  • 地址指跳转指令使得OCScript具有分支判断与控制转移的能力;
  • 强类型转换指令使得OCScript具有对数据类型进行强制转化能力;
  • OC调用指令使得OCScript具有指令级别的消息发送能力,根本性地提高了执行效率。
OCScript中每个指令编码占一个字节,所以储存空间非常紧凑。

OCSCompiler
我们基于Clang构建了编译器

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

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

它的具体含义可以根据对应的符号信息翻译得到

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

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

然后由OCSVM加载执行。

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


内存管理系统
我们深入剖析了操作系统和OC运行时的内存管理相关的自动控制原理,构建了跟Native一致的内存管理机制,确保所有数据类型的内存得到妥善管理与正确释放。

解释执行系统
我们以图灵机作为计算模型,构造了具有强大通用计算能力、可以正确识别OC语义的专有计算系统


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

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

我们经过精心设计的运算核心结构非常紧凑,对内存的占用量几乎可以忽略不计,就算有上百个线程在APP中运行,也表示毫无压力。

OCSBridge
桥接器主要由三部分组成

OCSBridge各个部分都基于OCSABI来构建,OCSABI使用汇编来实现,确保了虚拟机可以与Native最底层进行直接高速通信

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

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

OCSEngine
拥有虚拟机和桥接器后,我们就可以构造出强大的动态化引擎,并植入到任意APP中去。

OCSEngine框架图如下

  • 配置系统,解析动态化配置文件,使用OC Runtime时特性,为进程动态添加/替换OC 方法。
  • 运算系统,职责由OCSVM承担。
  • 通信系统,职责由OCSBridge承担。
OCSEngine启动流程如下

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

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


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

我们使用手Q挂件商城作为测试案例,主要原因如下:
  • 挂件商城是XPatch插件实现的,并且保留了完整的Native代码。
  • 挂件商城使用了布局非常复杂、内容丰富的的列表,这为测试滑动流畅度提供了绝佳的场景。


测试方法:分别针对不同实现分别编写不同测试包,使用相同的测试环境进行测试。
测试机器:iPhone 5s。

各项测试数据如下图表:
物理内存(单位:M)


CPU平均值


滑动流畅度


加载耗时(单位:S)


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

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


OCS化代码行数(单位:行)


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

团队介绍
我们OCS联合开发小组六位成员来自鹅厂各个部门,有白银峰、周刘纪、董超这样才华横溢的移动互联网新生代,又有殷诗壮、张恺、徐国欢这样混迹码界多年的老油条。然而年龄与部门距离并没有形成不可逾越的鸿沟,对技术创新的浓厚兴趣与对提升生产效率的本能饥渴使得我们并肩作战的决心从未动摇,我们潜心钻研攻克了OCS一个又一个的难题。

常见问题与解答
问:OCSEngine的安装包大小如何?
    答:OCSEngine编到APP中的安装包增量不到200k。对,你没看错,不到200k。

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

问:OCS有开放计划吗?
    答:我们非常愿意与业界同行相互交流学习,一同促进iOS动态化方案的进步。对于方案原理,我们已经在实践开放计划,而对于具体工程实现开放,由于受到法律约束,目前还没有明确时间表,但我们也在积极推动之中。

结语
曾经有人说过:如果你问一个程序员此时此刻正在在干什么,他一定会毫不犹豫地告诉你,他不是在改Bug,就是在去改Bug的路上。

Bug是程序员幸福生活的头号杀手。让我们感到欣慰的是,OCS从上线到现在,都没有收到OCS框架本身给使用OCS进行动态化的业务引入重大Bug的反馈(零星引入Bug的反馈基本是由于框架实现过程中手抖引入的)。

OCS不仅是一种崭新的“拿起就用”的动态化方案,更是成一种“用完就走”的可依赖的开发方式。通过OCS,我们捍卫了程序员作为普通劳动者应有的合法权利:每一个人都可以更加高效地完成动态化工作,并在忙碌了一天后,可以放下工作上的纷扰,花多点时间陪陪身边的伴侣和家人,并得到充分的休息,保证第二天可以满血复原,继续着改变世界的工作。

最后,愿OCS可以早日给业界带来力所能及的贡献。
  • 大小: 101.9 KB
  • 大小: 129 KB
  • 大小: 91.5 KB
  • 大小: 112.7 KB
  • 大小: 164.9 KB
  • 大小: 11.5 KB
  • 大小: 80.9 KB
  • 大小: 6.7 KB
  • 大小: 17.6 KB
  • 大小: 13.5 KB
  • 大小: 15.2 KB
  • 大小: 70.2 KB
  • 大小: 21.2 KB
  • 大小: 35.8 KB
  • 大小: 13.4 KB
  • 大小: 232.5 KB
  • 大小: 170.7 KB
  • 大小: 13.1 KB
  • 大小: 107.6 KB
  • 大小: 13 KB
  • 大小: 200.8 KB
  • 大小: 19 KB
  • 大小: 21.7 KB
  • 大小: 18.3 KB
  • 大小: 19.4 KB
  • 大小: 27.2 KB
  • 大小: 28 KB
来自: SNG - OCS团队
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • OCS:史上最疯狂的 iOS 动态化方案

    今天精神哥向大家介绍一款堪称“史上最疯狂”的iOS动态化方案—— OCS 。 本文来自腾讯 SNG - OCS团队 初窥OCS OCS是全新设计的iOS动态化方案。我们定义了一套精确描述OC语义的字节码指令集(OCScript),...

  • OCS——史上最疯狂的iOS动态化方案

    OCS——史上最疯狂的iOS动态化方案 导语 在iOS的发展历程上,涌现了很多动态化方案,有历史悠久的WaxPatch动态化方案,有远近闻名的JSPatch动态化方案。今天精神哥向大家介绍一款堪称“史上最疯狂”的iOS动态...

  • fir.im Weekly - iOS / Android 动态化更新方案盘点

    动态化更新是 App 开发必然面对的问题。在 iOS 环境下,Apple 开发者们像是“ 带着手铐脚镣跳舞” ,相比之...本期 fir.im Weekly 整理了滴滴打车团队动态化方案、JSpatch 的作者 iOS 动态化分享,以及 QQ空间、微信...

  • ios android 动态更新数据类型,iOS/flutter动态化杂谈

    iOS/flutter动态化杂谈为什么需要动态化?实际上运营需求倒是其次,更主要的是修复线上严重问题。那么是否一定要动态化呢?倒也不一定,国外开发者似乎更倾向于通过更好的机制来避免问题产生,搞更完善的CR/CI/单元...

  • iOS编译器LLVM + Clang架构分析以及三种混淆方案实践分析

    再来一个更容易理解的说法,iOS 开发中 Objective-C 是 Clang / LLVM 来编译的。(swift 是 Swift / LLVM) 传统的编译器最流行的设计是分三段,分别是前端(Frontend),优化器(Optimizer)和后端(Backend). ...

  • 移动开发周刊 Issue #173:Android、iOS 性能优化最佳实践案例

    Android、iOS、VR/AR/MR、直播等前沿移动开发技术,收录一周最热点,解读开发技巧,每周三移动周刊抢先看,我们希望从中能够让你有一些收获,如果你有好的文章以及优化建议,请发送邮件至mobilehub@csdn.net,在技术...

  • 移动端动态方案--VideoOS技术选择及具体实施

    目前移动端流行的动态化方案,按技术方向分为以下两种: 跨平台动态语言方案,利用js,lua等脚本语言做native功能的拓展,需要定义各个跨语言的bridge。代表性的方案有Facebook的React Native,阿里的Weex,它们都...

  • 移动开发的消亡史:出路在哪?

    热文导读| 点击标题阅读金九银十跳槽季如何进阶找到合适满意的工作?真实靠谱:百度的职级、T系列、薪资、及晋升潜规则GitHub 上四万 Star 大佬的BATT求职回忆...

  • 深入剖析 iOS 编译 Clang / LLVM

    LLVM是一个模块化和可重用的编译器和工具链技术的集合,Clang 是 LLVM 的子项目,是 C,C++ 和 Objective-C 编译器,目的是提供惊人的快速编译,比 GCC 快3倍,其中的 clang static analyzer 主要是进行语法分析,...

  • 移动开发的罗曼蒂克消亡史

    QQ还推出了一个号称史上最疯狂的iOS动态化方案OCS,它们开发了一个自己的中间语言OCScript,还开发了一个自己的虚拟机OCSVM去执行它……稍微懂点编程的就知道这是一个多么疯狂的方案。 那的确是一个百花齐放的时代。...

  • 大前端开发者需要了解的基础编译原理和语言知识

    大前端开发者需要了解的基础编译原理和语言知识 在我刚刚进入大学,从零开始学习 C 语言...一般来说,当程序员讨论一门语言的时候,默认的上下文经常是:“用 xxx 语言来完成 xxx 任务”。所以一直困扰着的我的...

  • 【9493】基于springboot+vue的美食信息推荐系统的设计与实现.zip

    技术选型 【后端】:Java 【框架】:springboot 【前端】:vue 【JDK版本】:JDK1.8 【服务器】:tomcat7+ 【数据库】:mysql 5.7+ 项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧! 在当今快速发展的信息技术领域,技术选型是决定一个项目成功与否的重要因素之一。基于以下的技术栈,我们为您带来了一份完善且经过实践验证的项目资源,让您在学习和提升编程技能的道路上事半功倍。以下是该项目的技术选型和其组件的详细介绍。 在后端技术方面,我们选择了Java作为编程语言。Java以其稳健性、跨平台性和丰富的库支持,在企业级应用中处于领导地位。项目采用了流行的Spring Boot框架,这个框架以简化Java企业级开发而闻名。Spring Boot提供了简洁的配置方式、内置的嵌入式服务器支持以及强大的生态系统,使开发者能够更高效地构建和部署应用。 前端技术方面,我们使用了Vue.js,这是一个用于构建用户界面的渐进式JavaScript框架。Vue以其易上手、灵活和性能出色而受到开发者的青睐,它的组件化开发思想也有助于提高代码的复用性和可维护性。 项目的编译和运行环境选择了JDK 1.8。尽管Java已经推出了更新的版本,但JDK 1.8依旧是一种成熟且稳定的选择,广泛应用于各类项目中,确保了兼容性和稳定性。 在服务器方面,本项目部署在Tomcat 7+之上。Tomcat是Apache软件基金会下的一个开源Servlet容器,也是应用最为广泛的Java Web服务器之一。其稳定性和可靠的性能表现为Java Web应用提供了坚实的支持。 数据库方面,我们采用了MySQL 5.7+。MySQL是一种高效、可靠且使用广泛的关系型数据库管理系统,5.7版本在性能和功能上都有显著的提升。 值得一提的是,该项目包含了前后台的完整源码,并经过严格调试,确保可以顺利运行。通过项目的学习和实践,您将能更好地掌握从后端到前端的完整开发流程,提升自己的编程技能。欢迎参考博主的详细文章或私信获取更多信息,利用这一宝贵资源来推进您的技术成长之路!

  • (源码)基于Spring、Struts和Hibernate的OA系统.zip

    # 基于Spring、Struts和Hibernate的OA系统 ## 项目简介 本项目是一个基于Spring、Struts和Hibernate框架的办公自动化(OA)系统。该系统主要用于企业内部的日常办公管理,包括用户登录、组织管理、权限管理等功能。系统前端使用现成的模板和JavaScript、jQuery技术,后端通过Struts、Hibernate和Spring框架实现业务逻辑和数据持久化。 ## 项目的主要特性和功能 ### 登录模块 防止多设备登录系统能够检测到同一账号在不同设备上的登录情况,并在检测到异地登录时通知用户并强制下线。 WebSocket支持使用WebSocket技术实现实时通知功能。 ### 组织管理模块 部门管理支持部门的增删改查操作,包括查看部门信息、职位信息和员工数量。 用户管理支持用户的增删改查操作,包括指定用户所在部门、职位和角色。 角色管理支持角色的增删改查操作,包括查看角色权限和修改角色权限。

  • 基于MySQL、express框架、Vue3的光谷智慧交通系统源码+数据库+文档说明(高分项目)

    基于MySQL、express框架、Vue3的光谷智慧交通系统源码+数据库+文档说明(高分项目),该项目是个人毕设项目,答辩评审分达到98分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 基于MySQL、express框架、Vue3的光谷智慧交通系统源码+数据库+文档说明(高分项目)基于MySQL、express框架、Vue3的光谷智慧交通系统源码+数据库+文档说明(高分项目)基于MySQL、express框架、Vue3的光谷智慧交通系统源码+数据库+文档说明(高分项目)基于MySQL、express框架、Vue3的光谷智慧交通系统源码+数据库+文档说明(高分项目)基于MySQL、express框架、Vue3的光谷智慧交通系统源码+数据库+文档说明(高分项目)基于MySQL、express框架、Vue3的光谷智慧交通系统源码+数据库+文档说明(高

  • open3d python 给点云每个点设置不同的颜色

    open3d python 给点云每个点设置不同的颜色

  • 【电磁】基于matlab具有Mur吸收边界的区域的二维FDTD【含Matlab源码 9136期】.mp4

    Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

  • HengCe-18900-2024-2030中国室内木门市场现状研究分析与发展前景预测报告-样本.docx

    HengCe-18900-2024-2030中国室内木门市场现状研究分析与发展前景预测报告-样本.docx

  • (源码)基于ASP.NET Web API的供应链管理系统.zip

    # 基于ASP.NET Web API的供应链管理系统 ## 项目简介 供应链管理系统(SCM)是一个基于ASP.NET Web API框架开发的企业级应用,旨在帮助企业高效管理供应链中的各个环节。系统涵盖了供应商管理、采购管理、库存管理、订单管理等多个模块,通过API接口实现数据的增删改查操作,确保供应链的顺畅运作。 ## 项目的主要特性和功能 1. 供应商管理 供应商信息的增删改查操作。 供应商联系人管理。 供应商评级和分类管理。 2. 采购管理 采购订单的创建、编辑和删除。 采购产品的状态管理。 采购合同的生成和管理。 3. 库存管理 库存产品的入库和出库管理。 库存状态的实时监控。 4. 订单管理 订单的创建、编辑和删除。 订单状态的跟踪和管理。 5. 用户管理 用户登录和权限管理。 用户角色的分配和管理。

  • 基于SpringBoot的“学生考勤管理系统”的设计与实现(源码+数据库+文档+PPT).zip

    系统主要包括首页,个人中心,学生管理,教师管理,班级信息管理,课程信息管理,签到信息管理,考勤信息管理,请假信息管理,考勤统计管理等功能模块。

Global site tag (gtag.js) - Google Analytics