23.观摩Session模式与Proxy-Stub模式的搭配

本文深入探讨了Session设计模式在CameraService和JNIEnv对象中的实现,阐述了其在服务通信中的核心作用。同时,复习了Proxy-Stub模式,并通过cameraService实例详细解释了该模式的应用。此外,还分析了SurfaceFlinger服务如何利用Session和Proxy-Stub模式进行高效操作。

0. 总览

在这里插入图片描述

1. Session设计模式:以CameraService服务为例

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2. Session设计模式:以VM的JNIEnv对象为例

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3. Session设计模式:典型架构

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4. 复习:Proxy-Stub模式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5. Proxy-Stub设计模式:以cameraService为例

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6. SurfaceFlinger服务的Session模式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

7. SurfaceFlinger服务的Proxy-Stub模式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

<think>好的,我现在需要回答用户关于OpenHarmony中Proxy-Stub模式的实现和使用的问题。首先,我需要回顾一下用户提供的引用资料,看看有哪些关键点可以提取。 用户引用了四个资料,其中引用[1]详细描述了如何实现Stub感知Proxy消亡的机制,特别是通过匿名Stub和反向通知的方法。引用[2]提到软总线使用了Proxy-Stub架构,并且有两个接口类ISoftBusServer和ISoftBusClient,这可能涉及到多接口的情况。引用[3]讨论了远端状态订阅的实现,其中涉及如何感知对方进程的消亡,这可能Proxy-Stub的生命周期管理相关。引用[4]提供了代码下载链接,但暂时可能用不上具体代码。 接下来,我需要组织回答的结构。用户要求结构清晰,分步骤说明实现和使用,所以需要先解释Proxy-Stub的基本概念,然后具体到OpenHarmony中的实现机制,包括接口定义、跨进程通信、IDL工具的使用等。然后给出使用步骤,比如接口定义、生成代码、实现类等。同时要结合引用中的例子,比如匿名Stub用于反向通知,这样能增强回答的真实性。 需要注意用户提到的系统级指令,比如行内公式用$...$,独立公式用$$...$$,但这个问题可能不涉及数学公式,所以这部分可能不需要。但需要确保LaTeX语法正确,不过这里可能更多是代码和架构描述。另外,需要生成相关问题,这部分最后处理。 在回答中,需要引用用户提供的资料,比如在讲解反向消亡通知时,引用[1]中的例子,说明如何利用匿名Stub实现反向感知。同时,引用[2]提到的软总线双接口类的情况,说明Proxy-Stub可以支持多接口。引用[3]的远端状态订阅实例可以结合生命周期管理部分。 还需要注意用户之前的提问,确保回答连贯。用户可能之前已经了解过Proxy-Stub的基本概念,现在想深入实现细节和使用方法,因此需要详细说明实现机制和具体步骤,可能包括代码示例,比如IDL文件的编写,生成的ProxyStub类的使用,以及如何注册服务等。 另外,用户的问题中提到了实现用法,所以需要分两部分:实现机制和使用方法。实现机制包括通信流程、序列化、跨进程调用等;使用方法包括定义接口、生成代码、实现类、注册服务、调用方法等步骤。 最后,生成相关问题需要考虑用户可能的后续疑问,比如性能优化、其他IPC方式的对比、实际应用场景、错误处理等。</think>### OpenHarmony中Proxy-Stub模式的实现用法 #### 一、Proxy-Stub模式基础原理 Proxy-Stub是分布式系统中**跨进程通信(IPC)**的核心架构模式,通过接口定义语言(IDL)实现**客户端服务端的解耦**。Proxy作为客户端代理对象,Stub作为服务端存根对象,二者通过**序列化/反序列化**完成跨进程数据传递[^2]。 #### 二、OpenHarmony中的实现机制 1. **接口定义规范** 使用`.idl`文件定义服务接口,例如定义计算服务接口: ```idl interface ICalculator { int Add(int a, int b); } ``` 通过IDL工具生成`ICalculatorProxy`和`ICalculatorStub`基类[^4]。 2. **通信流程实现** ```mermaid graph LR Client-->Proxy-->序列化-->Binder驱动 Binder驱动-->反序列化-->Stub-->Service ``` 3. **反向消亡感知** 通过创建**匿名Stub**实现双向状态感知(如引用[1]所述): - 进程B创建未注册的`CallbackStub` - 通过`SendRequest`将Stub传给进程A - 进程A持有`CallbackProxy`监测进程B状态 #### 三、具体使用步骤 1. **定义接口文件** 创建`ICalculator.idl`并声明接口方法。 2. **生成代理存根代码** 使用IDL编译器生成: ```bash idl -gen-cpp -d ./output ICalculator.idl ``` 生成`icalculator_proxy.cpp`和`icalculator_stub.cpp`。 3. **实现服务端Stub** 继承生成的Stub类实现具体逻辑: ```cpp class CalculatorService : public ICalculatorStub { public: int Add(int a, int b) override { return a + b; } }; ``` 4. **注册服务** 在SAMgr(系统能力管理)注册服务: ```cpp sptr<ISystemAbilityManager> samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); samgr->AddSystemAbility(SA_ID_CALCULATOR, new CalculatorService()); ``` 5. **客户端调用** 通过Proxy对象进行远程调用: ```cpp sptr<ICalculator> calculator = iface_cast<ICalculator>(samgr->GetSystemAbility(SA_ID_CALCULATOR)); int result = calculator->Add(3, 5); // 返回8 ``` #### 四、关键优化点 1. **异步通信支持** 通过`MessageParcel`实现非阻塞调用 2. **数据安全检查** 使用`bounds_checking_function`进行缓冲区验证[^4] 3. **多接口支持** 如软总线同时实现`ISoftBusServer`和`ISoftBusClient`双接口[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2021、小林子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值