Android之Binder

455 阅读2分钟

Binder是Android特有的IPC(跨进程通信)方式,基于Client-Server模式。

先说下linux的基础知识,便于理解Binder。Android是基于Linux系统的,Linux的IPC方式有共享内存、socket等,linux进程空间分为两部分:不能数据共享的用户空间和可数据共享的内核空间。Android程序的一个特点是每个程序一个进程,各个进程不能直接操作或访问别的进程。有些程序想要获取别的程序的数据或别的进程的服务,就需要跨进程通信,Binder正是为IPC而产生的。

Binder对比其他IPC方式的特点是安全且高效,安全是指Binder可以通过进程的UIP辨识进程身份(Android程序会在安装时生成一个唯一不变的UID),高效是指不同于Linux系统其他IPC方式要么复杂(共享内存)要么需要两次拷贝数据(socket,先发送方缓存区-->内核缓存区 ,再内核缓存区-->接收方缓存区)的情况,Binder通过内存映射,每次单向通信只需拷贝一次数据(发送方缓存区-->内核缓存区)。

Binder跨进程通信机制模型基于Client-Server模式,有四个角色:Client进程,Server进程,ServiceManager进程,Binder驱动。Client进程使用服务,相当于Android客户端;Server进程提供服务,相当于服务器端;ServiceManager进程管理Service注册与查询(会在其中查询client要求服务对应的Server);Binder驱动(位于内核空间)连接着上面三个,传递进程间通信。

Binder通信的大概流程是:Server进程通过Binder驱动在ServiceManager进程中注册代理对象(Binder引用),Client进程通过Binder驱动向ServiceManager进程获取服务(想要获得Binder引用),ServiceManager进程查找返回Servier进程的代理对象(Binder引用),Client进程通过代理对象使用服务。(Binder实体始终位于Server进程中)

上面流程中值得注意的是:Binder是用来实现进程间通信的,然而Binder实现却需要进程间的通信(Server进程通过进程间通信向ServiceManager进程注册Binder引用)。ServiceManager和其他进程同样采用Binder通信,ServiceManager是Server端,有自己的Binder实体,其他进程都是Client,需要通过这个Binder的引用来实现Binder的注册,查询和获取。一个应用程序可能是个提供服务的Server,但对ServiceManager来说仍然是Client。

Binder驱动&ServiceManager进程属于Android基础架构,已经实现好了;Client进程和Server进程属于Android应用层,需要开发者实现。在实际使用中,我们只需要知道通过Binder可以完成进程间通信即可。

示意图

参考:

blog.csdn.net/carson_ho/a…

blog.csdn.net/universus/a…