整个过程耗时 15~30min 左右,可以在执行完第一行命令后,找到 manifest 配置文件,移除 linux 和一部分 third_party 的依赖,会更快一点。
简略版目录结构如下(略过无关目录,仅展开相关部分):
OpenHarmony/ ├── applications # 应用程序样例 ├── base # 基础软件服务子系统集 ├── docs ├── domains # 增强软件服务子系统集 ├── drivers # 驱动子系统 ├── foundation # 系统基础能力子系统集 │ ├── aafwk # Ability 框架 │ ├── ace # JS UI 框架 │ │ ├── ace_engine # ACE 1.0, 仓库名: ace_ace_engine │ │ └── ace_engine_lite # ACE 2.0, 仓库名: ace_engine_lite │ ├── appexecfwk # 用户程序框架和包管理模块 │ └── graphic # 图形库相关的子系统 ├── interface │ └── sdk-js # JS API 的 TS 类型文件 ├── kernel # LiteOS 内核 │ ├── liteos_a │ └── liteos_m ├── test └── third_party
▐ 新旧 ACE 框架
下面是 ACE 框架的架构图[5],现在文档里描述的、IDE 里支持编写的都是这套 UI,提供的是类似小程序的 DSL[6] 开发 UI,HML(HarmonyOS Markup Language) + CSS + JS。
看起来和主流 JS + 原生渲染框架的架构都相似,提供了编译工具将源码编译成 js bundle,运行时有个在 JS 引擎启动后默认执行的 framework.min.js 文件,实现节点构建逻辑,然后在 C++ 层实现了一套 UIKit,支持的组件大概有二三十个。
在另一个不带 lite 后缀的仓库里(ace_ace_engine),还有一套 UI 系统的实现,架构层次更加简洁,技术更加先进,应该是新一代的 UI 框架,这是 新的 ACE 框架的架构图[7]:
这套架构主体分为应用、框架、引擎以及跨平台适配这几部分,应用层就是透出给开发者的语法,有好几种模式,下文详解。框架层实现了前端框架常见的组件化、MVVM 能力,能够响应式的更新 UI。下面是 JS 引擎,使用的是 QuickJS,应该也支持 V8。再向下是渲染引擎,包含了核心的渲染管线、动画、事件和各种布局绘制算法。
最下面的 porting layer 是适配多平台的关键,定义了平台无关的 layer 数据结构,可以提交给不同的合成器(Compositor)合成渲染,从代码上看,是支持 Flutter Engine 的。
整体渲染过程
▐ 容器创建和管理
鸿蒙 UI 的基本单位是 FA (Feature Ability),对应一个 AceAbility 的实例,提供了生命周期的钩子,在执行 OnStart() 的时候会在内部创建一个 AceContainer。但是这个 AceContainer 不由 AceAbility 直接持有,而是由全局唯一的单例 AceEngine 管理。
AceContainer 提供了 UI 渲染的各项能力,是个总的管理类,提供了生命周期和功能调度接口,内部划分了许多子模块:
-
Frontend: 前端代码的执行环境,JS 或者 JSON,有这层抽象或许还可以支持其他脚本引擎。