百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Cube 技术解读 | Cube 小程序技术详解

zhezhongyun 2025-06-19 02:12 49 浏览

作者:曾维宏(恒实)

本文为Cube 技术解读》系列第三篇文章,之前上线的《支付宝新一代动态化技术架构与选型综述》《Cube卡片技术栈解读》欢迎大家回顾。

小程序作为动态化或者跨端开发的一种技术栈,在业界成为事实标准。Cube 作为一种轻量级小程序技术栈,具有体积小、启动快、内存占用低等特点,也比较适合“即用即走”的小程序场景。以下将重点介绍 Cube 小程序技术栈与技术演进实践(若无特殊说明,所有的数据和图表都是针对小程序)。

Cube 渲染小程序

模块组成

小程序视角,Cube 渲染引擎主要由以下模块组成:

  • Components:主要是小程序规范里的组件;
  • Layout:支持 Inline,Block,Flex,Inline-Block,Inline-Flex 等多种布局方式,还包括文本分词,断行等计算;
  • Style:支持样式解析,样式匹配,样式继承,伪类和伪元素等多种选择器;
  • Rendering:管理渲染相关 Render Tree,图片资源请求调度等;
  • Animation:JS 和 CSS 动画实现;
  • JS Bridge:和 JS 引擎桥接;
  • JS Engine:目前支持 V8,JSC,QuickJS;其中 Android 下支持 V8,QuickJS;
  • Compositor:用于动画和图层的合成器(开发中)。

线程模型

Cube 小程序技术栈内部有这么几个线程:Bridge,Layout,Render,Paint,UI 等。

  • Bridge 线程:执行 JS;与 AppX 桥接的类 DOM 的 JSAPI;处理 JS 相关事件;
  • Layout 线程:布局计算;样式计算与匹配;维护 Layout Tree;
  • Render 线程:维护 Render Tree;绑定数据;分层;
  • Paint 线程:生成绘制命令;
  • UI 线程:平台事件分发;UI 布局。

小结

  • 并行布局,异步绘制:这里的并行是指 JS 执行,Layout 布局 以及 Render 三者完全并行处理。由于 Layout 和 Render,Paint 等不在一个线程,因此是异步绘制;
  • 多个线程协同工作,有点像 CPU 的 5 级流水线。

值得注意得是Web 渲染引擎有个特点就是和 Node 相关的 DOM 操作必须和 JS 在一个线程。这就导致解析 HTML,布局,样式计算,DOM,JS (包括垃圾回收)都在一个线程里。带来的后果就是只有解析完文档才能看到 UI 效果,这也是 Web 渲染小程序白屏时间较长的一个原因。

Cube小程序技术栈,将“DOM操作” 和 JS 执行解耦。因此 JS 的 GC 不会影响 UI 呈现。这种实现对于加快小程序启动非常有帮助。由于布局计算和 JS 执行也解开耦合,因此一般不会由于 JS 执行阻塞 UI 交互。

Cube 小程序技术栈的特点

  • 体积小,启动快:主 so 只有 2.8 MB(如果包括 Ariver,AppX,InsideSDK,整体小程序技术栈最小是 5.7MB)。另外可以享受到 OS 的红利(包括 UI 的初始化和缓存);
  • 高性能:接近于原生体验;
  • 内存占用小:小程序技术栈初始化后(包括 Inside SDK,Cube,AppX),大约只需要 7.5 MB;
  • 支持 Android,iOS 双端。

与 Web 引擎对比

下面仅仅针对小程序场景与 Web 引擎对比:



Web

Cube

DSL

AXML

CSS

部分支持

DOM

不支持(有部分替代的接口)

Component2

插件

不支持(规划中)

组件

部分支持

开发工具

发布打包

IDE/CLI

CLI

JS 调试

预览 DOM

编辑样式

特性

JS 上下文

每个业务一个 Worker

所有业务共享一个 Worker

布局

CSS 里各种布局

CSS 里常用布局

样式

CSS 全集

CSS 子集

JS 引擎


V8/JSC/JSI

V8/JSI/JSC/QuickJS

特点

性能上

启动较慢,内存占用较大

启动快,体积小,内存占用低

技术演进

让小程序业务低成本适配 Cube 渲染小程序,需要做三方面的工作:

  • 拥抱 Web 技术,补齐前端开发常用的能力:包括 CSS,小程序组件等;
  • 完善相关工具:包括开发,调试,Profile,发布,打包等;
  • 针对 Cube 的架构特点,深入优化,并拉开和 Web 渲染的差异。提供更好的用户体验。

新的流式布局(Flow Layout)

