一、什么是Binder
Binder是Android系统中用于进程间通信的一种方式
因为Binder的效率很高,所以Android中虽然也有其他的IPC方式,但是大多都是采用的Binder
二、为什么Binder效率高
传统的IPC通信方式传输数据有以下过程:
1.client准备数据
2.client进程复制数据到驱动中(copy_from_usr)
3.server进程从驱动中取出数据(copy_to_usr)
而Binder传输数据则是:
0.server进程初始化Binder时打开Binder驱动,进行mmap映射一片内核空间内存
1.client准备数据
2.client通过Binder驱动直接将数据拷贝(copy_from_usr)到server映射的内核空间中去
3.client将数据头拷贝到驱动中,server从驱动中读出数据头
4.server进程可以直接在用户态读取映射内存中的数据
由此可见,传统的IPC通信方式,数据本身需要在内核与用户态之间拷贝两次,而Binder只需要在内核与用户态之间拷贝一次,所以Binder效率会更高(Binder通信中,数据头是client用来告诉server数据的大小以及地址,这个数据头是需要拷贝两次的).
三、Binder的组成结构
Binder采用了C/S架构,但由于用户层进程间内存是独立的,所以需要通过内核驱动来传输数据,就有了binder驱动,同时,为了管理当前系统中的service,就又有了servicemanager。
所以从组件的角度来看,Binder由四个部分组成:
- client:向server发送数据的进程
- server:client数据的目标进程,接收client进程数据的进程
- servicemanager:一个运行在用户态的进程,提供注册,查询服务的功能,client需要先通过servicemanager查询server进程是否注册,才 能发起传输
- binder驱动:运行与内核态的驱动,提供binder的底层支持
![Binder组成结构](https://img-blog.csdnimg.cn/20201010155700272.png#pic_center
四、Binder运行机制
service manager
(1)打开binder驱动
(2)告诉binder驱动这个进程是service manager
(3)进入一个while循环,一直轮询binder驱动,查看是否有需要处理的消息(注册service,查找service等)
(4)如果有需要处理的消息,则进行处理并发送reply给binder驱动
server端
(1)打开binder驱动
(2)向service manager发送数据,注册服务
(3)进入while循环,一直轮询binder驱动,查看是否有需要处理的消息
(4)如果有client发送数据过来,则进行处理
client端
(1)打开binder驱动
(2)向service manager发送数据,查询目标服务是否已经注册
(3)如果目标service已经注册,servicemanager会返回一个目标service的handle给client
(4)client根据handle向binder驱动发送数据给server端
可以看到service manager其实是起了一个管理service的功能,client要向一个service发送数据,则需要先向service manager查询这个service是否已经注册,如果已经注册,service manager则会返回一个handle给client,client拿着这个handle就可以向binder驱动传输数据到指定的目标service进程.
service和server
server就是提供service的进程,一个应用程序,可以注册很多service,这个应用程序就是一个server,是service的提供者。
而service则是被注册到service manager中的各种service,client可以向不同的service发送数据,server中也会有不同的函数用来处理不同的service的数据。