binder跨进程通信的流程
上图是一次binder调用的通信流程,Client是应用进程,Server是系统服务,应用进程通过binder调用请求系统服务,Client向binder驱动发送BC_Transaction指令,binder在收到该指令指令之后回向Client返回BR_Transaction_Complete指令,同时binder驱动会向系统服务发送BR_Transaction指令,并等待系统服务的处理,系统服务处理完成之后会向binder发送BC_Reply的回持,binder驱动在收到系统服务的回执之后,也会向系统服务发送BR_Transation_Complete的回执,同时向应用进程发送BR_Reply,将处理结果发送给应用进程。
我们可以看到Client在等待binder回执的过程中是处于休眠状态的,系统服务Server在处理binder驱动的指令以外的时间也是处于休眠状态的。
Binder机制启动的流程:
1. 打开binder驱动
2. 将binder驱动的描述符进行内存映射
3. 启动binder线程,为binder线程注册binder驱动,让binder线程进入Loop循环,并不断与binder驱动进行交互
Binder存在的意义
Binder是运行在驱动层的,没有用到Linux的IPC机制。Binder机制相比于Linux底层提供的IPC机制,有以下的一些优点:
上面是系统服务的Binder通信架构,在Android中只有系统服务的Binder才能够注册到ServiceManager中,应用的Binder是无权限注册的。上图中Client是应用进程,Server是系统进程,所有的进程在启动的时候,首先都会启动Binder机制。Server启动之后就会将自己的Binder注册到Servicemanager中,ServiceManager启动之后就会进入Loop循环,等到其他进程的请求调用。