# communication_ipc **Repository Path**: liangshenglin1/communication_ipc ## Basic Information - **Project Name**: communication_ipc - **Description**: Inter-process communication (IPC) and Remote Procedure Call (RPC) | 跨进程通信与跨设备的远程过程调用 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 684 - **Created**: 2021-12-20 - **Last Updated**: 2021-12-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # IPC/RPC组件 - [简介](#section11660541593) - [系统架构](#section1950291414611) - [目录](#section161941989596) - [约束](#section119744591305) - [编译构建](#section137768191623) - [说明](#section1312121216216) - [接口说明](#section1551164914237) - [使用说明](#section129654513264) - [相关仓](#section1371113476307) ## 简介 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通信机制架构图  ## 目录 ``` /foundation/communication/ipc ├── interfaces # 对外接口存放目录 │ └── innerkits # 对内部子系统暴露的头文件存放目录 │ ├── ipc_core # ipc 接口存放目录 │ └── libdbinder # dbinder 接口存放目录 ├── ipc # ipc 框架代码 │ ├── native # ipc native 实现存放目录 │ ├── src # ipc native 源代码存放目录 │ └── test # ipc native 单元测试用例存放目录 │ └── test # ipc native 模块测试用例存放目录 ├── service # dbinder 实现存放目录 │ └── dbinder # dbinder 源代码存放目录 ``` ## 约束 目前暂不支持的场景: 跨设备RPC调用 ## 编译构建 **Native侧编译依赖** sdk依赖: ``` external_deps = [ "ipc:ipc_core", ] ``` 此外, IPC/RPC依赖的refbase实现在公共基础库实现//utils下,请增加对utils的源码依赖: ``` deps = [ "//utils/native/base:utils", ] ``` ## 说明 Native侧和Java侧实现跨进程通信的步骤基本相同。 1. 定义接口类 接口类继承IRemoteBroker,定义描述符、业务函数和消息码。 2. 实现服务提供端\(Stub\) Stub继承IRemoteStub\(Native\)或者RemoteObject\(Java\),除了接口类中未实现方法外,还需要实现AsObject方法及OnRemoteRequest方法。 3. 实现服务请求端\(Proxy\) Proxy继承IRemoteProxy\(Native\)或者RemoteProxy\(Java\),封装业务函数,调用SendRequest将请求发送到Stub。 4. 注册SA 服务提供方所在进程启动后,申请SA的唯一标识,将Stub注册到SAMgr。 5. 获取SA 6. 通过SA的标识和设备标识,从SAMgr获取Proxy,通过Proxy实现与Stub的跨进程通信。 ### 接口说明 **表 1** Native侧IPC接口
virtual int OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) |
||