原作时间:2019~2021年

此次共享,腾讯内网 / 外网同步发布。

内部代码地址:https://git.code.oa.com/fatboyli/QBDF

外部代码地址:GitHub - ventureli/QBDF

两年前的一个混淆包(无源码):GitHub - ventureli/VLOCInterpreter

作者:腾讯fatboyli(李文强)

1.立项

大约在2017年的时候,QQ浏览器IPAD项目组还在北京,那时候AppStore上架还比较慢,我们项目组决定做自己的动态化框架,动态化框架的目标是:真正实现一次发版本,多次发布。

整个iPAD项目组对整个市场的动态化框架做了一次比较深入的研究(为期一周)当时团队的分工如下:如今小伙伴都以天各一方,怀念和大家一起战斗的日子。

项目组分工

最开始我们并没有信心完全从0开始做一个全新的动态化框架,我们的想法是从WEEX上进行更改和扩展,形成QB团队自己的动态化框架。这一决定其实浪费我大约1.5个月的时间。WEEX的核心问题非常严重。整个动态化框架的设计和实现工作最后交给我来实现。

2.第一版本架构

接到任务后,大约利用了2周左右的时间对WEEX的源码进行了了解,我们第一步对weex的整个一些UI层面的限制进行了修正。主要有如下几个方面:(当时版本的weex比较早,现在这些问题可能已经不存在了。)

1.不支持完全比例排版(比如子控件的高度是父控件的宽度的50%)

2.对旋转屏幕的支持

3.添加iOS的特有属性支持(比如对tableView的group的形势的支持)

4.修正BUG

上面的内容我就不展开说明了,这并不是本系列文章的重点,但是里面有非常多有意思的小trick。有兴趣的同学可以单独联系我。

以上主要是针对UI层面的。但是WEEX在逻辑层面有天生的短板,它和RN是完全一样,采用预先注册的形势进行和Native交互,这只能算作是跨平台,并不能算作完全能力的动态化,我猜想这也是苹果之所以没有对RN和WEEX动手的原因。比如我在WEEX要用的某个NATIVE写好的BUTTON,那么这个BUTTON在WEEX引擎初始化的时候用以下代码注册好。

[WeexSDKEngine registerModule:xxxx WithClass:XXX]

这就根本算不上动态化了,这也造成了WEEX还不能够进行打PATCH。

第一版本架构

3.第二版本架构

但是 等等,当时是有能够完全能力动态运行和打PATCH的框架的偶~ YES, JSPATCH!所以我当初想的是用WEEX处理UI层面的操作,用JSPATCH来做逻辑层面的引擎从而达到无限制的动态化能力。架构大约是这个样子。

第二版本的架构

这里面的核心问题是怎么WEEX的脚本里嵌入JS脚本,这个设计也是比较有意思的,我设计的几个宏字符串

_OBJC_JSP_REGISTERTARG_(注册参数)

_OBJC_JSP_JSCALL_START_(JSPATCH代码开始)

_OBJC_JSP_JSCALL_END_(JSPATCH代码结束)

_OBJC_JSP_JSCALL_RETURN_(输出变量)

通过这几个宏字符串可以完成JSPATCH代码内嵌到WEEX里。这几个宏定义我也不展开详细介绍了,大致的思路是JSPATCH运行的时候先通过全局替换的方案,把这些字符串替换为一个内置的方法,比如 XXX_CALL(1),这样,然后把每段JSPATCH代码编号,这样当运行到XXX_CALL 这个方法时候,就能知道要去取什么JSPATCH脚本了。同时_OBJC_JSP_REGISTERTARG_方法预先注入参数,_OBJC_JSP_JSCALL_RETURN_ 输出参数即可。此时的代码看起来是这个样子的。

WEEX桥接JSPATCH

3.第三版本架构

完成了以上的工作,我们第一个QBDF框架就实现了。但是在此基础上我重新做了一个扩展,基于以下的想法。

WEEX是JS,HTML也可以运行JS

WEEX的JS可以桥接JSPATCH,那么HTML应该也可以桥接JSPATCH

HTML的JSPATCH是需要做加密的,否则会暴露NATIVE逻辑

所以我重新设计了一个新的模块作为QBDF的补充,就是 HTML+JS+CSS +资源 打包成为ZIP作为WEBAPP,通过后台模块下发和维护,同时JS桥接JSPATCH代码实现WEBAPP能力无限制。

如上后第三版本的框架的架构图如下。

第三版本框架

4.第四版本架构

以上框架完成后,基本上已经完成我们最初的想法,确实是一个有动态化能力的框架,

Weex开源代码深度定制,UI动态化

可动态配置

可以调用几乎任意代码,无须注册

虽有学习成本,VUE和JS比较好学

未来只要解决bug即时更新开源代码就可以了

但是其实在这个过程中,发现了几个问题。我做了如下的考虑。

SPATCH和WEEX都是基于JAVASCRIPTCORE的,都是基于WEBTHREAD的。而我们浏览器里面有大量的WEBVIEW一旦代码写的不注意就回出现死锁,甚至有时候无法避免以至于不能打PATCH,这也是我们和其他APP比较特殊的地方。

QBDF不应该是这样一个修修补补的二流框架!

还没达到我自己的要求

所以最后我们重新设计了整个QBDF框架,从0开始写一个OC语言的解释器和虚拟机动态运行OC代码,一个完全基于编译原理层面的动态运行OC语言的解决方案。第四版本的家购入如下。

第四版本QBDF脚本

好了,本文到这里就结束了,我们的QBDF经历过很多版本的迭代。

