Binder

简介: Binder

1.Binder是什么


Binder是一种进程间通信的机制,在Android系统中,进程间的通信,它们的底层基本都是用到了Binder的IPC机制,比如我们进程1的Activity要使用进程2中Service的某个能力,则需要用到Binder机制来进行进程间的通信,包括平时我们使用的系统提供的一些Service如AMS、IMS等等,都是用到了Binder在底层作为支撑。


2.Binder的优势


我们知道在系统中其实有很多种IPC的方式,如Socket、消息队列和内存共享等,Android还提供了Binder机制,相信会有其独特的优点:


以上便完成了一次进程间的通信,但是存在下面的不足:


  • 性能:在移动设备上,由于性能受到各方面的限制,例如电量,所以在使用进程间通信时,需要对性能这块有很大的要求。Socket、消息队列这些,在进程间通信时,数据拷贝需要两次,而内存共享无需拷贝,但实现起来比较复杂。Binder在数据上拷贝只需一次,它通过内存映射的机制实现了一次数据拷贝。


  • 安全:传统的IPC,UID/PID只能由用户在数据包填入,这样会导致接收方无法获取到可靠UID/PID,而且还会存在被恶意程序利用的可能。Binder机制中可靠的身份标志只能在IPC机制的内核中添加的,它从协议本身就支持对通信双方进行身份校验,大大提高了安全性。


  • 稳定:Binder基于C/S架构,使用者与提供服务者相互独立,整体清晰,从而提高了整体的稳定性。


  • Binder通信原理


1.一般的IPC原理


发送:首先会将要发送的数据放到内存缓存区,通过系统调用进入内核态,内核空间会开辟一块缓存区,通过copyfromuser()将用户空间的数据拷贝到内核空间的缓存区。


  • 接收:接收方的用户进程里,开辟一块内存缓存区,内核调用copytouser()将数据从内核缓存区拷贝到接收进程开辟的内存缓存区。
  • 在性能上,需要两次的数据拷贝:用户->内核、内核->用户
  • 由于接收的用户进程无法知道接收的数据多大,所以它只能开辟尽可能大的内存缓存区来接收数据,这样很可能会造成空间的浪费。


2.动态内核可加载模块


通过Binder进行进程间通信依赖的是Binder驱动,但是Binder驱动不是Linux内核的一部分,需要通过动态内核可加载模块的机制,将Binder驱动动态添加到内核空间,来实现Binder通信。


3.内存映射


内存映射是通过mmap()来实现的,内存映射是将用户的内存空间映射到内核空间,当内存空间里有进行修改时,则内核空间映射到内存区域也能直接感知到,当内核空间修改时,用户空间也能够直接感知到。内存映射可以减少数据拷贝到次数,实现用户空间与内核空间的相互交互。


内存映射在一次Binder进程间通信的应用是这样的:


  • Binder驱动在内核空间创建一个接收缓存区
  • 在内核空间创建一个内核缓存区。然后建立内核接收缓存区与内核缓存区的映射、内核接收缓存区与接收用户进程的空间的映射。
  • 发送方调用compyfromuser(),把数据拷贝到内核缓存区,由于它们彼此都两两存在映射关系,则接收进程也就能够接收到发送进程要发送的数据。



4.运行机制


模型相关角色


作用    备注

Client进程     使用服务的进程

Server进程    提供服务的进程

ServerManager进程    管理Service的注册和查询

Binder驱动    一种虚拟设备驱动,是连接Server进程、Client进程、ServerManager的桥梁。作用为:


1.通过内存映射来传递进程间通信的数据 2.实现线程控制,采用Binder的线程池,并由Binder驱动自身进行管理

跨进程通信的基本原理:核心原理:内存映射 mmap


工作流程:


1.Binder驱动创建一块接收缓冲区


2.在内核空间中确定一块用于接收数据的Buffer,然后将用户空间的Buffer与内核空间的Buffer映射到实际的物理内存上,实现用户空间Buffer与内核空间Buffer的同步化


3.由于内核缓冲区&接收进程的用户地址空间存在映射关系,故相当于也发送到了接收进程的用户地址空间,实现了跨进程通信


  • 四大角色

Client:使用服务的进程,通过名字向ServiceManager获取对应的Binder


Server:提供服务的进程,将创建的Binder与它的字符形式的名字以数据包的形式通过Binder驱动向ServiceManager注册服务,供其他进程远程调用。


ServiceManager:一个独立的进程,可将字符形式的Binder名字转化成对应的Binder实例,它会维护Binder名字与Binder实体的表。注册与获取服务,都是使用Binder方式的进程间通信,而ServiceManager提供的Binder与其他的不一样,首先进程使用BINDERSETCONTEXT_MGR命令,将其注册成ServiceManager,同时Binder驱动会为它创建一个Binder实体;在其他进程中获取它时都是通过0号引用进行获取,从而与ServiceManager进行通信。


