Binder机制
Binder是Android独有的一种进程间通信的机制,区别于Java所原有的其它进程间通信的方式(管道、Socket、共享内存等)。
为什么Android要使用Binder,性能上Binder只需要对数据拷贝一次,管道和Socket需要对数据拷贝两次,共享内存无需拷贝;安全上Binder有对双方做安全校验,Socket等没有安全校验,共享内存会有并发问题。
Binder使用Client-Server通信方式。Binder框架定义了四个角色:Server,Client,ServiceManager以及Binder驱动。其中Server,Client,ServiceManager运行于用户空间,驱动运行于内核空间。Binder驱动程序提供设备文件/dev/binder与用户空间交互,Client、Server和Service Manager通过open和ioctl文件操作函数与Binder驱动程序进行通信。
Server:服务端,服务端先在ServiceManager中注册已有某项服务,持有的Binder对象是实体操作对象
Client:用户端,用户端通过向ServiceManager请求获得某项服务的Binder对象,通过Binder对象来完成跨进程通信,持有的Binder对象为代理,通过代理去调用到Server中真正的实体对象
ServiceManager:服务管理,通过调用内核空间的Binder驱动的相关能力实现跨进程通信,与Binder驱动之间通过open/ioctl等指令进行通信
Binder驱动:系统提供的/dev/binder为设备文件,通过它可以完成进程间通信
Binder是如何实现只需要一次数据拷贝的,Binder开始工作时会在内核创建一块内核缓冲区,将内核缓冲区和接收进程的数据接收的内存构建了内存映射,所以使用Binder进行通信时只需要发送方调用copy_from_user()将数据从用户空间拷贝到内核空间,因为已经构建了内存映射,所以此时接收方就能看到传递过来的数据。而一般的进程间通讯还需要一步从内核空间拷贝到接收方用户空间的过程,由此Binder是只进行了一次数据拷贝,而一般跨进程通信需要两次。
一般的进程间通信:
Binder的进程间通信:
参考:https://blog.csdn.net/AndroidStudyDay/article/details/93749470