动态化方向上业界很早就提出并实践了很多成熟的方案。大概经历了以 Webview 为容器承载 H5 的 Hybird 方案。到以 RN 为代表的 RN、Weex、hippy 等前端技术栈映射原生 UI 实体的类 RN 方案。同时以 VirtualView(Tangram)、MTFexBox、 DX、GX 为代表的 NativeDSL 方案在轻交互重展示的卡片场景在也有很多应用。
近些年来 Jetpack Compose 和 SwiftUI 更为现代的声明式 UI 在客户端技术上逐渐流行起来,也给跨端和动态化带来了新的可能。
执行 JS 脚本用以组织渲染的布局树。性能瓶颈在 JS 执行构建 dom 树 和 JS 通信上。
RN 、 Weex、Hppiy 、Hummer 是其中的典型代表。
基本原理:React- > V-DOM -> Native layout
线程模型:JSThread,UIThread,ShadowThread。
新旧对比架构
RN 对整体架构做了一个大的升级,解决长期的以来的性能瓶颈。
旧 | 新 | |
---|---|---|
Bridge 通信 | ![]() |
![]() |
JS 引擎 | ![]() 解析执行是在运行期 |
![]() 引擎支持二进制加载,解析编译放在了打包期 |
引擎直通 去 JSBridge,JSC -> JSI。去掉异步调用,消息队列处理。序列化耗时。
Hermes 引擎 支持二进制加载;针对移动端内存回收。
hippy 已经把动态化跨端给范式化了,分为开发期、解析执行期、渲染期。
驱动层:开发期语言使用 JS(React/Vue)以及其他扩展
DOM 层:Dom 管理和 Render 管理放在 C++ 双端共用。
渲染层:运行期承接渲染的环境支持。Native 原生、Flutter 和 H5。
https://github.com/didi/hummer
"从这个架构设计可以看出,我们抛弃了业界其他动态化跨端框架普遍使用的 DSL 层和 VDOM 层,因此原生 Hummer 不具备前端开发常用的响应式编程的能力…
2025 年 3 月,lynx 正式开源。https://lynxjs.org
渲染管线使用客户端原生渲染管线,通过协议映射原生控价元素,天然具备 首屏直出。
"MTFlexbox 适用于重展示、轻交互的业务场景,与现有 HTML、React Native、Weex 等跨平台方案相比,MTFlexbox 具备着性能高、渲染速度快、兼容性高、原生功能支持度高等优势。但其缺点在于不支持复杂的交互逻辑,不适合复杂交互的业务场景
项目架构
核心流程
优化思路
树拍平(Litho)、任务异步线程预热、缓存。
相关资料
https://tech.meituan.com/2019/09/19/litho-practice-in-dynamic-program-mtflexbox.html
渲染流程
协议二进制 在服务端编译期就将 XML 文件解析成二进制,将生成抽象语法树的过程前置到编译期执行,端上执行时,仅需要拿到二进制文件进行属性解析,对于静态值类型,在编译期就直接转换成了对应的数据类型,减少了端上的拆装箱开销;
事件链 实现逻辑动态性。原生提供注册一些原则能力,使用 JSON 对这些原子能力进行编排。
JSEngine 主要负责卡片 js 逻辑执行和卡片数据变化监听,从而支持开发者在卡片内部写一些业务逻辑能力实现卡片内容和样式的动态变化。
因为卡片场景对性能要求较高,综合包大小和性能等方面考虑,我们选择了 quickjs 作为我们的 js 基础引擎库,同时实现了一个非常小的 js 响应式框架(JSFM),用来支持卡片内的逻辑代码能力。
CardEngine 主要负责卡片数据的解析和绑定、卡片逻辑渲染、构建 DOM 指令、JSAPI 管理、JSBinding、Native 事件通信等。卡片 DOM 树的初始化构建过程,我们并没有把它放在 js 运行时,而是在卡片实例初始化链路中直接通过 C进行指令生成和树构建,一方面是为了保持 js 框架更小更快,另一方面 C 的运行效率更高。
RenderEngine 后端渲染底座,负责卡片布局计算、样式解析、Layer 计算、自绘制组件、同层渲染、光栅化上屏等过程,以及手势、动效等交互效果。
Platform 平台相关接口,包括原子 view 封装、Canvas API、三方组件扩展协议、动画 api 等。
基于 KMP 和 Compose 跨端和动态化方向最近几年也有发展。
RedWood 是 CashApp 开源的基于 KMP 和 CMP 技术的 SDK。 RedWood 可以使用 Kotlin 语言来构建响应式的跨平台 UI。
Jetpack Compose(https://developer.android.com/compose)是适用于 Android 平台的现代声明式 UI 系统。摒弃了长期依赖 Android View 系统命令式 UI。
Column
,Row
等。各层的职责明确,其中 Compose Compiler 和 Runtime 是支撑整个声明式 UI 运转的基石。
Compose Compiler 把 基于 @Composable 函数生成代码交付给 Compose Runtime 执行。Compose Runtime 执行生成的这些代码时会生成一个运行时的数据结构 Slot Table,该数据结构是一个线性的数据结构,该数据结构其实就是 UI 状态树 ,状态驱动真正的 Compose UI 渲染树。
得益于 Compose 的分层,Compose Compiler 编译器和 Compose Runtime 是平台无关的,只需要桥接【状态树转渲染树】这一层就可以实现 UI 的跨平台,同时能够享受到 Compose 声明式 UI、完善的开发套件以及智能重组机制。这部分的原理可以看这个(https://juejin.cn/post/7176437908935540797)
更进一步,KMP 可以把我们的 Compse 代码编译成 JS 代码,运行在 JS 引擎上,渲染系统采用平台 Native 的渲染系统,当我们 UI 需要变更时可以直接下发 JS 实现动态化。
以上是 RedWoods 核心原理。更多细节可参考:
腾讯今年(2025 年)开源了 Kuikly,同样也是基于 KMP 能够实现跨端和动态化。Kuikly 起步较早有一套自研的基于 Kotlin DSL。
先说说好的方面,毫无疑问 CMP 和 KMP 是跨端动态化一个技术发力的方向,依托
可能有困难的方向
绘制、手势事件、多机型多平台兼容适配、调试监控等一系列周边配套工具。
Futter :渲染 手势事件 多机型多平台兼容适配 调试监控等一系列周边配套工具 ,Framework 级别的。
**北海:使用前端技术栈 + Flutter 渲染管线。https://github.com/openkraken/kraken
Cube/DX : 自渲染
跨端动态化模板引擎详解,看完你也能写一个 | GaiaX 开源解读
给 Stretch(Rust 编写的 Flexbox 布局引擎)新增特性,我头都秃了… | GaiaX 开源解读
作为逻辑动态化的基础,GaiaX 表达式是如何设计的? | GaiaX 开源解读
淘宝 Native 研发模式的演进与思考 | DX 研发模式
从 0 到 1,IDE 如何提升端侧研发效率?| DX 研发模式
Cube 技术解读 1 | 支付宝新一代动态化技术架构与选型综述