Binder

  Binder是Android系统提供的一种IPC(进程间通信)机制。除了Binder,Android还存在Pipe和socket等其他IPC机制。Android系统基本上可以看作是一个基于Binder通信的C/S架构。
  Binder工作在Linux层面,属于一个驱动,只是这个驱动不需要硬件,或者说其操作的硬件是基于一小段内存。从线程的角度来讲,Binder驱动代码运行在内核态,客户端程序调用Binder是通过系统调用完成的。

Binder框架

  Binder是一种架构,这种架构提供了服务端接口、Binder驱动、客户端接口三个模块,如图:

Binder框架

  • 服务端:一个Binder服务端实际上就是一个Binder类的对象,该对象一旦创建,内部就启动一个隐藏线程。该线程接下来会接收Binder驱动发送的消息,收到消息后,会执行到Binder服务中的onTransact()函数,并按照该函数的参数执行不同的服务代码。因此,要实现一个Binder服务,就必须重载onTransact()方法。
      重载onTransact()函数的主要内容是把onTransact()函数的参数转换为服务函数的参数,而onTransact()函数的参数来源是客户端调用transact()函数时输入的,因此,如果transact()有固定格式的输入,那么onTransact()就会有固定格式的输出。
  • Binder驱动:任意一个服务端Binder对象被创建时,同时会在Binder驱动中创建一个mRemote对象,该对象的类型也是Binder类。客户端要访问远程服务时,都是通过mRemote对象。
  • 客户端:客户端想要访问远程服务,必须获取远程服务在Binder对象中对应的mRemote引用。获得该mRemote对象后,就可以调用其transact()方法,而在Binder驱动中,mRenote对象也重载了transact()方法,重载的内容主要包括以下几项:
      1. 以线程间消息通信的模式,向服务端发送客户端传递过来的参数;
      2. 挂起当前线程,当前线程正是客户端线程,并等待服务端线程执行完制定服务函数后通知(notify);
      3. 接收到服务端线程的通知,然后继续执行客户端线程,并返回到客户端代码区;
      客户端并不是直接调用远程服务对应的Binder,而是通过Binder驱动进行了中转。即存在两个Binder对象,一个是服务端的Binder对象,另一个则是Binder驱动中的Binder对象,所不同的是Binder驱动中的对象不会再额外产生一个线程。

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-----------------------last line for now-----------------------