FlexUI Engine 详细设计方案
1. 概述
flexui-engine 是 FlexUI 的跨端原生渲染引擎,派生于腾讯 Hippy 框架,支持 HarmonyOS 和 Android 平台。引擎负责将 FlexUI 的组件树渲染为原生 UI 控件。
1.1 设计目标
- 跨平台原生渲染:将 FlexUI 组件映射为 Android View 或 HarmonyOS ArkUI 组件
- JS 引擎驱动:通过 V8 (Android) / Hermes (HarmonyOS) 执行 JavaScript 逻辑
- 高性能布局:集成 Flexbox 布局引擎
- DOM 兼容层:提供类 Web DOM 接口的 C++ 实现
- DevTools 支持:内置调试和性能分析工具
1.2 平台支持
| 平台 | JS 引擎 | 渲染后端 | 布局引擎 |
|---|---|---|---|
| HarmonyOS | Hermes | ArkUI 原生组件 | Flexbox |
| Android | V8 | Android View 系统 | Flexbox |
2. 架构设计
┌──────────────────────────────────────────────────────┐
│ Entry (OHOS / Android) │
│ ┌──────────────────────────────────────────────────┐ │
│ │ FlexView / Agent UI Page │ │
│ └──────────────────┬───────────────────────────────┘ │
├─────────────────────┼────────────────────────────────┤
│ Driver (JS 运行时) │
│ ┌──────────────────┴───────────────────────────────┐ │
│ │ JS Engine (Hermes / V8) │ │
│ │ ├── hippy-ascf adapter (FlexUI ↔ Hippy 桥接) │ │
│ │ ├── JS Bundle 加载/执行 │ │
│ │ └── Native Module 注册 │ │
│ └──────────────────┬───────────────────────────────┘ │
├─────────────────────┼────────────────────────────────┤
│ DOM (C++ 实现) │
│ ┌──────────────────┴───────────────────────────────┐ │
│ │ Element / Node / Document 树 │ │
│ │ CSS 样式解析与计算 │ │
│ │ Layout (Flexbox) │ │
│ │ Event Dispatch │ │
│ └──────────────────┬───────────────────────────────┘ │
├─────────────────────┼────────────────────────────────┤
│ Framework (平台框架) │
│ ┌──────────────────┴───────────────────────────────┐ │
│ │ android/connector ← C++ ↔ Java ↔ View │ │
│ │ ohos/connector ← C++ ↔ ArkTS ↔ ArkUI │ │
│ └──────────────────┬───────────────────────────────┘ │
├─────────────────────┼────────────────────────────────┤
│ Renderer (原生渲染) │
│ ┌──────────────────┴───────────────────────────────┐ │
│ │ Android: Android View 层级渲染 │ │
│ │ OHOS: ArkUI 原生组件渲染 │ │
│ └──────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────┘
3. 核心模块
3.1 Entry(入口模块)
HarmonyOS/Android 应用的入口层,负责初始化引擎并加载 FlexUI 页面。
OHOS Entry (flexui-engine/entry/):
entry/
├── src/main/ets/
│ ├── entryability/EntryAbility.ets → 应用入口
│ └── pages/Index.ets → FlexView 演示页面
├── src/main/resources/rawfile/ascf/ → JS Bundle 资源
└── module.json5 → 模块配置
Bundle: 应用包名在 build-profile.json5 中配置
3.2 Driver(JS 驱动层)
负责 JavaScript 引擎的初始化、JS Bundle 加载和 Native Module 注册。
C++ 层 (flexui-engine/driver/js/):
driver/js/
├── include/driver/
│ ├── engine.h → JS 引擎抽象 (Engine)
│ ├── scope.h → JS 作用域
│ └── napi/ → NAPI 绑定层 (Hermes)
│ └── hermes/
│ ├── hermes_ctx.h → Hermes 上下文
│ └── hermes_class_definition.h → Hermes 类定义
├── src/
│ ├── engine.cc → 引擎实现 (VM 创建, 生命周期)
│ └── ...
└── packages/
└── hippy-ascf/ → Hippy-ASCF 适配器 (npm 包)
Engine 核心能力:
- 创建 JS VM (HermesRuntime / V8)
- 管理 JS 作用域 (Scope)
- 注册 Native Module (RegisterMap)
- 保存/查找 ClassTemplate
- 管理 FunctionWrapper 和 CallbackWrapper
hippy-ascf 适配器 (driver/js/packages/hippy-ascf/):
- 将 FlexUI/ASCF 组件映射到 Hippy 的 Native Module
- 处理组件创建、属性更新、事件分发
- JS 线程与 UI 线程的桥接
3.3 DOM(C++ 实现)
提供类 Web DOM 接口的 C++ 实现,是引擎的布局和渲染核心。
dom/
├── include/dom/
│ ├── element.h → 元素节点
│ ├── node.h → 基础节点
│ ├── document.h → 文档对象
│ └── ...
└── src/dom/
├── element.cc → 元素实现
├── node.cc → 节点实现
└── ...
功能:
- 完整的 DOM 树管理 (父子关系、遍历)
- CSS 属性解析与应用
- Flexbox 布局计算
- 事件系统 (捕获/冒泡/分发)
- 样式继承与层叠
3.4 Framework(平台框架)
连接 C++ DOM 层与原生 UI 控件的桥接层。
Android Framework:
framework/android/connector/
├── dom/ → C++ ↔ Java DOM 连接器
│ └── src/main/cpp/ → JNI 桥接
├── driver/ → JS 引擎 ↔ Native 连接器
│ └── js/ → NativeCallback, NativeRunnable
├── renderer/ → 渲染连接器
└── support/ → 支持库
OHOS Framework:
framework/ohos/
└── connector/ → C++ ↔ ArkTS 连接器
3.5 Modules(平台模块)
提供平台能力的 Native 模块:
modules/
├── android/ → Android 原生能力 (网络、存储、传感器等)
├── ohos/ → HarmonyOS 原生能力
├── footstone/ → 跨平台基础模块 (日志、线程、任务调度)
└── vfs/ → 虚拟文件系统 (资源加载)
3.6 Renderer(原生渲染器)
renderer/native/android/
├── Renderer.java → 抽象渲染器
├── NativeRenderer.java → 原生渲染器实现
├── RenderProxy.java → 渲染代理
├── RenderExceptionHandler.java → 异常处理
└── component/
├── Component.java → 组件基类 (Drawable.Callback)
├── BackgroundDrawable → 背景绘制
├── TextDrawable → 文本绘制
└── RippleDrawable → 涟漪效果
3.7 DevTools(调试工具)
devtools/
├── android/ → Android 调试后端
└── ohos/ → HarmonyOS 调试后端
支持:
- 组件树检查
- 网络请求监控
- 日志查看
- 性能分析
4. 渲染流程
1. Entry Ability 启动
│
2. JS Engine 初始化 (Hermes / V8)
│
3. 加载 JS Bundle (rawfile/ascf/index.js)
│
4. JS 执行 FlexUI 组件代码
│ └── @flexui/core 创建组件树
│
5. hippy-ascf adapter 接收组件操作
│ └── createElement / setAttribute / appendChild 等
│
6. DOM 层创建/更新 C++ Element 树
│ └── CSS 解析 + Flexbox 布局计算
│
7. Framework Connector 将变更传递给 Renderer
│ ├── Android: JNI → Android View 操作
│ └── OHOS: NAPI → ArkUI 组件操作
│
8. 原生 UI 渲染到屏幕
5. JS Bundle
5.1 构建流程
源码 (.hxml/.css/.js)
│
├── flexui-template-compiler (Rust→WASM)
│ └── HXML → ProcGen JS
│
├── flexui-stylesheet-compiler (Rust→WASM)
│ └── CSS 作用域处理
│
└── Webpack (flexui-webpack-plugin)
└── 打包为 JS Bundle
│
└── 复制到 entry/src/main/resources/rawfile/ascf/index.js
5.2 构建命令
# 完整开发周期: webpack → hvigorw → 安装 → 启动
./build.sh dev
# 仅构建 HAP
./build.sh build
# 安装到设备
./build.sh install
# 启动应用
./build.sh start
# 查看日志
./build.sh logs
6. 设计决策
6.1 为什么派生于 Hippy?
- 成熟的跨端方案:Hippy 已在腾讯多个亿级应用中验证
- Flexbox 布局引擎:内建的高性能布局引擎
- JS 引擎抽象:支持 V8、Hermes、JSC 等多种 JS 引擎
- 完善的 Native Module 体系:可复用的平台能力模块
6.2 为什么 DOM 用 C++ 实现?
- 性能:C++ DOM 操作比 JavaScript 快 10-100 倍
- 跨平台共享:Android 和 OHOS 共用同一套 DOM 代码
- 布局计算:Flexbox 布局算法在 C++ 中执行更高效
6.3 hippy-ascf adapter 的角色
Hippy 原始组件模型与 FlexUI/ASCF 不完全一致,adapter 负责:
- 组件标签名映射 (FlexUI → Hippy View)
- 属性格式转换 (FlexUI props → Hippy props)
- 事件类型转换 (FlexUI events → Hippy events)
- Shadow Tree 同步策略适配
6.4 为什么 OHOS 用 Hermes 而非 V8?
- HarmonyOS 原生支持:Hermes 是 OpenHarmony 推荐的 JS 引擎
- 体积更小:Hermes 比 V8 更适合移动端
- AOT 编译:Hermes 支持预编译字节码,减少首屏加载时间