理解Android系统Binder机制

2019-12-10 18:02:32于海丽

5.代理对象将请求结果进一步返回给客户端进程。

通过以上5个步骤,就完成了一次Binder通信。

三、Binder机制的组成

Binder机制由三部分组成,即:

1.Client;

2.Server;

3.ServiceManager。

三部分组件之间的关系:

1.Client、Server、ServiceManager均在用户空间中实现,而Binder驱动程序则是在内核空间中实现的;

2.在Binder通信中,Server进程先注册一些Service到ServiceManager中,ServiceManager负责管理这些Service并向Client提供相关的接口;

3.Client进程要和某一个具体的Service通信,必须先从ServiceManager中获取该Service的相关信息,Client根据得到的Service信息与Service所在的Server进程建立通信,之后Clent就可以与Service进行交互了;

4.Binder驱动程序提供设备文件/dev/binder与用户空间进行交互,Client、Server和ServiceManager通过open和ioctl文件操作函数与Binder驱动程序进行通信;

5.Client、Server、ServiceManager三者之间的交互都是基于Binder通信的,所以通过任意两者这件的关系,都可以解释Binder的机制。

四、Binder驱动的实现简介

1.Binder采用了AIDL来描述进程间的接口;

2.Binder是一个特殊的字符型设备,设备节点为dev/binder。

3.Binder驱动程序由以下两个文件实现:

  ①kernel/drivers/staging/binder.h

  ②kernel/drivers/staging/binder.c

4.在Binder驱动的实现过程中,以下函数起着关键作用:

  ①使用binder_ioctl()函数与用户空间交换数据;

  ②BINDER_WRITE_READ用来读写数据,数据包中的cmd域用于区分不同的请求;

  ③使用binder_thread_write()函数来发送请求或返回结果,在binder_thread_write()函数中,通过调用binder_transaction()函数来转发请求并返回结果.当收到请求时,binder_transaction()函数会通过对象的handle找到对象所在的进程,如果handle结果为空,则认为此对象是context_mgr,然后把请求发给context_mgr所在的进程,并将请求中所有的Binder对象放到RB树中,最后把请求放到目标进程的队列中以等待目标进程的读取。;