HarmonyOS设备开发工程师四(基础子系统开发)

本文源于HarmonyOS官方教程https://developer.huawei.com/consumer/cn/training/course/introduction/C101635908637340943

如有侵权,联系helloc2333@163.com删除。

基础子系统开发

HarmonyOS 将一些常用的功能划分为独立的子系统,以便于更好的实现相关功能。基础的子系统包括:

  • 编译构建子系统,
  • 分布式远程启动子系统,
  • 公共基础子系统,
  • OTA 升级子系统,
  • 启动恢复子系统,
  • 软总线子系统。

编译构建子系统

编译构建子系统是基于 gn 和 ninja ,支持 OpenHarmony 组件化开发的编译框架,主要提供以下功能:

构建已有产品
独立构建芯片厂商源码
独立构建单个组件。

在开发编译构建前,应了解如下基本概念:
组件:可复用的软件单元,它可包含源码、配置文件、资源文件和编译脚本等。
Ninja : ninja 是一个专注于速度的小型构建系统。
Gn : Generate ninja 的缩写,用于产生 ninja 文件。

Ninja 和 Gn 概述

  • Ninja 是一个致力于速度的小型编译系统(类似于 Make 编译工具)。
  • Ninja 主要有两个特点:
    • 可以通过其他高级的编译系统生成其输入文件。
    • 它的设计就是为了更快的编译
  • Ninja 核心是由 C/C++ 编写的,同时有一部分辅助功能由 python 和 shell 实现,可以利用Ninja 的开源代码进行各种个性化的编译定制。
  • Gn : Generate ninja ,用于产生 ninja 文件。

编译构建流程

image-20211231191009528

设置与编译

hb set 命令功能:设置 HarmonyOS 源码目录要编译的产品

hb build 命令功能:编译产品、开发板或者组件

解决方案编译实现过程:

image-20211231191154527

分布式远程启动

分布式远程启动场景案例

现有如下场景:某用户想看某节目,于是在智慧屏上点击了节目开播后提醒,之后用户去了另一个房间,智慧屏无法直接提醒用户收看节目。

场景条件:智慧屏幕可连接局域网,运动手表只能通过蓝牙连接,用户的手机在房间内充电,用户希望通过运动手表获得提醒。

image-20211231192119826

  • 解决方案:通过分布式软总线的方式,让智慧屏的消息传达到用户的运动手表上,智慧屏远程启动运动手表,给用户做开播提醒。

image-20211231192242838

分布式远程启动是什么?

分布式远程启动由分布式任务调度模块执行,它通过主从设备服务代理机制,在HarmonyOS 操作系统上建立起分布式服务平台,支持主设备(搭载 HarmonyOS 的智慧屏设备)启动从设备( IP Camera 、运动手表等小内存 HarmonyOS 设备) FA ( FeatureAbility )的能力.

基本概念:
FA :代表有界面的 Ability ,用于与用户进行交互。
远程启动:即跨设备启动 FA ,与本地启动 FA 相对应。

远程启动步骤

image-20211231192613394

want参数:远端设备id,包名,ability类名。

// 启动远程设备FA
Want want = new Want();
// 封装启动远端FA的Want
// 使用之前获取的设备ID,并指定FA信息
ElementName name = new
ElementName(remote_device_id,”com.Huawei.remote_package_name”,”remote_class_name”);
want.setElement(name);// 将待启动的FA信息添加到Want中
want.setFlags(Want.FLAG_ABILITYSLICE_MULTI_DEVICE);// 设置分布式标记,若不设置则无法使用分布式能力
startAbility(want);// 按照Want启动指定FA,Want参数命名以实际开发平台的API为准

 支持主设备侧 远程启动 从设备侧 FA ,不支持从设备 远程启动 主设备 FA 。
 远程启动前必须确保设备间分布式组网成功(需要在同一网段内,可互相 ping 通),否则无法远程启动。
 当前只支持拥有共同公钥信息的主从设备间 FA (即主从设备的 FA 使用相同华为证书)的拉起。

公共基础与OTA升级

案例需求:某开发人员希望能在 Hi3861 , Hi3516 , Hi3518 开发板上都实现一个功能类似的应用程序,其中都会涉及到相同的文件操作。开发人员希望减少自己的代码开发量,通用的操作可以直接调用现成的库函数。

解决方案:在 HarmonyOS 操作系统内将常见的文件操作,数据库操作都实现并封装成库函数,用以开发者方便快捷的调用,避免“重复造轮子”。

image-20211231193856862

公共基础是什么?

公共基础库存放HarmonyOS通用的基础组件。这些基础组件可被HarmonyOS各业务子系统及上层应用所使用。