最初 Cube 小程序使用只支持 Flex 布局 Yoga 用于布局计算。后面升级成支持 Block,Flex,Inline-Block等多种布局方式的 Flow Layout。从而解决开发者只能使用 Flex 布局的困扰。目前两个布局引擎 Cube 内部都支持。其中 Flow Layout 主要用在小程序,Yoga 用在卡片。两者能力差异如下:


Yoga

Flow Layout

display: none

display: flex

display: inline

display: block

display: inline-block

display: inline-flex

display: -webkit-box

display: grid

可以扩展支持

支持 CSS 样式表

老版本的 Cube 只支持内联样式和简单的 CSS 选择器;然而小程序并没有约束 CSS,因此 Cube 扩充支持 CSS 样式表,样式继承,多种选择器等。从而使得 Web 渲染切换到 Cube 渲染,适配成本大大降低。甚至部分小程序可以做到在小程序 IDE 里基于 Web 渲染开发,然后打包成 Cube 渲染产物在真机上预览。前端同学无需进行过多的修改和适配。

新老 Cube 版本,选择器支持上的差异如下:


老版本 Cube[1]

新版本 Cube

内联样式

id 选择器

类选择器

元素选择器

样式继承

伪类、伪元素

属性选择器

选择器分组

分组选择器

组合器

@keyframes

@fontface

@media

可扩展支持

注:

  • [1] 老版本 Cube 是指:钱包 10.2.0 以前版本;
  • 新样式能力基本上对标 Web 引擎的样式能力;
  • 新样式能力支持像这种复杂选择器。
div > div.jartto p span.yellow a#t1 {}
.pixel-ratio-2 .web1px::before {}
div:nth-child(2n+1) {}
input[type="button"] {}
#blue,div > div.jartto p span.yellow a#t1 {}

支持自动分词,断行(Inline Text)

最初 Cube 用的是 Android 和 iOS 提供的文本计算和绘制能力。这种技术方案(以下称为平台层 Text)存在3个问题:

  1. 性能问题:特别是 Android 下,利用 Android 平台层的接口实现文本布局计算,导致在文本较多的情况下,布局耗时在渲染整体耗时里占比较高;
  2. 富文本特性:富文本以及许多文本特性支持较麻烦;
  3. 各平台上实现文本效果存在细节差异或者兼容性问题。

针对上述问题,在 Flow Layout 基础上增强支持 Inline Text 布局计算文本。基于 Inline Text 可以较轻松实现以下富文本,图文混排,分词,自动换行等。

1.富文本

2.自动换行和分词

Inline Text 实现前后的文本样式对比如下:


平台层 Text

Inline Text

width: fit-content

overflow-wrap: break-word 或 anywhere

word-wrap: break-word 或 anywhere

text-align: jusify

待支持

text-align-last

text-align-start

待支持

text-emphasis

待支持

text-decoration: overline

待支持

text-decoration-color

待支持

line-break

待支持

word-break

white-space

vertical-align

font-family

font-face

font-weight

float

clear

line-height

  • 假设原有 Cube 采用平台层接口实现的文本特性称为:平台层 Text
  • 表示实现细节上不完善或者不完全支持;
  • 在 Inline Text 基础上可以实现功能丰富的富文本组件;
  • 值得一提的是:该实现非常精巧,对于 Cube 包体积只增加了 170KB。具体细节后续文章详细探讨。

文本布局计算耗时对比(文本节点较多场景):


Yoga

平台层 Text

Flow Layout

平台层 Text

Flow Layout

Inline Text

布局耗时

单位(ms)

456

763

170

采用 QuickJS 替代 V8

V8 虽然是性能最高的 JS 引擎,但是存在内存占用大,初始化较慢等不足。在 IoT 或者低端设备上这些不足会被放大。因此在这些设备上,Cube 采用 QuickJS 取代 V8。一方面降低内存占用,另外一方面提升初始化性能。

Cube 内部目前适配了多个 JS 引擎,具体如下:

  • 在 Android 移动端上使用 V8 和 JSI
  • iOS 上使用 JSC
  • IoT 等低端设备上使用 QuickJS

另外我们在开源 QuickJS 基础上做了些优化工作。优化的结果大致如下(后续文章将详细介绍):

V8 Bench

开源 QuickJS

优化后 QuickJS

效果

DeltaBlue

627

731

+16.5%

Crypto

893

933

+4.5%

RayTrace

459

1194

+160%

EarleyBoyer

973

1906

+95.9%

RegExp

178

265

+48.9%

Splay

756

1783

+135.8%

NavierStokes

1644

1643

0%

分数(越高越好)

672

991

+47%

支持动画和多媒体组件

