HybridOS Lite 是 HybridOS(合璧操作系统)的精简版本,适用于对成本敏感的嵌入式设备,可运行在基于 Linux 内核,但只有 64MB RAM 或更低配置的设备上。
HybridOS Lite 运行实例.mp4
HybridOS Lite 的架构
下图给出了 HybridOS Lite 的架构:
如上图所示,HybridOS Lite 中包含了如下 HybridOS 软件栈中的函数库或组件:
-
MiniGUI
:我们使用 MiniGUI 5.0 版本提供的多进程模式、合成图式,用于提供现代窗口系统中常见的半透明效果,以及窗口切换时的动画效果等。 -
hiDataBus
:HybridOS 数据总线,用于跨进程的远程过程调用以及事件分发功能。其中,hibusd
是 hiDataBus 的守护进程,libhibus
为应用提供了连接和访问数据总线的接口。 -
hiBox
:一个 C 语言工具库,集成了对常见数据结构及算法的支持,如链表、哈希表等,也集成了 JSON 的解析接口。 -
hiCairo
:二维矢量图形库 Cairo 的 HybridOS 派生版本,用于二维矢量图形的渲染。 -
hiSVG
:该函数库提供了对 SVG 的解析和渲染能力。这个函数库基于librsvg
,但做了重构,去除了不必要的接口,去除了对 Pango 的依赖,并基于 hiDOMLayout 增强了对 CSS 的支持。 -
hiDOMLayout
:该函数库提供了 DOM 树的维护功能以及 CSS 样式的解析功能,并可对 DOM 树执行基于 CSS 的风格化处理和布局处理。使用这个函数库,使得非 Web 前端应用,也可以利用 CSS 样式定义界面元素的样式及布局。
有关 HybridOS Lite 上的应用开发,可进一步阅读《HybridOS Lite 应用开发指南》。
HybridOS Lite 的技术特点
多进程模式,解耦模块
与传统的嵌入式开发中,开发者通常会编写一个应用程序把所有事儿都做了。而 HybridOS Lite 鼓励开发者采用多进程模式,将系统分解成若干个功能单一的独立程序,然后通过 hiDataBus 数据总线将这些程序对应的进程连接在一起。这样,图形界面应用不直接操作硬件,而只提供人机交互能力。这种设计,可大幅度降低系统的耦合度,尤其在底层功能不变,而界面经常变动的情形下,可大幅降低维护工作量。
这种设计是 UNIX 哲学的具体体现:每个程序都短小精悍,功能单一,但组合起来可以完成复杂的功能。
另外,这种设计还可以增加系统的稳定性。HybridOS Lite 可以监听到各个模块的工作状态,当某一模块发生异常时,HybridOS Lite 能够自动重启或者重新初始化该模块,使该模块对系统的不良影响降到最低。
在 HybrdiOS Lite 的架构中,MiniGUI 扮演了重要的角色。MiniGUI 的多进程运行模式,为模块解耦提供了技术支撑。MiniGUI 5.0 的合成图式(compositing schema
),则是创建酷炫界面和交互能力的一大利器。开发者通过修改默认合成器(compositor)一些方法,或者创建定制的合成器,就能够灵活地控制窗口的位置、大小、层叠关系,进而在应用、屏幕等切换时,实现动画效果。最终,在嵌入式系统资源有限的情况下,我们可以获得不亚于桌面系统的用户交互体验。
数据驱动
数据驱动,是 HybridOS 的核心思想之一。功能解耦,界面与数据逻辑分离后,hiDataBus 总线负责将所有模块连接起来,使之成为一个有机的整体。与传统的消息驱动机制相比,hiDataBus 总线做了几点重要改进:使用 JSON
格式封装数据,增强数据传输的灵活性;提供不同进程之间的事件订阅与远程调用,hiDataBus 总线不但是数据传输的通道,还是逻辑功能的载体;提供跨平台的网络接口,打通不同设备之间、本机业务与云服务之间的壁垒。
模块重组易如反掌
在 HybridOS Lite 的编程思想中,功能解耦后形成若干功能模块。类似组态软件,用户可对功能模块其进行任意组合。功能模块如何组合,如何显示,则由布局文件 manifest.json
决定。在诸如工业控制面板、家用电器、智能门锁、智能音箱等产品中,多以屏为单位组织应用。因此 HybridOS Lite 使用了这样的应用组织方式。在布局文件中,指定了每屏所包含的应用、各个应用的位置、应用之间的通信关系等。同时提供了动态切换布局的机制,使得同一产品能轻易展示出不同的系统样貌。
使用 CSS,应用界面随意调整
传统编程方式中,界面元素的调整,无外乎两种方式:第一,修改代码、重新编译;第二,写一个私有的配置文件,指定界面元素的属性。但是这两种方式,在 HybridOS Lite 中得到了彻底改变。HybridOS Lite 借鉴了 Web 前端开发中的 CSS 规范,利用其指定界面元素的诸多属性。由于有 CSS 规范可循,任意了解 CSS 规范的开发者,都可以在不了解渲染逻辑的情况下,通过修改 CSS 文件对界面元素进行修改,而非修改源代码。有规可循,极大地提高了代码迭代速度,降低了代码维护难度,也降低了对开发者的要求。
小体积,大能力
文后的系统开销统计给出了 HybridOS Lite 函数库大小以及运行 20 个应用进程情况下的系统资源占用情况。整体上,HybridOS Lite 可在拥有 64MB Flash 和 64MB RAM (或更低)的系统中运行。
目录结构
如上图所示,显示了仓库中的主要目录,它们是:
cmake/
:包含Find
文件,用于检查软件包的依赖性及获得编译参数;.cmake build-lib/
:包含了编译依赖库的脚本文件;fetch-all.sh
:获得依赖库脚本;build-all.sh
:编译依赖库脚本;
src/
:包含应用程序和配置文件;mginit/
:mginit
程序。展示了如何解析manifest.json
文件,如何布局以及如何使用合成器,是 HybridOS Lite 的关键组件;wallpaper/
:动态壁纸应用;chgconfig/
:动态切换配置文件应用程序;svgshow/
:展示在应用程序中如何使用 SVG 图片;wheel/
:展示在应用程序中处理鼠标滑动消息,是一个滚轮控件的例子;config
:包含了用户自定义的、与业务相关的数据文件;layout/
:包含了布局文件;manifest.json
:最重要的布局文件,其定义了每屏显示哪些应用程序,以及这些应用程序的布局;newconfig.json
:另外一个布局文件,用于展示如何动态切换布局;default_layout.css
:默认的 CSS 文件。其为每个重要的dom
元素设置了默认的布局样式;svgshowx.css
:svgshow
应用的 CSS 文件。同一个应用显示在屏幕不同位置,大小不同时,需要不同的布局文件来指定各个元素的位置与大小;wheel.css
:wheel
应用的 CSS 文件;chgconfigx.css
:chgconfig
应用的 CSS 文件。
在 PC 上构建开发环境
我们假设您使用的是 Ubuntu Linux 18.04/20.04 LTS。
在 Ubuntu Linux 中,使用 apt install
命令安装下面的软件包:
-
开发工具:
-
git
-
gcc/g++
-
binutils
-
autoconf/automake
-
libtool
-
make
-
cmake
-
pkg-config
-
gtk-doc-tools
-
-
依赖库:
-
libgtk2.0-dev
-
libjpeg-dev
-
libpng-dev
-
libfreetype6-dev
-
libinput-dev
-
libdrm-dev
-
libsqlite3-dev
-
libxml2-dev
-
libssl1.0-dev
-
在 Ubuntu 18.04/20.04
下,可使用下面的命令,编译并安装 HybridOS Lite:
-
获得源代码
$ cd hybridos-lite/build-lib $ ./fetch-all.sh
-
编译 HybridOS Lite 依赖库
$ ./build-all.sh $ cd ..
-
编译 HybridOS Lite
$ mkdir build $ cd build../ $ cmake $ make
运行 HybridOS Lite 示例应用
运行 HybridOS Lite,需要两个终端。一个用来执行 hibusd
,一个用来执行 mginit
。
打开一个终端,执行下面的命令:
$ cd hybridos-lite/build-lib/hibus/src
$ sudo hibusd -d
在另外一个终端,执行下面的命令:
$ cd hybridos-lite/bin
$ ./mginit
在屏幕上,将出现如下的窗口
-
chgconfig
应用。当点击应用中的图标后,HybridOS Lite 将动态切换布局文件。当动态切换布局文件时,可注意屏幕下方的indicator bar
的变化。
-
svgshow
应用。
-
当动态切换布局文件时,有一屏将同时显示16个应用。如下图:
-
用鼠标在屏幕上拖动,或者点击屏幕下方的
indicator bar
时,屏幕将在不同层间切换。
系统开销统计
下面是对 HybridOS Lite 主要依赖库的统计(除系统 C/C++ 库之外,ARM A8 架构):
这些函数库大致体积为 10 MB。也即除去操作系统启动代码、内核、内核模块,以及系统启动必需的基础库外,HybridOS Lite 全部依赖库仅占用 10 MB 左右的存储空间。如果考虑使用中文 Truetype 字体,则还需大概 10 MB 左右存储空间(视字体大小而定)。
下面是对本例代码,交叉编译为 ARM 版本,在运行前对后内存使用状况的统计。在本例中,HybridOS Lite 共启动了 20 个应用,其中包含:mginit(必须)、hibusd(必须),以及 18 个用户应用进程:
从数据可以看出,目标开发板一共拥有 128MB RAM。HybridOS Lite 启动 20 个应用进程之后,一共使用了 54MB 内存。通过 top
命令查询各个应用的 CPU 占用率,其中mginit
和 hibusd
一共占用 CPU 百分比为 1%。
入口代码仓库
要尝试 HybridOS Lite,请访问 HybridOS Lite 的入口代码仓库: