Android中的Binder机制

Binder是Android中的一个类,它实现了IBinder接口。从IPC角度看Binder是Android中的一种跨进程通信方式。

Binder客户端:想要使用服务的进程

Binder服务端:实际提供服务的进程

Binder原理介绍

Binder的工作机制:

Android中的Binder机制 - 阿里云

当客户端通过binder.asInterface对象调用服务端的方法的时候,

1、首先会创建该方法所需要的输入型Parcel对象_data、输出型Parcel对象_reply和返回值对象;

2、然后把该方法的参数信息写入_data中;

3、接着调用transact方法来发RPC(远程过程调用)请求,同时当前线程挂起;

4、然后服务端的onTransact方法会被调用直到RPC过程返回后,当前线程继续执行,并从reply中取出RPC过程的返回结果;

5、最后返回reply中的数据。

onTransact执行过程:

服务端通过code确定客户端请求的目标方法是什么,接着从data中取出目标方法所需的参数,然后执行目标方法。当目标方法执行完毕后,就向reply中写入返回值。如果返回false,那么客户端请求失败,因此我们可以利用这个特性来做权限验证。

注意:

1、当客户端发起远程请求的时候,由于当前线程会被挂起直至服务端进程返回数据,所以如果一个远方方法是很耗时的,那么不能在UI线程中发起此远程请求;

2、由于服务端的Binder方法运行在Binder的线程池中,所以Binder方法不管是否耗时都应该采用同步的方式去实现,因为它已经运行在一个线程中了。

另外:

当客户端与服务端在一个进程的时候binder.asInterface返回的是当前Stub对象,否则返回Stub.Proxy对象。

Stub对象调用服务端的方法时不会执行transact方法,而是直接调用Service中的方法,因为客户端与服务端在一个进程中,当然也不会调用onTransact方法;

Stub.Proxy对象会通过binder调用transact方法,执行流程就是上面的流程。

transact方法是IBinder中声明的方法。说明transact方法是通过Binder对象来调用的,Binder相当于两个进程间的信使。

当客户端与服务点不在同一个进程的时候,调用过程:

binder.asInterface()调用某个方法 -> binder.transact() -> onTrancsac( ) -> 在onTrancsac( )根据code决定调用的服务端方法。