
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
@toc
Openharmony的IPC通信,几乎所有模块都有用到。
对IPC通信流程的理解,为熟悉了解其他模块有很重要的帮助。
IPC通信(仓库:communication_ipc)
与safwk系统服务框架(仓库:distributedschedule_safwk)
和samgr系统服务管理(仓库:distributedschedule_samgr)
有很紧密的联系。
以foundation\communication\ipc\ipc\test\auxiliary\native为例,对IPC进行梳理。
TestService
继承自IPCObjectStub
。TestServiceClient
通过iface_cast<ITestService>(object)
获取到一个TestServiceProxy
对象。TestServiceProxy
继承自PeerHolder
,里面包含指向IPCObjectProxy
的指针。IPCObjectProxy
和服务端IPCObjectStub
是对应关系。IPC_TEST_SERVICE
为saId
,将继承自IPCObjectStub
的对象经dbinder驱动,注册到samgr系统服务管理进程中去。BINDER_TYPE_BINDER
转换成BINDER_TYPE_HANDLE
的过程。samgr响应注册消息,通过BinderInvoker::UnflattenObject
解析对象,实际上是根据注册的IPCObjectStub
new一个IPCObjectProxy
对象存储在samgr的map中。IPC_TEST_SERVICE
去samgr中取IPCObjectProxy
对象。并通过iface_cast
new一个包含取的IPCObjectProxy
的TestServiceProxy
对象。这样客户端和服务端就建立起了关系,可以进行下一步相互通信。Remote()->SendRequest
向服务端发消息,等待结果。xxxServiceStub::OnRemoteRequest
处理客户端消息,并回复。BinderInvoker::TransactWithDriver
BinderInvoker::HandleCommands(uint32_t cmd)
//kernel/linux/linux-4.19/drivers/android
,驱动的起始调用函数:device_initcall
。驱动名称如下图:BINDER_WRITE_READ
如下图:主要管理各个模块服务端注册的saId
和IPCObjectProxy
对象键值对。
IPC客户端服务端注册拉起框架。
xxxInterface是客户端和服务端都需要实现的接口继承类。
auto saMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
sptr<IRemoteObject> newInstance = new xxxService();
int result = saMgr->AddSystemAbility(xxxSaId, newInstance);
// 注册方式2的第一种方式
REGISTER_SYSTEM_ABILITY_BY_ID(xxxService, xxxSaId, true);
// 注册方式2的第二种方式
SystemAbility::MakeAndRegisterAbility
/system/bin/sa_main /system/profile/xxx_sa.xml
拉起来,xml文件中配置了动态库信息。可以参考文档xxxServiceProxy继承PeerHolder 和 xxxInterface
客户端类中定义一个静态变量:
// 定义静态变量,才能通过iface_cast创建一个包含IPCObjectProxy的xxxServiceProxy对象
static inline BrokerDelegator<xxxServiceProxy> delegator_;
auto saMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
sptr<IRemoteObject> object = saMgr->GetSystemAbility(SaId);
client = iface_cast<xxxInterface >(object);
以foundation\communication\ipc\ipc\test\auxiliary\native为例继承图:
以上是个人对于IPC通信的理解,欢迎一起学习指正。