支付宝新一代动态化技术架构与选型综述 | Cube 技术解读

简介: 支付宝新一代动态化技术架构与选型综述 | Cube 技术解读

🙋🏻‍♀️ 编者按:Cube 起源于 native 页面的动态化诉求,产品形态表现于 Cube 卡片。随着小程序概念的出现,Cube 融入了支付宝小程序技术栈,产品形态为轻量级的支付宝小程序解决方案。本文为《Cube 技术解读》系列首篇文章,作者是蚂蚁集团客户端工程师入弦,欢迎查阅~

  背景

支付宝客户端的动态化技术经历三个阶段。第一个阶段是 native+web 的 hybrid 模式,以 webview 为基石。第二阶段是实体组件模式,把 html 描述的组件和  css 样式信息映射到实体组件,并且把实体组件的事件传递到js层进行处理。第三阶段是实体组件+部分光栅化的hybrid模式,Cube 是第三阶段的产物。Cube 起源于 native 页面的动态化诉求,产品形态表现于 Cube 卡片。随着小程序概念的出现,Cube 融入了支付宝小程序技术栈,产品形态为轻量级的支付宝小程序解决方案(相对于使用浏览作为核心的 web 小程序)。这篇文章是一个综述,也是 Cube 系列的首篇文章。

  技术选型&演进

Cube 的准确诞生时间很难确定,大致在 16 和 17 年之间,比 RN(ReactNative)晚上一年。Cube 诞生的主要原因是 native 页面的动态化诉求。钱包改版的频率高,给研发的压力很大,于是想到把高频改版的页面动态化。RN 和 Flutter 的出现,给了我们一个很好的观察视角,即业界优秀的科技公司是如何看待动态化这个话题以及它们的答案。起步阶段,我们达成以下共识:

1、独立研发,自主可控。我们没有选择基于 RN 的开源代码来实现我们的动态化解决方案,也没有 Flutter 公布源码后,切换到 Flutter。这么做是考虑到两点,第一点,技术栈的演进要掌握在自己手里,不希望被牵着鼻子走;第二点,开源项目的产品化成本并不低,后期的维护成本也不低;

2、服务业务,技术克制。首先,我们没有足够能力和资源来支撑一个通用技术产品,服务于钱包业务是第一位的,简单说就是贴着业务走。其次,我们拒绝只求花里胡哨的技术 demo,把核心能力做好,把产品成熟度做好,考虑拿到业务价值是第一位的。

基于上面两个共识,我们的技术选型如下:

  1. 选择 Javascript 作为逻辑语言;
  2. 选择 CSS 的某个子集作为界面描述语言;
  3. 自绘制(text/img/div/scroller)+ 原生组件 (input, animation,map, audio, video …)的混合渲染模式。

