更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com一、介绍Openharmony的IPC通信几乎所有模块都使用。了解IPC通信过程对于熟悉其他模块非常重要。IPC通信(仓库:communication_ipc)与safwk系统服务框架(仓库:distributedschedule_safwk)和samgr系统服务管理(仓库:distributedschedule_samgr)密切相关。2、IPC通信2.1IPC通信注册流程以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,通过dbinder驱动,将继承自IPCObjectStub的对象注册到samgr系统的服务管理进程中。binder_translate_binder有一个将标志BINDER_TYPE_BINDER转换为BINDER_TYPE_HANDLE的过程。Samgr响应注册消息,通过BinderInvoker::UnflattenObject解析对象。实际上,根据注册的IPCObjectStubnew,在samgr的map中存储了一个IPCObjectProxy对象。客户端使用IPC_TEST_SERVICE从samgr获取IPCObjectProxy对象。并通过iface_castnew一个包含获取的IPCObjectProxy的TestServiceProxy对象。这样客户端和服务端就建立了关系,下一步就可以相互通信了。2.2IPC通信交互Openharmony的IPC通信有点类似于http协议:客户端发送数据==>服务器响应处理后的数据==>服务器回复==>客户端获取回复数据流程图如下:客户端与服务器的交互客户端通过:Remote()->SendRequest向服务器发送消息,并等待结果。服务器通过:xxxServiceStub::OnRemoteRequest和回复处理客户端消息。3、samgr系统的服务管理进程主要管理注册在各模块server端的saId和IPCObjectProxy对象的键值对。4、safwk系统服务框架IPC客户端服务器注册拉起框架。4.1服务端的注册xxxInterface是客户端和服务端都需要实现的接口继承类。注册方式1,基本都有自己的主函数入口:xxxService继承IPCObjectStub和xxxInterfaceauto,新实例);注册方式二,本身没有主函数入口,需要使用safwk的主入口:xxxService继承IPCObjectStub、xxxInterface和SystemAbility//注册方式二的第一种方法REGISTER_SYSTEM_ABILITY_BY_ID(xxxService,xxxSaId,true);//注册方法二的第二个方法,SystemAbility::MakeAndRegisterAbility4.2服务拉起注册方法一:有一个主入口,是一个独立的进程。直接运行即可。注册方式二:编译为动态库,通过:/system/bin/sa_main/system/profile/xxx_sa.xml拉起,在xml文件中配置动态库信息。可以参考文档【OpenHarmonySA动态库服务上拉主要入口】了解上拉过程4.3Client类定义xxxServiceProxy继承PeerHolder和xxxInterfaceClient类定义一个静态变量://定义一个静态变量传递给iface_cast创建一个包含IPCObjectProxy的xxxServiceProxy对象staticinlineBrokerDelegator
