
关于鸿蒙系统中IPC/RPC组件的相关介绍
简介
IPC(Inter-Process Communication)与RPC(Remote Procedure Call)机制用于实现跨进程通信,不同的是前者使用Binder驱动,用于设备内的跨进程通信,而后者使用软总线驱动,用于跨设备跨进程通信。IPC和RPC通常采用客户端-服务器(Client-Server)模型,服务请求方(Client)可获取提供服务提供方(Server)的代理 (Proxy),并通过此代理读写数据来实现进程间的数据通信。通常,Server会先注册系统能力(System Ability)到系统能力管理者(System Ability Manager,缩写SAMgr)中,SAMgr负责管理这些SA并向Client提供相关的接口。Client要和某个具体的SA通信,必须先从SAMgr中获取该SA的代理,然后使用代理和SA通信。下文使用Proxy表示服务请求方,Stub表示服务提供方。
系统架构
图 1 IPC通信机制架构图
目录
约束
目前暂不支持的场景:
跨设备RPC调用
编译构建
Native侧编译依赖
sdk依赖:
此外, IPC/RPC依赖的refbase实现在公共基础库实现//utils下,请增加对utils的源码依赖:
说明
Native侧和Java侧实现跨进程通信的步骤基本相同。
-
定义接口类
接口类继承IRemoteBroker,定义描述符、业务函数和消息码。
-
实现服务提供端(Stub)
Stub继承IRemoteStub(Native)或者RemoteObject(Java),除了接口类中未实现方法外,还需要实现AsObject方法及OnRemoteRequest方法。
-
实现服务请求端(Proxy)
Proxy继承IRemoteProxy(Native)或者RemoteProxy(Java),封装业务函数,调用SendRequest将请求发送到Stub。
-
注册SA
服务提供方所在进程启动后,申请SA的唯一标识,将Stub注册到SAMgr。
-
获取SA
-
通过SA的标识和设备标识,从SAMgr获取Proxy,通过Proxy实现与Stub的跨进程通信。
接口说明
表 1 Native侧IPC接口
类/接口 | 方法 | 功能说明 |
---|---|---|
IRemoteBroker | sptr<IRemoteObject> AsObject() | 返回通信对象。派生类需要实现,Stub端返回RemoteObject对象本身,Proxy端返回代理对象。 |
IRemoteStub | virtual int OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) | 请求处理方法,派生类需要重写,处理Proxy的请求并返回结果。 |
IRemoteProxy | 业务Proxy类派生自IRemoteProxy类。 |
使用说明
Native侧使用说明
定义IPC接口ITestAbility
IPC接口继承IPC基类接口IRemoteBroker,接口里定义描述符、业务函数和消息码,其中业务函数在Proxy端和Stub端都需要实现。
定义和实现服务端TestAbilityStub
该类是和IPC框架相关的实现,需要继承 IRemoteStub<ITestAbility>。Stub端作为接收请求的一端,需重写OnRemoteRequest方法用于接收客户端调用。
定义服务端业务函数具体实现类TestAbility
定义和实现客户端TestAbilityProxy
该类是Proxy端实现,继承IRemoteProxy<ITestAbility>,调用SendRequest接口向Stub端发送请求,对外暴露服务端提供的能力。
同步调用与异步调用
MessageOption作为发送接口(原型如下)的入参,可设定同步(TF_SYNC)、异步(TF_ASYNC)、接收FD(TF_ACCEPT_FDS),默认情况下设定为同步,其余可通过MessageOption构造方法或void SetFlags(int flags)设定。
SA注册与启动
SA需要将自己的TestAbilityStub实例通过AddSystemAbility接口注册到SystemAbilityManager,设备内与分布式的注册参数不同。
SA获取与调用
通过SystemAbilityManager的GetSystemAbility方法可获取到对应SA的代理IRemoteObject,然后构造TestAbilityProxy即可。
相关仓
分布式软总线子系统
communication_ipc
utils
utils_native
distributedschedule_samgr
