鸿蒙系统IPC开发指南,Openharmony IPC通信(L2),IPC通信包括客户端(client)和服务端(service)。服务端TestService继承自IPCObjectStub。客户端TestServiceClient通过iface_cast(object)获取到一个TestServiceProxy对象。TestServiceProxy继承自PeerHolder,里面包含指向IPCObjectProxy的指针。客户端的IPCObjectProxy和服务端IPCObjectStub是对应关系。
一、简介
Openharmony的IPC通信,几乎所有模块都有用到。
对IPC通信流程的理解,为熟悉了解其他模块有很重要的帮助。
IPC通信(仓库:communication_ipc)与safwk系统服务框架(仓库:distributedschedule_safwk)和samgr系统服务管理(仓库:distributedschedule_samgr)有很紧密的联系。
二、IPC通信
2.1 IPC通信注册流程
以foundation\communication\ipc\ipc\test\auxiliary\native为例,对IPC进行梳理。
IPC通信包括客户端(client)和服务端(service)。
- 服务端TestService继承自IPCObjectStub。
- 客户端TestServiceClient通过iface_cast(object)获取到一个TestServiceProxy对象。TestServiceProxy继承自PeerHolder,里面包含指向IPCObjectProxy的指针。
- 客户端的IPCObjectProxy和服务端IPCObjectStub是对应关系。
流程图:
流程图解释
服务端以IPC_TEST_SERVICE为saId,将继承自IPCObjectStub的对象经dbinder驱动,注册到samgr系统服务管理进程中去。
binder_translate_binder有一个将标志为BINDER_TYPE_BINDER转换成BINDER_TYPE_HANDLE的过程。samgr响应注册消息,通过BinderInvoker::UnflattenObject解析对象,实际上是根据注册的IPCObjectStubnew一个IPCObjectProxy对象存储在samgr的map中。
客户端以IPC_TEST_SERVICE去samgr中取IPCObjectProxy对象。并通过iface_castnew一个包含取的IPCObjectProxy的TestServiceProxy对象。这样客户端和服务端就建立起了关系,可以进行下一步相互通信。
2.2 IPC通信交互
Openharmony的IPC通信,有点类似http协议:客户发送数据==>服务端响应处理数据==>服务端回复==>客户端获取到回复数据
流程图如下:
客户端与服务端的交互
客户端通过: 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);