Binder通信,Binder是实现进程间通信(IPC)的重要机制,它是基础框架的一个核心组件。
Binder通信
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
有哪些进程间通信的手段?例如,ExtensionAbility如何与主进程通信?
555浏览 • 1回复 待解决
IPC跨进程通信中是否支持异步返回数据
951浏览 • 1回复 待解决
网页的代码和主进程的通信是否是跨进程
529浏览 • 1回复 待解决
HarmornyOS的网络管理模块,可以实现本机不同进程间的通信,该通信支持流式套接字技术。
6303浏览 • 1回复 待解决
WebView之通信,什么是WebView,为什么要通信,如何实现通信?
536浏览 • 1回复 待解决
js Fa如何实现线程间通信?
4122浏览 • 1回复 待解决
公共事件实现跨进程通信
496浏览 • 1回复 待解决
Binder链接池实现有哪些方法?
365浏览 • 1回复 待解决
线程间通信方式指导 ,有没有别的线程间通信方式?
589浏览 • 1回复 待解决
一个应用内的所有ArkWeb是共用同一个render进程吗?
337浏览 • 1回复 待解决
OpenHarmony L1 Ipc samgr_lite通信报错异常
6438浏览 • 2回复 待解决
鸿蒙NAPI机制具体的执行过程,如何实现js和c++通信的
11311浏览 • 1回复 待解决
JS UI框架中FA和PA的page之间如何通信?
1593浏览 • 1回复 待解决
kubernetes 集群使用 flannel 配置网络后,不通物理节点的 Pod 间通信问题
2107浏览 • 1回复 待解决
ArkTS的线程机制是怎么样的?每个线程是一个单独的JS引擎吗?
727浏览 • 1回复 待解决
liteos-m怎么实现进程间的互斥?
4578浏览 • 1回复 已解决
arkts父子组件组件怎么通信传值啊?
3346浏览 • 1回复 待解决
如何实现一个折叠组件
364浏览 • 1回复 待解决
socket通信示例,创建tcp server和tcp client进行通信
250浏览 • 1回复 待解决
是否可以将组件作为一个参数传给另一个组件?
547浏览 • 1回复 待解决
多个UIAbility是运行在一个进程还是多个进程中?三方应用是否支持应用运行在多个进程下?
682浏览 • 1回复 待解决
如何实现一个组件不停地旋转
734浏览 • 1回复 待解决
鸿蒙是否进行异步通信?
2584浏览 • 1回复 待解决
fegin 和 docker 通信问题
1564浏览 • 1回复 待解决
怎么判断一个类型是stirng
297浏览 • 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