国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

源碼分析—解析Proxy - Stub 架構的奧秘

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

??想了解更多內容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術社區??

??https://ost.51cto.com??

服務概覽

openHarmony 中存在很多的服務,一般來說可以使得A應用調用B服務的方法,就像在自己進程中調用一樣,這里具體的實現實際通過binder驅動實現。binder驅動通過mmap將內核態代碼映射到用戶態,直接讀寫數據這樣就完成了跨進程的調用。不過這不是該篇內容的重點,本片主要講一下proxy - stub 的設計模式。

服務的一般編碼模式

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

  1. 設計接口類繼承 IRemoteBroker,接口方法一般設計為虛方法。
  2. 設計proxy類 繼承至 IRemoteProxy,并且實現sendRequest方法和自身虛方法。
  3. 設計stub類 繼承至 IRemoteStub ,并且實現OnRemote方法和自身虛方法。

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

源碼剖析

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

IRemoteObject:

class IRemoteObject : public virtual Parcelable, public virtual RefBase {
public:
enum {
IF_PROT_DEFAULT, /* Invoker family. */
IF_PROT_BINDER = IF_PROT_DEFAULT,
IF_PROT_DATABUS,
};
enum {
DATABUS_TYPE,
};
class DeathRecipient : public RefBase {
public:
enum {
ADD_DEATH_RECIPIENT,
REMOVE_DEATH_RECIPIENT,
NOTICE_DEATH_RECIPIENT,
TEST_SERVICE_DEATH_RECIPIENT,
TEST_DEVICE_DEATH_RECIPIENT,
};
virtual void OnRemoteDied(const wptr<IRemoteObject> &object) = 0;
};
virtual int32_t GetObjectRefCount() = 0;
virtual int SendRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) = 0;
virtual bool IsProxyObject() const;
virtual bool CheckObjectLegality() const;
virtual bool AddDeathRecipient(const sptr<DeathRecipient> &recipient) = 0;
virtual bool RemoveDeathRecipient(const sptr<DeathRecipient> &recipient) = 0;
virtual bool Marshalling(Parcel &parcel) const override;
static IRemoteObject *Unmarshalling(Parcel &parcel);
static bool Marshalling(Parcel &parcel, const sptr<IRemoteObject> &object);
virtual sptr<IRemoteBroker> AsInterface();
virtual int Dump(int fd, const std::vector<std::u16string> &args) = 0;
const std::u16string descriptor_;
std::u16string GetObjectDescriptor() const;
protected:
explicit IRemoteObject(std::u16string descriptor = nullptr);
};

這就是真正在binder驅動中數據傳輸的類,繼承自 Parcelable 。而繼承RefBase 可以理解為智能指針的控制塊。openharmony中這里并沒有直接使用c++標準庫中的智能指針,而是使用 sptr 和refbase兩個類共同構建,也就是裸指針和控制塊相關信息。使用后者的方式,更加解耦。符合復雜架構設計理念。

IRemoteBroker:

class IRemoteBroker : public virtual RefBase {
public:
IRemoteBroker() = default;
virtual ~IRemoteBroker() override = default;
virtual sptr<IRemoteObject> AsObject() = 0;
static inline sptr<IRemoteBroker> AsImplement(const sptr<IRemoteObject> &object)
{
return nullptr;
}
};
#define DECLARE_INTERFACE_DESCRIPTOR(DESCRIPTOR) \
static inline const std::u16string metaDescriptor_ = { DESCRIPTOR }; \
static inline const std::u16string &GetDescriptor() \
{ \
return metaDescriptor_; \
}

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

IRemoteProxy:

namespace OHOS {
template <typename INTERFACE> class IRemoteProxy : public PeerHolder, public INTERFACE {
public:
explicit IRemoteProxy(const sptr<IRemoteObject> &object);
~IRemoteProxy() override = default;
protected:
sptr<IRemoteObject> AsObject() override;
};
template <typename INTERFACE>
IRemoteProxy<INTERFACE>::IRemoteProxy(const sptr<IRemoteObject> &object) : PeerHolder(object)
{
}
template <typename INTERFACE> sptr<IRemoteObject> IRemoteProxy<INTERFACE>::AsObject()
{
return Remote();
}
} // namespace OHOS

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

