当前位置:网站首页>#夏日挑战赛#OHOS构建自定义服务实战
#夏日挑战赛#OHOS构建自定义服务实战
2022-06-28 15:52:00 【51CTO】
作者:曹昌言
在面向全场景、全连接、全智能时代背景下,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 预期目标
目标一:新服务如何配置,编译
目标二:如何整合一个新服务到OHOS中
目标三:如何和新服务进行通信
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。
5 实现过程
5.1 新服务如何配置及编译
5.1.1 新服务如何配置
鸿蒙操作系统一个子系统的配置文件主要有如下四个:
5.1.1.1 模块目录中BUILD.gn文件
在模块目录下配置BUILD.gn,根据类型选择对应的模板。
支持的模板类型:
例子:
ohos_shared_library示例
ohos_executable示例:
ohos_executable模板属性和ohos_shared_library基本一致
说明:
可执行模块(即ohos_executable模板定义的)默认是不安装的,如果要安装,需要指定 install_enable = true
ohos_prebuilt_etc示例:
说明:
要添加一个模块到已有部件中去,只需要在该部件的module_list中添加新加模块的gn编译目标;假如该模块提供给其它模块接口,需要在inner_kits中添加对应的配置;如果有该模块的测试用例,需要添加到test_list中去。
5.1.1.2 创建ohos.build文件
每个子系统有一个ohos.build配置文件(或者有bundle.json配置文件),在子系统的根目录下。在新建的子系统目录下每个部件对应的文件夹下创建ohos.build文件,定义部件信息。
说明:
subsystem定义了子系统的名称;parts定义了子系统包含的部件。
一个部件包含部件名,部件包含的模块module_list,部件提供给其它部件的接口inner_kits,部件的测试用例test_list。
在已有子系统中添加一个新的部件,有两种方法:
a)在该子系统原有的ohos.build文件中添加该部件
b)新建一个ohos.build文件
无论哪种方式该ohos.build文件均在对应子系统所在文件夹下
ohos.build文件包含两个部分,第一部分subsystem说明了子系统的名称,parts定义了该子系统包含的部件,要添加一个部件,需要把该部件对应的内容添加进parts中去。添加的时候需要指明该部件包含的模块module_list,假如有提供给其它部件的接口,需要在inner_kits中说明,假如有测试用例,需要在test_list中说明,inner_kits与test_list没有也可以不添加。
5.1.1.3 subsystem_config.json文件
修改系统build目录下的subsystem_config.json文件
该文件定义了有哪些子系统以及这些子系统所在文件夹路径,添加子系统时需要说明子系统path与name,分别表示子系统路径和子系统名。

5.1.1.4 产品配置文件{product_name}.json
在productdefine/common/products目录下的产品配置如RK3568-KHDVK.json中添加对应的部件,直接添加到原有部件后面即可。
指明了产品名,产品厂商,产品设备,版本,要编译的系统类型,以及产品包含的部件。

5.1.2 新服务如何编译
编译整个开源鸿蒙系统,命令如下:
此处{product_name}在实际操作时变更为产品名,例如,rk3566,rk3568等。编译所生成的文件都归档在out/{device_name}/目录下,结果镜像输出在 out/{device_name}/packages/phone/images/ 目录下。
编译之后,至于如何烧录请参考官网或者其他文章。
5.2 整合新服务到ohos中
从代码结构上可以看出,除了5.1配置之外,还需要:
5.2.1 创建sa_profile目录及相关文件
在子系统根目录创建sa_profile目录,创建服务ID为前缀的xml文件及BUILD.gn。
说明:
服务ID值定义在 foundation/distributedschedule/samgr/interfaces/innerkits/samgr_proxy/include/system_ability_definition.h 中,若没有则新建一个。

sa_profile目录示例:

9999.xml文件示例:
BUILD.gn示例:
5.2.2 创建etc目录及相关文件
在子系统根目录创建etc目录,创建服务进程对应的.rc文件。
etc目录示例:

hello.cfg配置示例:
5.3 如何和新服务进行通信
5.3.1 通过命令行和server端进行通信
建立main函数进行测试,代码如下:
定义AbilityCliTool类,使用send绑定了函数cmdSendMessage,通过main中execute函数调用AbilityCliTool::cmdSendMessage,代码如下:
HelloClient类实现代码如下:
这里会走到HelloProxy对象中的SendMessage函数,具体代码如下:
HelloProxy类是Proxy端实现,继承IRemoteProxy<IHello>,调用SendRequest接口向Stub端发送请求,对外暴露服务端提供的能力。HelloStub类具体代码如下:
说明:
该类是和IPC框架相关的实现,需要继承 IRemoteStub<ITestAbility>。Stub端作为接收请求的一端,需重写OnRemoteRequest方法用于接收客户端调用。
接下来通过HelloStubSendMessage调用了服务端业务函数具体实现类HelloService中SendMessage函数,其具体代码如下:
5.3.2 通过应用层触发和server端进行通信
在工具DevEcoStudio中创建工程,在index.js文件中具体代码如下:
进行编译之后生成的hap包,在开发板上进行安装,执行命令如下:
除了在应用层修改之外,还需要在框架层进行如下修改:
至此,就能够从应用层在初始化应用程序时触发调用hello即SendMessage函数,同时返回字符串“Hello,World"在应用程序中显示。
6 总结
通过以上步骤,在ohos系统中自定义子系统或者服务,通过配置编译并烧录到整体系统中,然后通过cli命令行或者应用程序启动触发的方式进行了功能验证,达到了预期制定的三个目标,掌握构建自定义服务的流程及架构。
更多原创内容请关注: 深开鸿技术团队
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
边栏推荐
猜你喜欢
![The k-th element in the array [heap row + actual time complexity of heap building]](/img/69/bcafdcb09ffbf87246a03bcb9367aa.png)
The k-th element in the array [heap row + actual time complexity of heap building]

among us私服搭建

【初学者必看】vlc实现的rtsp服务器及转储H264文件

部门新来了个字节25K出来的,让我见识到了什么是天花板

Knowing these commands allows you to master shell's own tools

24岁秃头程序员教你微服务交付下如何持续集成交付,学不会砍我

【Proteus仿真】L297驱动步进电机

3. caller service call - dapr

NAACL 2022 | 机器翻译SOTA模型的蒸馏

Geoffrey Hinton: my 50 years of in-depth study and Research on mental skills
随机推荐
Slim GAIN(SGAIN)介绍及代码实现——基于生成对抗网络的缺失数据填补
A new 25K byte from the Department showed me what the ceiling is
一台服务器最大并发 tcp 连接数多少?65535?
Qt 界面库
Visual Studio 2010 compilation qt5.6.3
全球陆续拥抱Web3.0,多国已明确开始抢占先机
关注35岁的坎:畏惧是因为你没有匹配这个年纪该有的能力
Android和eclipse和MySQL上传图片并获取
Interviewer: how does the thread pool reuse threads? Do you know? Tell me about it
运动App如何实现端侧后台保活,让运动记录更完整?
Knowing these commands allows you to master shell's own tools
Installation and use of Jenkins
讲师征集令 | Apache DolphinScheduler Meetup分享嘉宾,期待你的议题和声音!
榜单首发——线控制动「新周期」,本土供应商市场竞争力TOP10
PostgreSQL异常处理
VS2013 帮助文档中没有 win32/com
今天睡眠质量记录80分
逆向调试入门-PE结构详解02/07
Lecturer solicitation order | Apache dolphin scheduler meetup sharing guests, looking forward to your topic and voice!
Geoffrey Hinton: my 50 years of in-depth study and Research on mental skills