当前位置:网站首页>关于鸿蒙系统 JS UI 框架源码的分析
关于鸿蒙系统 JS UI 框架源码的分析
2022-08-02 05:09:00 【大淘宝技术】

▐ 系统架构分层

▐ HarmonyOS 和 OpenHarmony 的区别

▐ 源码目录结构
repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify
repo sync -c
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 框架


▐ 容器创建和管理

Frontend: 前端代码的执行环境,JS 或者 JSON,有这层抽象或许还可以支持其他脚本引擎。 TaskExecutor: 单一线程内的任务管理器,类似其他渲染引擎中的 TaskRunner。 AssetManager: 资源管理器,可用于加载 JS 代码、图片、字体等资源。应该也具备缓存能力。 PipelineContext: 渲染管线的管理类,监听 vsync 回调刷新内部脏节点的布局、绘制、渲染。 AceView: 渲染生成的 UI 根节点,可以贴到外层容器中。 PlatformResRegister: 平台资源的注册和管理,以及部分通信接口,可在这里实现同层渲染功能。
▐ JS UI 开发框架

Frontend 部分,有三种不同类型的实现,分别是基于渲染指令的命令式 UI、声明式 UI、以及无需脚本引擎,用 JSON 文件渲染的 UI。命令式 UI 和 声明式 UI 都是用 QuickJS 作为脚本引擎,声明式 UI 里包含了 V8 的抽象,但是这部分好像没有开源出来。JS Frontend (命令式 UI)
xx.hml 的模板文件、xx.css 的样式文件、xx.js 的脚本文件以及 xx.json 配置文件。
<div class="container">
<text class="title-text">{{headTitle}}</text>
</div>
/* xxx.css */
.container {
flex-direction: column;
margin-top: 20px;
margin-left: 30px;
}
.title-text {
color: #1a1a1a;
font-size: 50px;
}
// xxx.js
export default {
data: {
headTitle: 'Capture the Beauty in This Moment'
}
}

ace 的模块中,可以用 import 导入,环境中也有 ace 这个全局环境:
import * as ace from 'ace'
// 创建 body 节点
ace.domCreateBody(0, 'div', {/* attrs */}, {/* styles */}, {/* events */})
Declarative Frontend (声明式 UI)
@Component
class MyDemo {
Column(
Text('Hello World!'),
Text('Some text here')
.fontsize(36)
.color(Color.Red)
).center()
}

Card Frontend (无脚本 UI)
template、styles、actions、data 这几部分,模板里可以写花括号的数据绑定 {{some.data}},里边可以写简单的 JS 表达式,也不是完全静态的。而且 CardFrontend 类上有 UpdateData() 接口,可以更新模板的数据,具备一定的动态化能力。▐ 节点构建流程

▐ 布局绘制渲染

OnVsyncEvent() 回调,如果 surface 已经初始化好,则依次刷新内部的脏节点,如果包含动画,则调用 RequestFrame() 请求触发下一帧 vsync。首先 dirty Elements 会触发 Rebuild() 重新构建 RenderNode,并且调用 MarkNeedLayout() 把它加到待布局的队列里,然后 FlushLayout 会刷新这个队列,调用节点的 OnLayout() 方法计算布局,然后把自身再加入到待绘制的队列里,然后 FlushRender() 依次调用节点的 Repaint() 方法重新绘制,生成 layer tree。
OpenHarmony 官网:https://www.openharmony.cn/ ACE Lite: https://gitee.com/openharmony/ace_engine_lite ACE Engine: https://gitee.com/openharmony/ace_ace_engine 配置文件:https://gitee.com/openharmony/manifest/blob/master/default.xml ACE 架构图:https://gitee.com/openharmony/ace_engine_lite/blob/OpenHarmony-2.0-Canary/figures/JS%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6.png 类小程序 DSL:https://device.harmonyos.com/en/docs/apiref/js-framework-file-0000000000616658 新 ACE 架构图:https://gitee.com/openharmony/ace_ace_engine/blob/OpenHarmony-2.0-Canary/figures/JS-UI%E6%A1%86%E6%9E%B6%E6%9E%B6%E6%9E%84.png qjs_engine.cpp: https://gitee.com/openharmony/ace_ace_engine/blob/OpenHarmony-2.0-Canary/frameworks/bridge/js_frontend/engine/quickjs/qjs_engine.cpp#L1925-1940 TaskCenter.ts: https://gitee.com/openharmony/third_party_jsframework/blob/OpenHarmony-2.0-Canary/runtime/main/manage/event/TaskCenter.ts#L127-133 FlutterSceneBuilder: https://gitee.com/openharmony/ace_ace_engine/blob/OpenHarmony-2.0-Canary/frameworks/core/pipeline/layers/flutter_scene_builder.




本文分享自微信公众号 - 淘系技术(AlibabaMTT)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
边栏推荐
- 25K测试老鸟6年经验的面试心得,四种公司、四种问题…
- 为什么4个字节的float要比8个字节的long大呢?
- The original question on the two sides of the automatic test of the byte beating (arranged according to the recording) is real and effective 26
- navicat connects to MySQL and reports an error: 1045 - Access denied for user 'root'@'localhost' (using password YES)
- Detailed explanation of interface in Go language
- 51单片机外设篇:红外通信
- 区块元素、内联元素(<div>元素、span元素)
- 金山云团队分享 | 5000字读懂Presto如何与Alluxio搭配
- Block elements, inline elements (elements, span elements)
- Automated operation and maintenance tools - ansible, overview, installation, module introduction
猜你喜欢

21天学习挑战赛安排

51单片机外设篇:点阵式LCD

12 reasons for MySQL slow query
![[C language] LeetCode26. Delete duplicates in an ordered array && LeetCode88. Merge two ordered arrays](/img/eb/9b05508e88b7f17d80de2afa8c08ce.png)
[C language] LeetCode26. Delete duplicates in an ordered array && LeetCode88. Merge two ordered arrays

MYSQL unique constraint

ApiPost 真香真强大,是时候丢掉 Postman、Swagger 了

MySQL implements sorting according to custom (specified order)

整合ssm(一)

为什么4个字节的float要比8个字节的long大呢?

ApiPost is really fragrant and powerful, it's time to throw away Postman and Swagger
随机推荐
本周大新闻|苹果MR已进行Pre-EVT测试,Quest 2涨价100美元
测试技术之APP蓝牙连接测试
Meta公司新探索 | 利用Alluxio数据缓存降低Presto延迟
Introduction to Grid Layout
51 MCU peripherals: DS18B20
What are the ways to improve software testing capabilities?After reading this article, it will take you up a notch
服务器的单机防御与集群防御
MySQL导入sql文件的三种方法
5年在职经验之谈:2年功能测试、3年自动化测试,从入门到不可自拔...
在腾讯做外包测试的那些日子.....
LeetCode刷题系列 -- 10. 正则表达式匹配
高防服务器防御的原理是什么
How Navicat Connects to MySQL
区块元素、内联元素(<div>元素、span元素)
51 microcontroller peripherals article: dot-matrix LCD
ATM系统
Android studio connects to MySQL and completes simple login and registration functions
Google Chrome(谷歌浏览器)安装使用
Detailed installation and configuration of golang environment
MySQL implements sorting according to custom (specified order)