Binder驱动:提供进程之间通信的建立、Binder传递等一些底层操作的支持。

  • 注册服务:Server通过Binder驱动向ServiceManager注册Binder,驱动为这个Binder创建一个在内核中的节点以及将其引用和名字打包传给ServiceManager,ServiceManager就可以把它们填到表中。
  • 使用服务:Client通过Binder驱动,用Binder名字去ServiceManager中获取对应的Binder引用,通过该引用,就可以使用Server提供的服务。




5.对象的传递


我们可能还有一个疑问:俩个进程间是没能够直接使用彼此的对象,Binder中是如何实现的呢? 其实Client获取Server的object时,Binder驱动并不会真正地把object传给Client,而是返回一个具有与object一样方法的object代理,它并不具备与object一样真正的能力。当Client调用object代理的A方法时,驱动会查到它对应的是object,就会调用Server中object的A方法,同时将参数也会打包发过去,等待Server中的object的A方法处理好后把结果进行返回,这时Binder驱动会将结果转发给Client,需要注意的是,这一个过程是一个同步的过程,当Server在处理时,Clinet会blok住,所以最好是放在工作线程去调用远程的方法。


申请了一个内部类Stub继承自Binder,当客户端和服务端都位于同一个进程时,方法调用不会走跨进程的transact过程,而当两者位于不同进程是,方法调用需要走transct过程。这个逻辑由Stub的内部代理类Proxy来完成


 


目录
相关文章
|
机器学习/深度学习 Java Linux
深入理解Binder
深入理解Binder 一句话概括进程通信:进程间的数据传递。 Binder是Anroid系统里最重要的进程通信方式,很多文章会直接用代码、原理类的文字进行描述,对于接触Android与Linux不是特别深的人来说,特别晦涩难懂,经常是看了这忘了那里,其实探索Binder通信的一条核心就是:Client如何找Server,将请求发送给Server,Server再将结果返回给Client。
1884 0
|
7月前
|
Java 开发工具 Android开发
binder hwbinder vndbinder
binder hwbinder vndbinder
54 0
|
Android开发
【Android Binder 系统】一、Binder 系统核心 ( IPC 进程间通信 | RPC 远程调用 )
【Android Binder 系统】一、Binder 系统核心 ( IPC 进程间通信 | RPC 远程调用 )
206 0
【Android Binder 系统】一、Binder 系统核心 ( IPC 进程间通信 | RPC 远程调用 )
|
索引
Binder交互浅析
Binder交互浅析
115 0
【Binder 机制】Native 层 Binder 机制分析 ( binder_loop | svcmgr_handler | binder.c | binder_parse )
【Binder 机制】Native 层 Binder 机制分析 ( binder_loop | svcmgr_handler | binder.c | binder_parse )
173 0
|
Android开发
【Binder 机制】Native 层 Binder 机制分析 ( service_manager.c | 开启 Binder | 注册 Binder 进程上下文 | 开启 Binder 循环 )(二)
【Binder 机制】Native 层 Binder 机制分析 ( service_manager.c | 开启 Binder | 注册 Binder 进程上下文 | 开启 Binder 循环 )(二)
254 0
|
Android开发
【Binder 机制】Native 层 Binder 机制分析 ( service_manager.c | 开启 Binder | 注册 Binder 进程上下文 | 开启 Binder 循环 )(一)
【Binder 机制】Native 层 Binder 机制分析 ( service_manager.c | 开启 Binder | 注册 Binder 进程上下文 | 开启 Binder 循环 )(一)
235 0
【Binder 机制】Native 层 Binder 机制分析 ( 查找 Binder 服务 | svcmgr_handler | do_find_service )
【Binder 机制】Native 层 Binder 机制分析 ( 查找 Binder 服务 | svcmgr_handler | do_find_service )
139 0
|
Java 网络协议 安全
彻底弄懂binder与aidl
aidl与binder机制 为什么需要binder 没有用到binder之前,我们每个app生活在分配给自己的虚拟机和内存空间中,这样保证了app应用的安全,到很多时候我们需要用到跨进程通信(IPC),这时binder就为此而生。
2293 0
|
Android开发 数据格式 Java
Android--进程间通信(Binder)
Android系统提供了一些通用服务,比如音乐打电话发短信,WIFI,定位,输入法,传感器等。应用程序与这些通用服务运行在不同的进程中,如果应用程序想要与这些通用服务交互就要涉及到进程间通信,Binder就是为了Android进程间通信而设计的。
1435 0