星球作业(第十一期)Android中Binder简述

Binder

什么是binder?简述下它的工作过程和使用场景。


什么是Binder?

Binder是Android中的一个类,实现了IBinder接口;
从IPC的角度来说,Binder是Android中的一种通讯方式;
从Android Framework角度来说,Binder是ServiceManager连接ManagerService和各个Manager(AMS、WMS等)的桥梁;
从Android应用层角度来说,Binder是客户端与服务端通信的媒介,bindService后服务端会给客户端返回一个用于调用服务端方法的binder对象。

总的来说,Binder是跨进程通信时的必要组件。

Binder的工作过程

星球作业(第十一期)Android中Binder简述_第1张图片

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开发艺术探索》

你可能感兴趣的:(星球作业,android,binder)