色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

詳解proxy-stub結構的設計模式

OpenHarmony技術社區 ? 來源:HarmonyOS技術社區 ? 作者:HarmonyOS技術社區 ? 2022-03-30 09:28 ? 次閱讀

OpenHarmony 中存在很多的服務,一般來說可以使得 A 應用調用 B 服務的方法,就像在自己進程中調用一樣,這里具體的實現實際通過 binder 驅動實現。

binder 驅動通過 mmap 將內核態代碼映射到用戶態,直接讀寫數據這樣就完成了跨進程的調用。不過這不是該篇內容的重點,本片主要講一下 proxy - stub 的設計模式。

服務的一般編碼模式

使用 proxy - stub 架構編程,大致可以分為以下三個步驟:

設計接口類,繼承至 IRemoteBroker,接口方法一般設計為虛方法。

設計 proxy 類,繼承至 IRemoteProxy,并且實現 sendRequest 方法和自身虛方法。

設計 stub 類,繼承至 IRemoteStub ,并且實現 OnRemote 方法和自身虛方法。

這樣我們就可以在調用是調用 proxy 類的接口方法就像調用 stub 類的接口方法一樣了。

源碼剖析

我們通過閱讀源碼,解開其神秘的面紗。我們現在關注幾個重點的類。

IRemoteObject:

classIRemoteObject:publicvirtualParcelable,publicvirtualRefBase{
public:
enum{
IF_PROT_DEFAULT,/*Invokerfamily.*/
IF_PROT_BINDER=IF_PROT_DEFAULT,
IF_PROT_DATABUS,
};
enum{
DATABUS_TYPE,
};
classDeathRecipient:publicRefBase{
public:
enum{
ADD_DEATH_RECIPIENT,
REMOVE_DEATH_RECIPIENT,
NOTICE_DEATH_RECIPIENT,
TEST_SERVICE_DEATH_RECIPIENT,
TEST_DEVICE_DEATH_RECIPIENT,
};
virtualvoidOnRemoteDied(constwptr&object)=0;
};

virtualint32_tGetObjectRefCount()=0;

virtualintSendRequest(uint32_tcode,MessageParcel&data,MessageParcel&reply,MessageOption&option)=0;

virtualboolIsProxyObject()const;

virtualboolCheckObjectLegality()const;

virtualboolAddDeathRecipient(constsptr&recipient)=0;

virtualboolRemoveDeathRecipient(constsptr&recipient)=0;

virtualboolMarshalling(Parcel&parcel)constoverride;

staticIRemoteObject*Unmarshalling(Parcel&parcel);

staticboolMarshalling(Parcel&parcel,constsptr&object);

virtualsptrAsInterface();

virtualintDump(intfd,conststd::vector<std::u16string>&args)=0;

conststd::u16stringdescriptor_;

std::u16stringGetObjectDescriptor()const;

protected:
explicitIRemoteObject(std::u16stringdescriptor=nullptr);
};

這就是真正在 binder 驅動中數據傳輸的類,繼承自 Parcelable 。而繼承RefBase 可以理解為智能指針的控制塊。

OpenHarmony 中這里并沒有直接使用 C++ 標準庫中的智能指針,而是使用 sptr 和 refbase 兩個類共同構建,也就是裸指針和控制塊相關信息。使用后者的方式,更加解耦。符合復雜架構設計理念。

IRemoteBroker:


classIRemoteBroker:publicvirtualRefBase{
public:
IRemoteBroker()=default;
virtual~IRemoteBroker()override=default;
virtualsptrAsObject()=0;
staticinlinesptrAsImplement(constsptr&object)
{
returnnullptr;
}
};

#defineDECLARE_INTERFACE_DESCRIPTOR(DESCRIPTOR)
staticinlineconststd::u16stringmetaDescriptor_={DESCRIPTOR};
staticinlineconststd::u16string&GetDescriptor()
{
returnmetaDescriptor_;
}

一般的接口類,通過 metaDescriptor_ 作為表示區分標識。

IRemoteProxy:

