#夏日挑战赛# OpenHarmony IPC服务的动态加载(拉起)流程(L2) 原创 精华

碼磚民工
发布于 2022-7-13 14:43
浏览
7收藏

「本文正在参加星光计划3.0–夏日挑战赛」

@toc

简介

IPC通信,通常包括客服端和服务端。服务端的拉起: 通常都配置成开机启动拉起,开机的时候init进程把服务拉起。此文章介绍服务的另外一种拉起方式动态加载:服务不配置成开机拉起,在客户端运行的时候,去拉起对应的服务。示例以OpenHarmony3.1版本为基础实现:

动态加载数据流程解析

动态加载涉及到4个进程间的数据流转。此问对init的数据处理到拉起服务端过程进行大致梳理,如果发现有问题可以交流,可以把这个流程修改得更正确更精准一些。流程可以参考下图+结合后面的示例分析。
#夏日挑战赛# OpenHarmony IPC服务的动态加载(拉起)流程(L2)-鸿蒙开发者社区

  • 客户端(myappclient) 发起拉起 服务命令,最后init拉起服务端(myappservice_sa)。
  • 服务拉启之后,客户端和服务端 进行IPC通信。
    流程图工具vscode+plantUML(插件)
    init拉起服务的日志:hilog -t kmsg
    #夏日挑战赛# OpenHarmony IPC服务的动态加载(拉起)流程(L2)-鸿蒙开发者社区

动态加载示例

子系统配置

build\subsystem_config.json

 "myapp": {
    "path":"myapptest",
    "name": "myapp"
  }

#夏日挑战赛# OpenHarmony IPC服务的动态加载(拉起)流程(L2)-鸿蒙开发者社区

产品配置

productdefine\common\products\Hi3516DV300.json

"myapp:myappservice_test":{}

#夏日挑战赛# OpenHarmony IPC服务的动态加载(拉起)流程(L2)-鸿蒙开发者社区

代码

代码目录结构

#夏日挑战赛# OpenHarmony IPC服务的动态加载(拉起)流程(L2)-鸿蒙开发者社区
myapptest放在代码根目录,代码见附件

服务ID的添加

服务ID有统一的头文件
foundation\distributedschedule\samgr\interfaces\innerkits\samgr_proxy\include\system_ability_definition.h

MY_APP_SERVICE_ID                                = 9000,
...
{ MY_APP_SERVICE_ID, "MyAppService"},

#夏日挑战赛# OpenHarmony IPC服务的动态加载(拉起)流程(L2)-鸿蒙开发者社区
#夏日挑战赛# OpenHarmony IPC服务的动态加载(拉起)流程(L2)-鸿蒙开发者社区
客户端动态加载服务的关键代码段,见附件:

    // 加载动态库服务
    sptr<CallBack> callback(new CallBack());
    saMgr->LoadSystemAbility(MY_APP_SERVICE_ID, callback);

    // 阻塞,等待isload传入值
    bool laodResult = callback->getLoadResult();
    (void)laodResult;

编译

要全量编译9000.xml 才能生成myappservice_sa.xml
编译命令:./build.sh --product-name Hi3516DV300 --ccache

修改开发板的读写权限

进入终端:hdc_std.exe shell
修改权限:mount -o remount,rw /
创建test目录:mkdir /data/test/

#夏日挑战赛# OpenHarmony IPC服务的动态加载(拉起)流程(L2)-鸿蒙开发者社区
将编译文件发送到开发板对应目录:

动态服务库:libmyappservice.z.so 发送到开发板目录:/system/lib/
动态库的xml文件:myappservice_sa.xml 发送到开发板目录:/system/profile/
启动配置:myappservice_sa.cfg 发送到开发板目录:/system/etc/init/
客户端:myappclient 发送到开发板目录:/data/test/

#夏日挑战赛# OpenHarmony IPC服务的动态加载(拉起)流程(L2)-鸿蒙开发者社区
修改客户端可执行权限(其他文件权限不够也需要进行对应修改,这里只以客户端为例)

切到对应的目录:cd /data/test/
修改成可执行:chmod 0755 myappclient

#夏日挑战赛# OpenHarmony IPC服务的动态加载(拉起)流程(L2)-鸿蒙开发者社区

测试

第一步:重启开发板
终端1:
第二步:查询服务是否启动ps -A | grep myappservice_sa, 没有启动
终端2:
第三步:运行客户端/data/test/myappclient
终端1:
第四步:查询服务是否启动ps -A | grep myappservice_sa, 启动,并且客户端和服务端的交互结果也已经输出。
#夏日挑战赛# OpenHarmony IPC服务的动态加载(拉起)流程(L2)-鸿蒙开发者社区

动态加载的官网

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
myapptest.rar 9.53K 100次下载
IPC动态加载.rar 570B 128次下载
已于2022-11-22 10:52:59修改
10
收藏 7
回复
举报
8条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

谢谢老师贴心的把流程图放在的附件中,动态加载的使用场景老师能举例一些吗?

3
回复
2022-7-13 15:31:07
挖墙脚的农民工
挖墙脚的农民工

虽然没看懂,但还是觉得很牛瓣

3
回复
2022-7-13 15:58:45
Whyalone
Whyalone

已Starred

3
回复
2022-7-13 16:59:39
碼磚民工
碼磚民工 回复了 红叶亦知秋
谢谢老师贴心的把流程图放在的附件中,动态加载的使用场景老师能举例一些吗?

客户端经过napi封装供用js的 按钮触发调用,操作人员没有主动 触发调用前,不需要后台对应的服务常驻。对应的服务开机就启动  没有什么作用还占用资源。

3
回复
2022-7-14 19:02:02
拓维信息HOS
拓维信息HOS

给老师点赞

 

2
回复
2022-7-15 10:44:38
民之码农
民之码农

很不错,赞起!

1
回复
2022-7-19 09:20:58
mb6538c538566e2
mb6538c538566e2

楼主,我想做一个提供回调函数注册的ipc服务接口,该如何写啊?是要用到idl接口吗

回复
2024-7-20 03:25:59
碼磚民工
碼磚民工 回复了 mb6538c538566e2
楼主,我想做一个提供回调函数注册的ipc服务接口,该如何写啊?是要用到idl接口吗

这个不清楚哦,很久没接触,估计你得自己摸索一下了……

回复
2024-7-25 13:55:36
回复
    相关推荐