Binder
什么是binder?简述下它的工作过程和使用场景。
什么是Binder?
Binder是Android中的一个类,实现了IBinder接口;
从IPC的角度来说,Binder是Android中的一种通讯方式;
从Android Framework角度来说,Binder是ServiceManager连接ManagerService和各个Manager(AMS、WMS等)的桥梁;
从Android应用层角度来说,Binder是客户端与服务端通信的媒介,bindService后服务端会给客户端返回一个用于调用服务端方法的binder对象。
总的来说,Binder是跨进程通信时的必要组件。
Binder的工作过程
1.用户态和内核态
内核态(Kernel Mode):运行操作系统程序,操作硬件
用户态(User Mode):运行用户程序
对于跨进程操作,我们需要先通过ServiceManager获取ManagerService的binder对象,例如:
ServiceManager.getService(Context.STATUS_BAR_SERVICE)
这个获取的流程就如上图所示,1服务端注册在ServiceManager中,2客户端获取到该注册的对象。这里的客户端、服务端、ServiceManager都属于用户态,彼此之间运行在不同的进程,无法直接进行通信。
Binder则运行在内核态,有自己的线程池,且用户程序可通过固定api进行操作。
2.注册与获取
上图中,服务端通过ServiceManager注册服务,向Binder驱动的全局链表中插入服务端信息,然后向ServiceManager中缓存注册的服务。
客户端通过ServiceManager获取服务端binder对象时,通过ServiceManager获取;ServiceManager会从缓存的服务信息中拿到服务对象。
3.方法调用
客户端通过获取到的binder对象向服务端发送请求。客户端通过上图中蓝色的调用链,将数据copy到内核空间,客户端进入等待状态;Binder驱动向服务端的todo队列中插入一条事务,等待处理完成后将结果copy回来,唤醒客户端进程。
上述过程中进行了两次copy过程,但实际的copy只有一次,即客户端将数据copy至内核时。Binder通过共享内存的方式,客户端与服务端操作同一块内存区域。
Binder的使用场景
AIDL
Messenger
ContentProvider
参考
1.《Android开发艺术探索》