蚂蚁在前端的积累比较多,Cube 选择拥抱前端,采用 javascript 和 css 是自然的事情。默认 js 引擎是 quickjs。没有选择 v8,有两个判断:v8 太重,内存开销和库加载速度都不理想;Cube 的应用场景大概率不需要 v8 提供的 jit 能力。我们额外引入了第三方的 wamr ( https://github.com/bytecodealliance/wasm-micro-runtime ) 作为 webassemby 引擎,且在编译构建工具上支持 javacript 和 assemblyscript 混合开发。Flutter 开源后受到很多人的追捧,在很多文章和 ppt 上都看到了“Flutter 完全独立于平台层的渲染管线的优势”表述,认为比 RN 映射实体组件的方式要高级很多。我们不认为 Flutter 的渲染管线的性能优于操作系统的渲染管线,毕竟设备和操作系统可以垂直整合,利用一些设备特性。此外,是否自建渲染管线应该取决于业务诉求,而不应该盲目的追求技术。

Cube 的自建渲染管线仅限于自绘制标签,如前所述包括 text/img/div/scroller,使用平台层的 canvas api 直接绘制在系统的 view 上;如果某颗子树的标签都是自绘制标签,这颗子树会被“拍平”绘制在一个 view 上。自绘制标签以外的标签都是用映射原生组件的方式,并且封装了统一的实体组件映射些协议,提供给开发人员。目前 Cube 的业务场景主要集中在移动端,也简单尝试过往 linux/rtos 平台移植。如果后续业务逐渐扩展到 linux/rtos,我们会考虑进一步完善自绘制,一个是把平台层的 canvas api 收敛到 skia,另一个是内置 layer compositor。

  当前状态

在承接业务的过程中,Cube 大致沉淀了 2 种业务形态,分别是 Cube 卡片和 Cube 小程序。

Cube 卡片的作用是给 native 页面赋予区域化的动态能力,提高业务迭代和运营效率。钱包接入的卡片也分为两类,一类是没有 js 能力的简单卡片,支持表达式和 vif&vshow 这类构建时控制 DOM 树的操作,追求近似 native 的速度;另一类是具备 js 能力的复杂卡片,用来支持一些复杂的业务。Cube 卡片在钱包已经大规模应用,pv 超过 100 亿,接入的场景参考截图,包括不限于首页、理财、我的等 tab 页,以及卡包、出行、支付结果页等二级页面。

Cube 卡片的定位也是优先服务于钱包内的一二方业务,如果要想提供给三方开发者区域动态化的能力,我们推荐小程序 widget。此外,我们正在着手把 Cube 卡片能力输出给中小型金融机构以及互联网公司。

Cube 是作为渲染引擎来引入小程序技术栈。小程序基础设施包括:容器,前端框架,渲染引擎,脚本引擎。容器可以理解成 Appx/渲染引擎/脚本引擎之间的聚合层代码,提供包管理/JSAPI/安全管控/钱包核心服务等功能。移动端上小程序默认的渲染引擎是 UC,Cube 小程序应用很有限。相对于 UC 来说,Cube 在包大小/启动速度/列表滑动流畅性/内存消耗上有一些优势,但是劣势也非常明显——Cube 支持的 css 能力不足,且 Cube 的开发工具不完善。基于此,从 19 年开始 Cube 投入了巨大的人力来扩充 css 能力。Cube 是除浏览器内核外支持 CSS 较完善的渲染引擎,支持 flex/inline/block 等布局方式,伪类和伪元素,z-index 以及相对和绝对定位层级管理。我们也投入大量的精力试图建立类似 devtools 功能的工具。

这些努力一定程度上改进了开发效能,但仍然无法满足前端同学的诉求。我们逐渐意识到,在浏览器性能不是主要瓶颈的场景下,前端开发者不大会接受浏览器的一个子集。于是,Cube 小程序开始转向 IoT 场景,面向浏览器跑不起来,或者,体验极差的场景。Cube 小程序作为某种应用开发栈,对试图建立三方开发者生态的客户是有一定的吸引力。目前我们主要的精力在电视大屏端,感兴趣的同学可以在天猫魔盒上体验 Cube 小程序,也可以在别的盒子以及智能电视上下载酷喵影视(https://acz.youku.com/wow/tvact/act/cibn?spm=a2hpd.20022520.sort.1!2~3~P~A )。

在卡片和小程序之间,实际上还有一个中间地带,即单页。这个页面可以是全屏,也可以是漂浮在空中的半屏。Cube 早期尝试过 h5 单页,面向高频率营销场景。它的技术栈和小程序几乎完全一样,不同的是,h5 单页没有容器的概念,从服务端下载到端上的不是小程序包而是嵌入了 Cube 构建产物的 h5 页面。h5 单页接入过红包码业务和蚂蚁森林的二级页面,因为维护成本陆续下线。h5 单页不成功,并不意味着单页的需求不存在。近期探索的小程序 widget 其实就属于单页的范畴——我们希望 widget 能够让服务前置,承载一定的交互逻辑,同时也限制它的能力,便于管控,适合三方开发者。

  技术架构

Cube 的内部有两个大的模块,一个是 CubeKit,负责对接 js 引擎且封装平台差异,也包括了开发调试工具。另一个是 CubeCore,是用 c++ 代码实现的渲染核心逻辑。

对于 Cube 小程序,支持 tinyApp-dsl 子集,移动端上使用 jscore/v8 作为 js 代码的执行引擎,IoT 设备上使用 quickjs;对于 Cube 卡片,支持基于精简 vue 的 card-dsl。简单的卡片直接解析 AST 来渲染页面,复杂卡片支持用户用 js 写一些简单逻辑,并且通过 quckjs 来驱动 dom 树的更新。

移动端上,Cube 和 Web 小程序共用一个容器代码。在 IoT 设备上,我们持续投入人力到 Appx 和容器的垂直整合中。从目前的数据来看,IoT 上的 Cube 小程序相对移动端的 Cube 小程序有不小的基础性能优势。在电视端上 Cube 小程序的基础性能数据是:包体积 5.5 mb,内存消耗 32 mb(淘宝特价板小程序为例),冷启动耗时3~4s。随着垂直整合的深入,未来 Cube 小程序的基础性能会进一步的改善。

质量体系这个话题,我放在技术架构里讲,原因是它本身是技术架构的一部分。做业务开发,测试人员可以遍历用户场景,有 bug 修 bug。基础软件所承载的业务场景只是无限样本中很小的一部分,业务场景的回归没有问题,不能够保证引擎没有问题——最坏的情况是问题持续累积,直到某一天突然爆发出来。这个时候再想解决问题,已经积重难返。所以,基础软件的研发迫切需要某种提前暴露潜在问题的手段,这个手段不可能借助某个测试资源而是研发团队自己建设。

浏览器的 WPT 测试用例集合给了一个很好的参考,Cube 也建设了这样一套基础能力样本集合以及配套的样本自动化执行框架 KITE,投入到版本迭代&代码提交中。截止目前,我们基本能做到单日粒度的自动巡检,支撑我们在已有大量的业务场景的情况下对引擎做升级和重构,下图是引擎基础能力巡检工具的截图。

开发工具链这个话题,我也放在这里讲。Cube 的直接客户不是用户,而是业务方的开发同学。在项目初期就要考虑到工具这块,比如调试器的设计、预览容器、日志设计、低代码搭建平台等等。在扩展业务过程中,工具链某种程度上比 Cube 本身还要重要,毕竟它是客户的第一印象。我们遇到过前期技术调研时,客户因为工具的不完善而拒绝使用。业务接入后,除了能力上,业务方也会对工具提供各种要求(在协助排查问题时也会发现新的工具需求),贯穿产品的整个生命周期,也是维系客户粘性的重要工作。随着 Cube 大规模应用于业务后,我们在工具上投入的精力逐渐超过了功能&技术迭代本身。

  回顾&未来规划

回顾过去 5 年,Cube 一路跌跌撞撞,中途差点夭折,能走到今天实属不易。从个人视角,Cube 能活下来依赖“上下坚持”。一方面,上面的决策者坚持投入(19 年及以前几乎没有像样的业务价值);另一方面,一线的同学坚持做一件事,没有技术追求是不可能挺过途中的各种坎坷。我们期待能 Cube 未来应用到物联网操作系统,毕竟应用开发技术栈是操作系统的核心技术之一。

Cube 未来的规划继续坚持“紧贴业务”和“技术克制”,把产品做好,把开发者服务好,把技术打磨好。重点的发展方向如下:

  1. 鉴于 Cube 卡片可以运行在 32MB 内存/400Mhz的 RTOS 设备上,进一步探索在物联网设备上的落地;
  2. 推广 Cube 小程序在电视大屏端的应用和落地,探索商业模式。

如前所述,后续更新文章我会更侧重技术详解,针对卡片技术栈、小程序技术栈、质量 KITE&工具 ACT、性能优化等进行深入解读与畅聊。如你对该系列文章感兴趣,亦或是对 Cube 感兴趣,你也可以在后台进行留言。


相关文章
|
4天前
|
存储 缓存 API
探索后端技术:构建高效、可扩展的系统架构
在当今数字化时代,后端技术是构建任何成功应用程序的关键。它不仅涉及数据存储和处理,还包括确保系统的高效性、可靠性和可扩展性。本文将深入探讨后端开发的核心概念,包括数据库设计、服务器端编程、API 开发以及云服务等。我们将从基础开始,逐步深入到更高级的主题,如微服务架构和容器化技术。通过实际案例分析,本文旨在为读者提供一个全面的后端开发指南,帮助大家构建出既高效又具有高度可扩展性的系统架构。
|
14天前
|
运维 Cloud Native 安全
云原生技术:重塑现代IT架构的引擎
在当今数字化时代,企业正面临着前所未有的挑战与机遇。随着云计算技术的不断发展,云原生技术作为其核心驱动力之一,正在彻底改变企业的IT架构和运营模式。本文将深入探讨云原生技术的内涵、特点及其对企业数字化转型的影响,揭示其在现代IT架构中的核心地位和作用。同时,我们还将分析云原生技术面临的安全挑战,并展望未来的发展趋势,为企业在云原生领域的实践提供有益的参考。
|
15天前
|
负载均衡 5G 网络性能优化
深入解析LTE(长期演进技术)的基本架构及其关键组件
深入解析LTE(长期演进技术)的基本架构及其关键组件
76 2
|
17天前
|
Cloud Native 持续交付 云计算
云原生技术:重塑软件开发与架构的未来
在云计算的推动下,云原生技术正逐渐成为软件开发的新标准,强调利用容器、服务网格、微服务等技术实现敏捷开发与高效运维。本文探讨了云原生技术如何重塑软件开发与架构的未来,介绍了其核心概念(如容器化、微服务架构、CI/CD)及优势(如敏捷性、可扩展性、成本效益),并讨论了其在金融服务、电子商务和物联网等领域的实际应用及面临的挑战。尽管存在技术复杂性和人才短缺等问题,云原生技术仍将成为软件开发的主流趋势。
|
9天前
|
存储 监控 容灾
微信技术总监谈架构:微信之道——大道至简(演讲全文)
在技术架构上,微信是如何做到的?日前,在腾讯大讲堂在中山大学校园宣讲活动上,腾讯广研助理总经理、微信技术总监周颢在两小时的演讲中揭开了微信背后的秘密。 周颢把微信的成功归结于腾讯式的“三位一体”策略:即产品精准、项目敏捷、技术支撑。微信的成功是在三个方面的结合比较好,能够超出绝大多数同行或对手,使得微信走到比较前的位置。所谓产品精准,通俗的讲就是在恰当的时机做了恰当的事,推出了重量级功能,在合适的时间以最符合大家需求的方式推出去。他认为在整个微信的成功中,产品精准占了很大一部分权重。
29 1
微信技术总监谈架构:微信之道——大道至简(演讲全文)
|
21天前
|
机器学习/深度学习 人工智能 自然语言处理
赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
【9月更文挑战第4天】赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
|
10天前
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
|
7天前
|
Kubernetes Cloud Native 安全
云原生技术:构建高效、灵活的现代应用架构
本文深入探讨了云原生技术的核心概念、主要特点及其在现代应用开发中的重要性。通过分析云原生技术的实际应用案例,揭示了其如何帮助企业实现应用的快速迭代、弹性扩展和高可用性。同时,文章还讨论了采用云原生技术时面临的挑战及相应的解决策略,为读者提供了一套完整的云原生技术实践指南。
|
13天前
|
Kubernetes Cloud Native Serverless
探索云原生技术:从基础架构到应用实践
本文深入探讨了云原生技术的各个方面,包括其定义、核心原则、关键技术组件以及在现代企业中的应用。通过分析云原生如何推动数字化转型和提高业务敏捷性,文章旨在为读者提供对这一领域的全面了解和实际应用的指导。
41 7
|
14天前
|
Cloud Native Devops 持续交付
云原生技术:引领未来IT架构的变革
本文深入探讨了云原生技术的崛起,及其如何通过容器化、微服务架构和DevOps实践等核心原则,推动现代IT基础设施向更加敏捷、高效和可扩展的方向演进。通过分析云原生技术的发展趋势和挑战,揭示了其对业务模式、开发流程和文化的深远影响,为读者呈现了一个全面而深刻的云原生世界视角。
下一篇
无影云桌面