namespaceOHOS{
template<typenameINTERFACE>classIRemoteProxy:publicPeerHolder,publicINTERFACE{
public:
explicitIRemoteProxy(constsptr&object);
~IRemoteProxy()override=default;

protected:
sptrAsObject()override;
};

template<typenameINTERFACE>
IRemoteProxy::IRemoteProxy(constsptr&object):PeerHolder(object)
{
}

template<typenameINTERFACE>sptrIRemoteProxy::AsObject()
{
returnRemote();
}
}//namespaceOHOS

IRemoteProxy 使用 c++ 的 crtp (奇特重現模板模式)編程,使得父類可以調用子類的方法。繼承自 peerhold (其實就是包括一個 IRemoteObject 對象)。

IRemoteStub:



namespaceOHOS{
template<typenameINTERFACE>classIRemoteStub:publicIPCObjectStub,publicINTERFACE{
public:
IRemoteStub();
virtual~IRemoteStub()=default;
sptrAsObject()override;
sptrAsInterface()override;
};

template<typenameINTERFACE>IRemoteStub::IRemoteStub():IPCObjectStub(INTERFACE::GetDescriptor()){}

template<typenameINTERFACE>sptrIRemoteStub::AsInterface()
{
returnthis;
}

template<typenameINTERFACE>sptrIRemoteStub::AsObject()
{
returnthis;
}
}//namespaceOHOS

stub 對象較于 proxy 對象復雜一些,也使用 crtp 編程。會繼承 IPCObjectStub(也是 iremoteObject 對象)。

看到這里,可能有人疑惑,為什么 proxy 調用,會直接調用到 stub 這端呢?

其實奧秘就在于 stub 繼承的 IPCObjectStub(繼承 iremoteObject)對象,就是這個 iremoteObject 對象。

proxy 的構造繼承 peerhold,peerhold 類中的iremoteObject 對象和 IPCObjectStub 這個是什么關系呢?

其實 peerhold 是 IPCObjectStub 的引用對象,實際類型是 IPCObjectProxy。

這兩者在 ipc 框架中,IPCObjectProxy 實際使用 sendrequest,IPCObjectStub 便會調用 OnremoteRequest。如果有興趣,我們下次可以分析 IPC 框架具體是如何實現的。

原文標題:剖析鴻蒙經典的proxy - stub架構

文章出處:【微信公眾號:HarmonyOS技術社區】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1381

    瀏覽量

    40364
  • 架構
    +關注

    關注

    1

    文章

    519

    瀏覽量

    25510
  • OpenHarmony
    +關注

    關注

    25

    文章

    3744

    瀏覽量

    16473