公共基础库在不同平台上提供对应的能力:

image-20211231194115702

常见文件操作接口介绍

image-20211231195429489

文件操作使用案例

常见的文件操作包括:创建或打开文件,写入文件,关闭文件,删除文件,获取文件大小,移动文件。

// 文件打开与文件写入特定大小的数据
char fileName[] = “testfile”;
static const char def[] = “utils_file_operation implement.”;
int fd = UtilsFileOpen(fileName, O_RDWR_FS | O_CREAT_FS | O_TRUNC_FS, 0);
int ret = UtilsFileWrite(fd, def, strlen(def));
printf(“file handle = %d\n write ret = %d\n”, fd , ret);
// 读取特定长度的文件数据
char buf[64] = {0};
int readLen = UtilsFileRead(fd, buf, 64);
printf(“read len = %d : buf = %s\n”, readLen, buf);// 使用ret = UtilsFileClose(fd)将文件关闭。
// 获取文件大小
ret = UtilsFileStat(fileName, &fileLen);
printf(“file size = %d\n”, fileLen);
// 文件删除
ret = UtilsFileDelete(fileName);
printf("delete ret = %d\n", ret);

远程升级使用场景

案例场景:现有一批开发板上的应用程序都需要升级刷新,传统方式需要开发人员将每一块开发板挨个重新烧录。

业务痛点:效率低下,需要开发人员在现场进行重复机械的工作。

解决思路:如果开发板能够连上网络,能否通过网络连接的方式远程控制一批开发板同时升级

image-20211231195745005

升级服务是什么?

OTA(Over the Air) 提供对设备远程升级的能力,可以让各种设备(如 IP 摄像头等),轻松支持远程升级能力。

目前 HarmonyOS 仅支持全量包升级,暂不支持差分包升级。
 全量包升级是将新系统全部内容做成升级包,进行升级。
 差分包升级是将新老系统的差异内容做成升级包,进行升级。

image-20211231195919952

启动恢复

启动恢复是什么?

启动恢复子系统负责从内核启动之后应用启动之前系统关键服务进程的启动过程以及设备恢复出厂设置的功能。

涉及以下组件: Init启动引导组件,Appspawn启动引导组件, Bootstrap服务启动组件,Syapara系统属性组件, Startup启动组件。

image-20211231201152908

Init启动引导组件

主要功能:Init启动引导组件负责在系统启动阶段启动关键服务进程,若用户需要新增随开机自启动的系统服务,可将新增服务加入配置文件init.cfg中。

运行机制:Init启动引导组件对应的进程为init进程,是内核完成初始化后启动的第一个用户态进程

init进程启动之后,读取init.cfg配置文件,根据解析结果,执行相应命令并依次启动各关键系统服务进程,在启动系统服务进程的同时设置其对应权限。

image-20211231211738021

Appspawn启动引导组件

  • 主要功能:负责接收用户程序框架的命令孵化应用进程设置新进程的权限,并调用应用程序框架的入口函数。
  • 运行机制:Appspawn被Init启动后,向IPC(Inter-Process Communication跨进程通信)框架注册服务名称,之后等待接收进程间消息,根据消息解析结果启动应用服务并赋予其对应权限。

image-20211231212606313

Bootstarp服务启动组件

主要功能:

提供各服务和功能的启动入口标识。在SAMGR(系统服务框架子系统)启动时,会调用boostrap标识的入口函数,并启动系统服务。

主要特点:

实现了服务的自动初始化,即服务的初始化函数无需显式调用,而是将其使用宏定义的方式申明,就会在系统启动时自动被执行

实现原理:

将服务启动的函数通过宏申明之后,放在预定义好的zInit代码段中,系统启动的时候调用OHOS_SystemInit接口遍历该代码段并调用其中的函数。

Syapara系统属性组件

主要功能:负责提供获取与设置操作系统相关的系统属性

OEM厂商部分仅提供默认值,具体值需OEM产品方按需进行调整。

image-20220101163723294


软总线

传统总线结构

传统的总线是一种内部结构,它连通着 CPU ,内存,输入输出设备,主机的各个部件共用这条通信通路。

image-20220101165651914

软总线结构

分布式软总线

  • 连通的是 1+8+N 的独立设备。 1 个手机8 种设备(车机,音箱,耳机,手表 / 手环,平板,大屏, pc ,AR/VR ), N 种 IoT 设备

  • 自发现

  • 自组网

  • 高带宽

  • 低延时

image-20220101170017850

传统连接方式与软总线连接方式对比

软总线的一项重要优势就是具备“自发现”能力

image-20220101171034594

image-20220101171050356

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 lk
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信