除了上述基础组件和能力之外,动画和多媒体也是部分小程序不可缺少的。因此我们扩展支持了 VideoCanvasLottieLive Player 等组件支持。并应用于 TV 大屏小程序、小游戏以及直播场景上。

在低端设备上,如何提高动画帧率并且降低内存占用也做了深度的优化。以下是 Video 和 Canvas 组件在小程序中的效果图:


Cavas 组件

Video 组件

支持多种模式的小程序产物

目前 Cube 支持多种模式的小程序产物:NativeCubeShared

  • Native 模式:对应的是旧的 Cube 渲染小程序模式,不支持 CSS 样式表,只能支持内联样式和有限的几种 CSS 选择器。性能最高,兼容性较低;
  • Cube 模式:在 Native 模式进化而来,支持 CSS 样式表和多种 CSS 选择器。性能良好,支持常用的 CSS 样式和特性(包括样式继承,多种 CSS 选择器);
  • Shared 模式:为了降低 Web 渲染的小程序迁移或者过渡到 Cube 渲染而开发。在同一个小程序产物里既支持 Web 渲染一部分页面又支持 Cube 渲染一部分页面。而且 Cube 渲染的页面支持样式表。这样在性能和兼容性平衡。小程序产物相对于 Web 渲染的小程序,产物体积增加不会超过 10%。


Native 模式

Cube 模式

Shared 模式

小程序产物体积

较小

稍大

小程序性能

稍低

小程序兼容性

一般

稍高

新样式

不支持

支持

支持

新布局

支持

支持

支持

:如果需要 Web 产物兜底,则 Native 模式Cube 模式的小程序产物,比 Shared 模式大。

当前工作

Cube 小程序在 TV 和 POS 机上和相关团队,一起打磨小程序技术栈(包括渲染引擎,JS 引擎,AppX,Ariver 容器)等。

在 TV 上面临的问题:

  • 内存少:有的设备只有 512MB 内存,长列表滚动容易卡;
  • 需要支持焦点切换;
  • CPU 主频较低:有的只有 1GHz。

短中期目标是用小程序技术栈替代 WeeX 单页。当前进展如下:

  • 小程序启动性能上超过 WeeX 单页(低端设备上优势更明显);
  • 内存占用上,小程序初始化后内存占用小于 10MB,典型小程序整体内存占用在 32MB 左右。

具体细节后续文章详细总结。

在 POS 机上面临的问题:

在 POS 机上跑点餐小程序,主要有面临以下问题:

  • 内存少:部分设备只有 512MB 内存,容易出现卡死和 OOM;
  • CPU 核心少:部分 CPU 只有双核(硬件性能大约是主流手机的 1/5);
  • 长列表滚动卡。

短中期目标是用小程序技术栈替代 Flutter 开发的 App。当前进展如下:

  • 小程序首屏启动性能提升了 30%+;
  • 小程序重点的交互场景的页面,比如:购物车,商品详情页等,都已接近 Flutter App;
  • 首页滚动帧率达到 50,用户已经难以感知和 Flutter 的差异(Flutter 帧率是 60);
  • 小程序内存占用下降了 30%(本地测试已无卡死和 OOM)。

该场景主要是文本节点较多的长列表。采用了非常多的优化方法,后续文章详细总结介绍。

总结

为了适配小程序,Cube 渲染引擎在布局计算、样式能力、组件支持,还有开发工具等在小伙伴一起努力下取得了较大的进展。同时在低端设备(比如:IoT 设备)或者性能敏感场景,Cube 小程序性能优化,降低内存占用也取得了不错的效果。而未来面对多种多样的 IoT 设备,还需要加速技术演进以支持更多的场景。欢迎大家一起来交流讨论。

关注【阿里巴巴移动技术】微信公众号,每周 3 篇移动技术实践&干货给你思考!

相关推荐

Python入门学习记录之一:变量_python怎么用变量

写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...

python变量命名规则——来自小白的总结

python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...

Python入门学习教程:第 2 章 变量与数据类型

2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...

绘制学术论文中的“三线表”具体指导

在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...

Python基础语法知识--变量和数据类型

学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...

一文搞懂 Python 中的所有标点符号

反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...

Python变量类型和运算符_python中变量的含义

别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...

从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序

在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...

Python中下划线 ‘_’ 的用法,你知道几种

Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...

解锁Shell编程:变量_shell $变量

引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...

一文学会Python的变量命名规则!_python的变量命名有哪些要求

目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...

更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for

src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...

C++第五课:变量的命名规则_c++中变量的命名规则

变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....

Rust编程-核心篇-不安全编程_rust安全性

Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...

探秘 Python 内存管理:背后的神奇机制

在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...