Binder通信,Binder是实现进程间通信(IPC)的重要机制,它是基础框架的一个核心组件。
Binder通信
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
有哪些进程间通信的手段?例如,ExtensionAbility如何与主进程通信?
1731浏览 • 1回复 待解决
HarmonyOS 如何实现组件间通信
259浏览 • 1回复 待解决
HarmonyOS组件通信机制
280浏览 • 1回复 待解决
IPC跨进程通信中是否支持异步返回数据
2054浏览 • 1回复 待解决
如何通过自定义公共事件实现进程间的通信?
330浏览 • 1回复 待解决
HarmornyOS的网络管理模块,可以实现本机不同进程间的通信,该通信支持流式套接字技术。
7667浏览 • 1回复 待解决
网页的代码和主进程的通信是否是跨进程
2091浏览 • 1回复 待解决
Binder链接池实现有哪些方法?
671浏览 • 1回复 待解决
#鸿蒙学习大百科#进程之间是通过什么机制进行通信的?
120浏览 • 1回复 待解决
WebView之通信,什么是WebView,为什么要通信,如何实现通信?
1292浏览 • 1回复 待解决
HarmonyOS 页面间,跨不同的har包之间的事件通信机制是什么?
68浏览 • 1回复 待解决
公共事件实现跨进程通信
745浏览 • 1回复 待解决
js Fa如何实现线程间通信?
5402浏览 • 1回复 待解决
HarmonyOS 请提供一个经典蓝牙的串口通信demo
341浏览 • 1回复 待解决
线程间通信方式指导 ,有没有别的线程间通信方式?
1723浏览 • 1回复 待解决
IPC与RPC通信有什么约束限制?
228浏览 • 1回复 待解决
鸿蒙NAPI机制具体的执行过程,如何实现js和c++通信的
13194浏览 • 1回复 待解决
一个应用内的所有ArkWeb是共用同一个render进程吗?
728浏览 • 1回复 待解决
OpenHarmony L1 Ipc samgr_lite通信报错异常
7832浏览 • 2回复 待解决
需要web组件JSBridge通信的demo
105浏览 • 1回复 待解决
同一进程,不同线程之间如何进行通信?
348浏览 • 1回复 待解决
实现一个虚线边框的组件。
424浏览 • 1回复 待解决
JS UI框架中FA和PA的page之间如何通信?
2653浏览 • 1回复 待解决
ArkTS的线程机制是怎么样的?每个线程是一个单独的JS引擎吗?
1829浏览 • 1回复 待解决
liteos-m怎么实现进程间的互斥?
6068浏览 • 1回复 已解决
Binder是一个比较复杂话题,它的底部实现比较复杂,本文我们只简单对binder通信进行讲解。Binder是实现进程间通信(IPC)的重要机制,它是基础框架的一个核心组件。这里我们选择用IDL来分析Binder的工作机制。为了分析IDL工作机制,我们需要新建IDL文件,SDK会自动为生产IDL所对应的Binder类,然后我们可以分析下Binder工作过程。
使用的核心API
RPC通信
核心代码解释
首先创建.idl文件,例如此处构建一个名为IIdlTestService.idl的文件。
在idl的可执行文件所在文件夹下执行命令:”idl -gen-ts -d dir -c dir/IIdlTestService.idl”。
执行命令后,在指定目录文件中可以看到根据 IIdlTestService.idl系统为我们生成IIdlTestService、IdlTestServiceProxy与IdlTestServiceStub三个类。IIdlTestService这个类是个接口类,它内部结构比较简单,其中声明四个方法,这个四个方法明显是我们idl文件中定义。接着我们看IdlTestServiceStub与IdlTestServiceProxy类,这个stub明显就是binder类,proxy是Stub的内部代理类。
下面详细介绍针对Stub类和Stub的内部代理类Proxy的方法的含义。
IdlTestServiceStub继承了RemoteObject接口,该接口提供许多方法:
onRemoteMessageRequest
这个方法运行在服务端的binder线程池中,当客户端发起跨进程请求时,远程请求会通过系统层封装后交给此方法处理。服务端是通过code可以确定客户端所请求的目标方法是什么,接着从data取出目标方法所需的参数,然后执行目标方法。当目标方法执行完毕后,就行replay写入返回值, onRemoteMessageRequest执行方法就是这样,需要注意是,如果此方法返回为false,那么客户端的请求会失败,因此我们可以利用这个特性做权限验证。
l asObject:此方法用户返回当前Remote对象
l modifLocalInterface:此方法用于把接口描述符和IRemoteBroker对象进行绑定
l getLocalInterface:此方法用于获取与接口描述绑定的IRemoteBroker。注意需要先绑定对象描述符,才能获取绑定的IRemoteBroker对象。
IdlTestServiceProxy实现IIdlTestService接口,我们只讲解其中一个接口。
Proxy#testIntTransaction这个方法运行在客户端,当客户端调用此方法时,它的内部实现是这样的,首先创建该方法所需要的输入型messageSequence对象_data,输出型messageSequence对象_replay。然后把该方法参数写入_data对象中,接着会调用sendMessageRequest方法发起RPC请求,然后服务端的onRemoteMessageRequest方法就会被调用,直到RPC过程返回后,当前程序继续执行,并从_replay中取出RPC过程的返回结果。
通过上面分析,可以简单了解binder工作机制,下面我们给出一个binder工作机制图。
讲解完binder工作机制,接下来创建Service并实现IdlTestServiceStub接口类,具体代码实现如下。
在服务实现接口后,需要向客户端公开该接口,以便客户端进程绑定。如果开发者的服务要公开该接口,请扩展Ability并实现onConnect()从而返回IRemoteObject,以便客户端能与服务进程交互。服务端向客户端公开IRemoteAbility接口的代码示例如下:
接下来就是客户端调用IPC接口,客户端通过调用connectServiceExtensionAbility()以连接服务时,客户端的onAbilityConnectDone中的onConnect回调会接收服务的onConnect()方法返回的IRemoteObject实例。由于客户端和服务在不同应用内,所以客户端应用的目录内必须包含.idl文件(SDK工具会自动生成Proxy代理类)的副本。
适配的版本信息
IDE:DevEco Studio 4.0.1.501
SDK:HarmoneyOS 4.0.0.8