IRemoteStub:

namespace OHOS {
template <typename INTERFACE> class IRemoteStub : public IPCObjectStub, public INTERFACE {
public:
IRemoteStub();
virtual ~IRemoteStub() = default;
sptr<IRemoteObject> AsObject() override;
sptr<IRemoteBroker> AsInterface() override;
};
template <typename INTERFACE> IRemoteStub<INTERFACE>::IRemoteStub() : IPCObjectStub(INTERFACE::GetDescriptor()) {}

template <typename INTERFACE> sptr<IRemoteBroker> IRemoteStub<INTERFACE>::AsInterface()
{
return this;
}
template <typename INTERFACE> sptr<IRemoteObject> IRemoteStub<INTERFACE>::AsObject()
{
return this;
}
} // namespace OHOS

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框架具體是如何實現的。

??想了解更多內容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術社區??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2018-06-20 11:41:06

企業架構

2011-04-13 13:14:41

EIGRP STUB

2024-12-24 09:17:31

2022-06-07 10:33:29

Camera組件鴻蒙

2025-03-05 09:30:00

MySQL流式查詢數據庫

2009-09-09 15:43:15

2010-08-13 10:56:53

2025-02-10 10:59:52

2018-07-19 15:57:46

ViewStub源碼方法

2014-08-19 10:30:30

Swift源碼OpenStack架構

2024-12-27 09:32:25

MyBatis代碼

2016-11-25 13:14:50

Flume架構源碼

2010-03-24 17:03:57

Python源碼分析

2010-02-04 11:06:14

2011-04-29 13:40:37

MongoDBCommand

2024-04-08 07:58:11

Python數據類型字符串

2024-08-26 10:31:23

2016-11-29 09:38:06

Flume架構核心組件

2016-11-25 13:26:50

Flume架構源碼

2024-09-11 09:25:03

Tomcat組件PREP
點贊
收藏

51CTO技術棧公眾號