原文標題:剖析鴻蒙經典的proxy - stub架構

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    教你PADS 中如何檢查 Stub 線!!!

    此份簡明教程將以圖文的形式展示如何幫助您快速和準確地進行 DFM 檢查和優化 Stub 線。
    的頭像 發表于 07-10 15:48 ?9229次閱讀
    教你PADS 中如何檢查 <b class='flag-5'>Stub</b> 線!!!

    注冊表結構詳解

    注冊表結構詳解
    發表于 03-05 15:06

    HarmonyOS遠端狀態訂閱開發實例

    IPC/RPC提供對遠端Stub對象狀態的訂閱機制, 在遠端Stub對象消亡時,可觸發消亡通知告訴本地Proxy對象。這種狀態通知訂閱需要調用特定接口完成,當不再需要訂閱時也需要調用特定接口取消
    發表于 10-12 14:55

    防火墻術語-Proxy

    防火墻術語-Proxy   英文原義:Proxy 中文釋義:代理 注  解:防火墻的一類。工作在應用層,特點是兩次連
    發表于 02-24 11:01 ?1013次閱讀

    開關電源拓撲結構詳解

    開關電源拓撲結構詳解
    發表于 01-14 11:18 ?75次下載

    一文詳解OpenHarmony軟總線

    本次說明可能側重在標準系統之上。軟總線依舊采用鴻蒙經典的 proxy - stub 架構,接口類 ISoftBusServer,ISoftBusClient。
    的頭像 發表于 03-30 08:38 ?5831次閱讀

    xsec-proxy-scanner代理掃描器

    xsec-proxy-scanner.zip
    發表于 04-28 09:18 ?5次下載
    xsec-<b class='flag-5'>proxy</b>-scanner代理掃描器

    php-proxy-app Web代理服務器

    php-proxy-app.zip
    發表于 04-29 10:51 ?1次下載
    php-<b class='flag-5'>proxy</b>-app Web代理服務器

    Tcp-DNS-proxy TCP DNS代理

    Tcp-DNS-proxy.zip
    發表于 04-29 10:44 ?2次下載
    Tcp-DNS-<b class='flag-5'>proxy</b> TCP DNS代理

    Exchange_proxy Exchange安全代理

    exchange_proxy.zip
    發表于 05-07 09:51 ?0次下載
    Exchange_<b class='flag-5'>proxy</b> Exchange安全代理

    全面解讀MOSFET結構及設計詳解

    MOSFET結構、特性參數及設計詳解
    發表于 01-26 16:47 ?1562次閱讀

    Stub Generator V.1.00 用戶手冊

    Stub Generator V.1.00 用戶手冊
    發表于 04-27 19:44 ?0次下載
    <b class='flag-5'>Stub</b> Generator V.1.00 用戶手冊

    設計模式結構性:代理模式

    在代理模式Proxy Pattern)中,一個類代表另一個類的功能。這種類型的設計模式屬于結構型模式
    的頭像 發表于 06-09 15:27 ?862次閱讀
    設計<b class='flag-5'>模式</b><b class='flag-5'>結構</b>性:代理<b class='flag-5'>模式</b>

    PCB設計中的Stub對信號傳輸的影響

    PCB設計中應盡量減少Stub的存在,或者在無法完全避免Stub的情況下,通過優化Stub的長度和幾何形狀來降低它們對信號的影響。
    的頭像 發表于 12-20 18:28 ?215次閱讀
    PCB設計中的<b class='flag-5'>Stub</b>對信號傳輸的影響

    PCB設計中的Stub天線對信號傳輸的影響

    在PCB設計中,Stub(也稱為短樁線或殘樁線)對信號傳輸有以下幾個主要影響:1.容性效應導致的阻抗偏低:Stub會導致容性效應,使得阻抗偏低,影響信道的阻抗一致性。Stub越長,阻抗降低得越多
    的頭像 發表于 12-24 17:21 ?498次閱讀
    PCB設計中的<b class='flag-5'>Stub</b>天線對信號傳輸的影響
    主站蜘蛛池模板: 69亞洲亂人倫AV精品發布| 嫩草影院成人| 欧美人与动牲交A精品| 2019夜夜| 老司机亚洲精品影院| 欧美乱码伦视频免费66网| 中文成人在线视频| 久久综合伊人 magnet| 无码乱人伦一区二区亚洲| 在线观看成年人免费视频| 成人区精品一区二区不卡AV免费| 麻豆第一区MV免费观看网站| 最近中文字幕免费高清MV视频6| 狂躁美女BBBBBB视频| 56prom在线精品国产| 欧美精品专区第1页| 纯肉无码AV在线看免费看| 久久综合给合久久狠狠狠…| 亚洲午夜无码久久久久蜜臀av| 久草热8精品视频在线观看| 一区二区三区福利视频| 久久综合色视频| caoporn超碰在线| 神马电影院午夜神福利在线观看| 国产精品久久久久久久AV下载 | 狠狠色色综合站| 欲插爽乱浪伦骨| 尿了么app| 国产精品亚洲精品爽爽| 伊人久久久久久久久久| 欧美xxxxx九色视频免费观看| 调教日本美女| 亚洲精品乱码8久久久久久日本| 老年日本老年daddy| 成年人免费观看视频网站| 亚洲AV精品无码成人| 久久天天综合| 高清mv视频免费观看| 伊人久99久女女视频精品免| 奇米色偷偷| 精品国产人妻国语|