Openharmony IPC通信(L2)

​想了解更多内容,请访问:​

​51CTO和华为官方合作共建的鸿蒙技术社区​

​https://harmonyos.51cto.com​

一、简介

Openharmony的IPC通信,几乎所有模块都有用到。

对IPC通信流程的理解,为熟悉了解其他模块有很重要的帮助。

IPC通信(仓库:communication_ipc)与safwk系统服务框架(仓库:distributedschedule_safwk)和samgr系统服务管理(仓库:distributedschedule_samgr)有很紧密的联系。

二、IPC通信

2.1 IPC通信注册流程

以foundationcommunicationipcipctestauxiliarynative为例,对IPC进行梳理。

IPC通信包括客户端(client)和服务端(service)。

  • 服务端TestService继承自IPCObjectStub。
  • 客户端TestServiceClient通过iface_cast(object)获取到一个TestServiceProxy对象。TestServiceProxy继承自PeerHolder,里面包含指向IPCObjectProxy的指针。
  • 客户端的IPCObjectProxy和服务端IPCObjectStub是对应关系。

流程图:

Openharmony IPC通信(L2)

流程图解释

服务端以IPC_TEST_SERVICE为saId,将继承自IPCObjectStub的对象经dbinder驱动,注册到samgr系统服务管理进程中去。

binder_translate_binder有一个将标志为BINDER_TYPE_BINDER转换成BINDER_TYPE_HANDLE的过程。samgr响应注册消息,通过BinderInvoker::UnflattenObject解析对象,实际上是根据注册的IPCObjectStubnew一个IPCObjectProxy对象存储在samgr的map中。

Openharmony IPC通信(L2)

客户端以IPC_TEST_SERVICE去samgr中取IPCObjectProxy对象。并通过iface_castnew一个包含取的IPCObjectProxy的TestServiceProxy对象。这样客户端和服务端就建立起了关系,可以进行下一步相互通信。

2.2 IPC通信交互

Openharmony的IPC通信,有点类似http协议:客户发送数据==>服务端响应处理数据==>服务端回复==>客户端获取到回复数据

流程图如下:

Openharmony IPC通信(L2)

客户端与服务端的交互

客户端通过: Remote()->SendRequest向服务端发消息,等待结果。

服务端通过: xxxServiceStub::OnRemoteRequest处理客户端消息,并回复。

三、samgr系统服务管理进程

主要管理各个模块服务端注册的saId和IPCObjectProxy对象键值对。

四、safwk系统服务框架

IPC客户端服务端注册拉起框架。

4.1 服务端的注册

xxxInterface是客户端和服务端都需要实现的接口继承类。

注册方式1,基本上自己有main函数入口:

xxxService继承IPCObjectStub 和 xxxInterface

auto saMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
sptr<IRemoteObject> newInstance = new xxxService();
int result = saMgr->AddSystemAbility(xxxSaId, newInstance);

注册方式2, 本身没有main函数入口,需要借助safwk的main入口:

xxxService继承IPCObjectStub,xxxInterface 和 SystemAbility

// 注册方式2的第一种方式
REGISTER_SYSTEM_ABILITY_BY_ID(xxxService, xxxSaId, true);
// 注册方式2的第二种方式
SystemAbility::MakeAndRegisterAbility

4.2 服务拉起

  • 注册方式1:有main入口,是一个独立进程。直接运行即可。
  • 注册方式2:编译出来是一个动态库,

通过: /system/bin/sa_main /system/profile/xxx_sa.xml拉起来,xml文件中配置了动态库信息。可以参考文档

​【OpenHarmony SA 动态库服务 拉起的main入口】​​了解拉起流程

4.3 客户端类定义

xxxServiceProxy继承PeerHolder 和 xxxInterface

客户端类中定义一个静态变量:

// 定义静态变量,才能通过iface_cast创建一个包含IPCObjectProxy的xxxServiceProxy对象
static inline BrokerDelegator<xxxServiceProxy> delegator_;

4.4 客户端获取注册信息

auto saMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
sptr<IRemoteObject> object = saMgr->GetSystemAbility(SaId);
client = iface_cast<xxxInterface >(object);

以foundationcommunicationipcipctestauxiliarynative为例继承图:

Openharmony IPC通信(L2)

​想了解更多内容,请访问:​

​51CTO和华为官方合作共建的鸿蒙技术社区​

​https://harmonyos.51cto.com​

Openharmony IPC通信(L2)

文章版权声明

 1 原创文章作者:9005,如若转载,请注明出处: https://www.52hwl.com/92675.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年1月16日 下午9:23
下一篇 2024年1月16日 下午9:23