亚洲精品第一国产综合精品| 91爱爱小视频k| 国产精品极品在线观看| 国产日韩换脸av一区在线观看| 首页国产欧美久久| 黑森林福利视频导航| 精品国产乱子伦一区| 激情欧美一区| 黄动漫在线看| 欧美激情自拍偷拍| 亚洲午夜国产成人| 先锋影音亚洲资源| 欧美日韩一区二区不卡| 国产精品国产一区| 国产网站免费观看| 久久久久久国产精品美女| 成人国产二区| 亚洲欧美一二三| 精品无人国产偷自产在线| 视频在线观看一区| 美女尤物在线视频| 99热在线国产| 欧美三级电影网址| 欧美丝袜丝交足nylons图片| 网友自拍一区| 免费网站在线观看人| 免费看美女隐私的视频| 正在播放精油久久| 91精品久久久久久久久久| 亚洲第一精品久久忘忧草社区| 亚洲国产精品久久人人爱蜜臀| 蜜臀精品一区二区三区在线观看 | 久久久噜噜噜久久狠狠50岁| 亚洲+变态+欧美+另类+精品| 亚洲www.| 黄视频免费在线看| 女女色综合影院| av网在线观看| 国产在线视频资源| 在线看的网站你懂| 2222www色视频在线观看| 亚洲这里只有精品| 国产超碰在线播放| 亚洲欧美在线精品| 国产福利在线免费| 国产a国产a国产a| 免费高清视频日韩| 久草在线资源视频| 好男人免费精品视频| 3p视频在线观看| 日韩中文一区| 成人蜜桃视频| 国产综合欧美在线看| 国产一区二区不卡视频| 久久久精彩视频| 日本一区二区不卡高清更新| 成人在线视频网址| 亚洲a级在线观看| 蜜桃欧美视频| 色女孩综合网| 久久最新免费视频| www.日本在线播放| 日本999视频| 免费看a级黄色片| 成视频免费在线看| 视频国产一区二区三区| 青青青草网站免费视频在线观看| 神马久久久久| 久久www人成免费看片中文| 精品成人免费一区二区在线播放| 日韩中文字幕一区二区高清99| 日韩电影不卡一区| 亚洲国产一区二区三区在线播放| 91精品久久久久久久蜜月 | 欧美在线亚洲综合一区| 欧美91大片| 粉嫩嫩av羞羞动漫久久久 | 中文字幕在线免费不卡| 欧美日韩另类字幕中文| 亚洲精品在线免费播放| 午夜精品美女自拍福到在线| 欧美中文字幕在线观看| www.欧美精品| 国产精品久久二区| 亚洲日本无吗高清不卡| 国产原创精品在线| heyzo高清在线| 国精一区二区| 成人美女视频在线观看18| 日韩欧美国产高清91| 久久久成人精品| 亚洲tv在线观看| 日本在线xxx| 秋霞a级毛片在线看| 欧美wwwwww| 久久99精品久久久| 欧美国产成人精品| 亚洲精品国产精品国产自| 国产成人精品a视频一区www| 日韩在线观看a| gogogo高清在线观看免费完整版| 精品国产三区在线| 麻豆国产91在线播放| 亚洲h在线观看| 九九精品在线观看| 91制片厂免费观看| 美女羞羞视频在线观看| 国产日产精品_国产精品毛片| 国产电影精品久久禁18| 51精品国自产在线| 成人中文字幕在线观看| 污色网站在线观看| 欧美视频第一| 狠狠色丁香九九婷婷综合五月| 在线精品视频一区二区三四| 热re91久久精品国99热蜜臀| 成人淫片免费视频95视频| 先锋成人av| 久久视频一区| 精品国产一区二区三区忘忧草| 国产精品久久久久久久天堂第1集| 香蕉国产在线| 夜间精品视频| 丁香五六月婷婷久久激情| 日韩暖暖在线视频| 色七七在线观看| 日韩美女在线| youjizz国产精品| 色综合久久久久久中文网| 日日摸日日碰夜夜爽无码| xxxxx性欧美特大| 蜜臀精品一区二区三区在线观看| 日韩欧美区一区二| 一区二区视频在线播放| 欧美家庭影院| 国产福利一区二区三区视频| 国产视频久久久| 激情深爱综合网| 国产精品久久久久久久久久白浆| 久久久青草青青国产亚洲免观| 欧美高清视频在线观看| 在线观看免费黄网站| 久久中文字幕视频| 国产二级片在线观看| 国产厕拍一区| 色8久久人人97超碰香蕉987| 蜜桃臀一区二区三区| www.久久.com| 亚洲精品视频在线看| 久久99精品久久久久久青青日本 | 99久久免费国产| y111111国产精品久久婷婷| 欧洲亚洲两性| 欧美日韩国产在线| 久久久久久久久久久福利| 欧美顶级大胆免费视频| 亚洲色图17p| 91精彩视频在线观看| 中文av一区二区| 欧美日韩视频免费| 老司机免费视频久久| 国产精品一区二区三区毛片淫片| 黄色欧美视频| 国产一区视频在线看| 日韩毛片在线观看| 国产中文字幕视频在线观看| 秋霞午夜一区二区三区视频| 99麻豆久久久国产精品免费 | 中文字幕不卡在线| 国产成人jvid在线播放| 在线一区二区三区精品| 亚洲美女啪啪| 亚洲天堂av网| 男人午夜天堂| 一区二区三区国产盗摄 | 亚洲视频图片小说| 91丝袜脚交足在线播放| 激情黄产视频在线免费观看| 中文成人综合网| ts人妖另类在线| 久久精品国产福利| 精品日韩中文字幕| 国产精品亲子伦对白| 久久久国产成人精品| av资源种子在线观看| 成人app下载| 好吊色欧美一区二区三区四区| 爱情电影网av一区二区| 欧美蜜桃一区二区三区| 黄色三级视频片| 日韩综合一区二区| 国产精品欧美激情在线播放| 97超碰资源站在线观看| 一区二区三区高清不卡| 午夜久久久久久久久久久| 美女久久久久| 色哟哟网站入口亚洲精品| 国内精品久久久久久野外| 国产精品久久久久三级| 久久天天东北熟女毛茸茸|