QQ浏览器HD的动态化方案QBDF的前世今生(1)【简书被冻结-搬运】相关推荐

  1. QQ浏览器HD的动态化方案QBDF的总体架构设计(2)【简书被冻结-搬运】

    原作时间:2019-2021年 此次共享,腾讯内网 / 外网同步发布. 内部代码地址:https://git.code.oa.com/fatboyli/QBDF 外部代码地址:GitHub - ven ...

  2. QQ浏览器HD iOS 动态化/热修复方案QBDF(0) 【简书被冻结-搬运】

    原作时间:2019-2021年 此次共享,腾讯内网 / 外网同步发布. 内部代码地址:https://git.code.oa.com/fatboyli/QBDF 外部代码地址:GitHub - ven ...

  3. QQ浏览器HD iOS 动态化/热修复方案QBDF解释器-从C89简化的BNF范式(4)【简书被冻结-搬运】

    原作:2019-2021年 此次共享,腾讯内网 / 外网同步发布. 内部代码地址:https://git.code.oa.com/fatboyli/QBDF 外部代码地址:GitHub - ventu ...

  4. QQ浏览器HD iOS 动态化/热修复方案QBDF解释器-词法分析(3)【简书被冻结-搬运】

    此次共享,腾讯内网 / 外网同步发布. 内部代码地址:https://git.code.oa.com/fatboyli/QBDF 外部代码地址:GitHub - ventureli/QBDF 两年前的 ...

  5. QQ浏览器HD iOS 动态化/热修复方案QBDF解释器-语法制导翻译与递归子程序设计(编译原理)(5)简书被冻结-搬运】

    原作时间:2019-2021年 此次共享,腾讯内网 / 外网同步发布. 内部代码地址:https://git.code.oa.com/fatboyli/QBDF 外部代码地址:GitHub - ven ...

  6. 浏览器 pad android,腾讯发布 QQ浏览器 HD for Android Pad,加速布局手机浏览器

    作为中国第二大手机浏览器厂商,腾讯一直没有停止对老大UCWeb 的追赶.并且腾讯的追赶速度着实让人害怕. 继此前发布了「QQ浏览器HD For iPad」 之后,腾讯于近日发布了「QQ浏览器 HD f ...

  7. 浏览器 pad android,腾讯发布 QQ浏览器 HD for Android Pad,加速布局手机浏览器 | 36氪...

    作为中国第二大手机浏览器厂商,腾讯一直没有停止对老大UCWeb 的追赶.并且腾讯的追赶速度着实让人害怕. 继此前发布了「QQ浏览器HD For iPad」 之后,腾讯于近日发布了「QQ浏览器 HD f ...

  8. android 新浪财经截屏分享,QQ浏览器HD 2.2:独创截屏分享至微博

    近日,腾讯发布了QQ浏览器HD(aPad)2.2,最大特色是网页拉取速度提升20%,上网更流畅;同时,还推出"截图"插件,是目前首个支持截图的aPad浏览器,用户还可以将截图分享至 ...

  9. android 平板全屏,QQ浏览器安卓平板来啦!实现了真正的全屏,让阅读更加清静!...

    QQ浏览器HD(aPad)v2.0版本全新发布,设计更加简约灵动,体验轻盈优雅.2.0版本启用了全新的UI设计,以沉静辽阔的淡蓝色为主题,标签栏和地址栏"轻"量设计,多窗口向右滑动 ...

最新文章

  1. 深入理解特征值与特征向量
  2. 微软职位内部推荐-Senior Software Engineer
  3. [architecture]-ARMv8/armv7/linux的栈/sp的学习和总结
  4. Spring Boot整合Spring Data Redis-存取JSON格式Java对象
  5. 用C++面向对象的方式动态加载so
  6. 【机器学习】数据挖掘算法——关联规则(三),FP-growth算法
  7. 59.排序好的大数据创建索引文件,并实现大文件的二分查找,根据索引百万数据秒读数据...
  8. 移动端 项目开发经验集锦
  9. redis常用命令(高级篇)
  10. 读取properties文件方式
  11. 树莓派 Learning 001 装机 ---之 1 安装NOOBS系统
  12. 信息安全产业爆发在即 十三五年均增长将达20%以上
  13. 内文广告程序开发中遇到的一个问题
  14. 服务器 16路直连 英特尔,Intel 10nm服务器怪咖:八通道+16条内存
  15. Python 奇淫技巧 -- 利用pandas读取xml转换为excel
  16. excel因为文件格式或文件扩展名无效,请确定文件未损坏(Excel文件格式或文件扩展名无效)...
  17. 【ARM汇编】打印金字塔 | 打印倒三角
  18. 解决SQLyog连接MySQL数据库时报2058错误
  19. 百万“悬赏” | 2022光合组织AI解决方案大赛Wanted You!
  20. 收藏一个Ping的小工具类,可用于网络中检测目的设备是否在线

热门文章

  1. 图灵逝世 | 历史上的今天
  2. flex bison 基础概述
  3. 幻想三国ol服务器没有响应,《幻想三国OL》新手攻略新手必知的三点建议
  4. 多思计组实验实验七 简单模型机实验
  5. [LitCTF 2023] crypto,pwn,rev
  6. 目前为止小程序审核不通过原因整理汇总
  7. matlab引用表格命令,如何用matlab引用excel表格数据-matlab如何从excel表格中读取数据?...
  8. 产品运营必看!这6本书你不该错过!
  9. PyCharm连接远程服务器详细教程
  10. Java 笔试:常见题目总结,soul移动端开发工程师