Openharmony IPC通信(L2)
原創(chuàng)??想了解更多內(nèi)容,請(qǐng)?jiān)L問:??
??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??
??https://harmonyos.51cto.com??
一、簡介
Openharmony的IPC通信,幾乎所有模塊都有用到。
對(duì)IPC通信流程的理解,為熟悉了解其他模塊有很重要的幫助。
IPC通信(倉庫:communication_ipc)與safwk系統(tǒng)服務(wù)框架(倉庫:distributedschedule_safwk)和samgr系統(tǒng)服務(wù)管理(倉庫:distributedschedule_samgr)有很緊密的聯(lián)系。
二、IPC通信
2.1 IPC通信注冊流程
以foundation\communication\ipc\ipc\test\auxiliary\native為例,對(duì)IPC進(jìn)行梳理。
IPC通信包括客戶端(client)和服務(wù)端(service)。
- 服務(wù)端TestService繼承自IPCObjectStub。
- 客戶端TestServiceClient通過iface_cast(object)獲取到一個(gè)TestServiceProxy對(duì)象。TestServiceProxy繼承自PeerHolder,里面包含指向IPCObjectProxy的指針。
- 客戶端的IPCObjectProxy和服務(wù)端IPCObjectStub是對(duì)應(yīng)關(guān)系。
流程圖:
流程圖解釋
服務(wù)端以IPC_TEST_SERVICE為saId,將繼承自IPCObjectStub的對(duì)象經(jīng)dbinder驅(qū)動(dòng),注冊到samgr系統(tǒng)服務(wù)管理進(jìn)程中去。
binder_translate_binder有一個(gè)將標(biāo)志為BINDER_TYPE_BINDER轉(zhuǎn)換成BINDER_TYPE_HANDLE的過程。samgr響應(yīng)注冊消息,通過BinderInvoker::UnflattenObject解析對(duì)象,實(shí)際上是根據(jù)注冊的IPCObjectStubnew一個(gè)IPCObjectProxy對(duì)象存儲(chǔ)在samgr的map中。
客戶端以IPC_TEST_SERVICE去samgr中取IPCObjectProxy對(duì)象。并通過iface_castnew一個(gè)包含取的IPCObjectProxy的TestServiceProxy對(duì)象。這樣客戶端和服務(wù)端就建立起了關(guān)系,可以進(jìn)行下一步相互通信。
2.2 IPC通信交互
Openharmony的IPC通信,有點(diǎn)類似http協(xié)議:客戶發(fā)送數(shù)據(jù)==>服務(wù)端響應(yīng)處理數(shù)據(jù)==>服務(wù)端回復(fù)==>客戶端獲取到回復(fù)數(shù)據(jù)
流程圖如下:
客戶端與服務(wù)端的交互
客戶端通過: Remote()->SendRequest向服務(wù)端發(fā)消息,等待結(jié)果。
服務(wù)端通過: xxxServiceStub::OnRemoteRequest處理客戶端消息,并回復(fù)。
三、samgr系統(tǒng)服務(wù)管理進(jìn)程
主要管理各個(gè)模塊服務(wù)端注冊的saId和IPCObjectProxy對(duì)象鍵值對(duì)。
四、safwk系統(tǒng)服務(wù)框架
IPC客戶端服務(wù)端注冊拉起框架。
4.1 服務(wù)端的注冊
xxxInterface是客戶端和服務(wù)端都需要實(shí)現(xiàn)的接口繼承類。
注冊方式1,基本上自己有main函數(shù)入口:
xxxService繼承IPCObjectStub 和 xxxInterface
auto saMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
sptr<IRemoteObject> newInstance = new xxxService();
int result = saMgr->AddSystemAbility(xxxSaId, newInstance);
注冊方式2, 本身沒有main函數(shù)入口,需要借助safwk的main入口:
xxxService繼承IPCObjectStub,xxxInterface 和 SystemAbility
// 注冊方式2的第一種方式
REGISTER_SYSTEM_ABILITY_BY_ID(xxxService, xxxSaId, true);
// 注冊方式2的第二種方式
SystemAbility::MakeAndRegisterAbility
4.2 服務(wù)拉起
- 注冊方式1:有main入口,是一個(gè)獨(dú)立進(jìn)程。直接運(yùn)行即可。
- 注冊方式2:編譯出來是一個(gè)動(dòng)態(tài)庫,
通過: /system/bin/sa_main /system/profile/xxx_sa.xml拉起來,xml文件中配置了動(dòng)態(tài)庫信息??梢詤⒖嘉臋n
??【OpenHarmony SA 動(dòng)態(tài)庫服務(wù) 拉起的main入口】??了解拉起流程
4.3 客戶端類定義
xxxServiceProxy繼承PeerHolder 和 xxxInterface
客戶端類中定義一個(gè)靜態(tài)變量:
// 定義靜態(tài)變量,才能通過iface_cast創(chuàng)建一個(gè)包含IPCObjectProxy的xxxServiceProxy對(duì)象
static inline BrokerDelegator<xxxServiceProxy> delegator_;
4.4 客戶端獲取注冊信息
auto saMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
sptr<IRemoteObject> object = saMgr->GetSystemAbility(SaId);
client = iface_cast<xxxInterface >(object);
以foundation\communication\ipc\ipc\test\auxiliary\native為例繼承圖:
??想了解更多內(nèi)容,請(qǐng)?jiān)L問:??
??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??
??https://harmonyos.51cto.com??