在面向全场景、全连接、全智能时代背景下,OpenHarmony必然会受到越来越多开发者的支持,在不同场景下,会根据实际需求裁剪某些非必要的子系统或组件,也会增加新的子系统或者组件。如果你想添加子系统或者添加服务/组件的话,希望本文能够给你带来一些启示。
1 基本概念
介绍自定义服务之前,先简单介绍几个概念:
①在鸿蒙系统中有三个基本概念,它们是子系统(subsystems
),组件(components
),功能(features
).
OpenHarmony整体遵从分层设计,从下向上依次为:内核层、系统服务层、框架层和应用层。
系统功能按照“系统 > 子系统 > 组件”逐级展开。子系统是一个逻辑概念,它具体由对应的组件构成。组件是对子系统的进一步拆分,可复用的软件单元,它包含源码、配置文件、资源文件和编译脚本;能独立构建,以二进制方式集成,是具备独立验证能力的二进制单元。
举例来说,鸿蒙(系统) -->多媒体(子系统) -->音频(组件)–>采集(功能)
②IPC(Inter-Process Communication)机制:使用Binder驱动,用于设备内的跨进程通信。IPC通常采用客户端-服务器(Client-Server)模型,服务请求方(Client)可获取提供服务提供方(Server)的代理 (Proxy),并通过此代理读写数据来实现进程间的数据通信。
通常,Server会先注册系统能力(System Ability)到系统能力管理者(System Ability Manager,缩写saMgr)中,saMgr负责管理这些SA并向Client提供相关的接口。Client要和某个具体的SA通信,必须先从saMgr中获取该SA的代理,然后使用代理和SA通信。一般使用Proxy表示服务请求方,Stub表示服务提供方。
2 预期目标
三:如何和新服务进行通信
3 实现效果
3.1.编译成功
配置完成之后,代码编译成功
以产品rk3568-khdvk为例,img文件生成,如下图
3.2.新服务运行
烧录img文件到开发板,新服务hello以独立进程在开发板后台运行,如下图
3.3.和新服务进行通信
可以通过命令行方式或者应用程序启动触发方式和服务端进行通信。
3.3.1 命令行进行通信
客户端操作:执行myhello可执行程序,输入命令send,发送字符串"Hello,World"。
服务端响应:在service层收到了发送的字符串"Hello,World"。
3.3.2 应用程序触发进行通信
应用程序启动触发:
服务端响应:返回字符串打印到应用程序窗体内。
4 代码实现目录结构
整体位于目录foundation下,即foundation/mytest/hello。
mytest
└─hello
│ ohos.build // 管理mytest子系统各层级BUILD.gn
│
├─etc
│ BUILD.gn // 预编译配置管理
│ hello.cfg
│ hello.rc
│
├─interface
│ │ BUILD.gn
│ │
│ ├─include
│ │ hello_client.h
│ │ hello_logs.h // 日志头文件
│ │ hello_proxy.h
│ │ ihello.h
│ │
│ ├─src
│ │ hello_client.cpp // 接收应用层接口调用入口
│ │ hello_proxy.cpp // IPC通信代理
│ │
│ └─test
│ │ BUILD.gn // 对cli工具进行管理
│ │
│ ├─include
│ │ cli_tool.h
│ │
│ └─src
│ cli_tool.cpp // 客户端测试入口
│
├─sa_profile
│ 9999.xml // 以sa ID命名
│ BUILD.gn // 对xml进行管理
│
└─service
│ BUILD.gn // 服务端功能管理
│
├─include
│ hello_service.h
│ hello_stub.h
│
└─src
hello_service.cpp // 服务程序
hello_stub.cpp // IPC通信桩
5 实现过程
5.1 新服务如何配置及编译
5.1.1 新服务如何配置
鸿蒙操作系统一个子系统的配置文件主要有如下四个:
5.1.1.1 模块目录中BUILD.gn文件
在模块目录下配置BUILD.gn,根据类型选择对应的模板。
支持的模板类型:
ohos_executable // 指定 target 是个可执行文件
ohos_shared_library // 声明一个动态(win=.dll、linux=.so)
ohos_static_library // 静态库(win=.lib、linux=.a)
ohos_source_set // 定义源码集&