binder
Android应用程序是由Activity
、 Service
、 Broadcast Receiver
和 Content Provider
四种类型的组件构成的, 它们有可能运行在同一个进程中, 也有可能运行在不同的进程中。 此外, 各种系统组件也运行在独立的进程中, 例如, Activity管理服务ActivityManagerService
和Package管理服务PackageManagerService
都运行在系统进程System
中。
Android系统是基于Linux
内核开发的。 Linux内核提供了丰富的进程间通信机制, 如管道(Pipe) 、 信号(Signal) 、 消息队列(Message) 、 共享内存(Share Memory) 和 插口(Socket) 等。
而 Android系统开发了一套新的进程间通信机制——Binder。
Binder
进程间通信机制在进程间传输数据时, 只需要执行一次复制操作, 所以,提高了效率,节省了内存空间。Binder
进程间通信机制是在OpenBinder
的基础上实现的, 它采用CS
通信方式, 其中, 提供服务的进程称为Server
进程, 而访问服务的进程称为Client
进程。
同一个Server进程可以同时运行多个组件来向Client
进程提供服务, 这些组件称为Service组件。同一个Client进程也可以同时向多个Service
组件请求服务, 每一个请求都对应有一个Client组件( Service
代理对象) 。
Binder进程间通信机制的每一个Server进程和Client进程都维护一个Binder线程池来处理进程间的通信请求, 因此, Server进程和Client进程可以并发地提供和访问服务。 Server进程和Client进程的通信要依靠运行在内核空间的Binder
驱动程序来进行。
Binder驱动程序向用户空间暴露了一个设备文件/dev/binder
, 使得应用程序进程可以间接地通过它来建立通信通道。
Service
组件在启动时, 会将自己注册到一个Service Manager
组件中, 以便Client
组件可以通过Service Manager
组件找到它。
因此, 我们将Service Manager
组件称为Binder
进程间通信机制的上下文管理者, 同时由于它也需要与普通的Server
进程和Client
进程通信, 我们也将它看作是一个Service
组件, 只不过它是一个特殊的Service
组件。
Binder进程间通信机制 :
Client
、 Service
和 Service Manager
运行在用户空间, 而Binder
驱动程序运行在内核空间, 其中, Service Manager
和 Binder
驱动程序由系统负责提供, 而 Client
和 Service
组件由应用程序来实现。 Client
、 Service
和Service Manager
均是通过系统调用 open
、 mmap
和 ioctl
来访问设备文件 /dev/binder
, 从而实现与 Binder
驱动程序的交互, 而交互的目的就是为了能够间接地执行进程间通信。
分析 Binder 进程间通信机制的四个使用情景, 分别是:
(1) Service Manager的启动过程。
(2) Service Manager代理对象的获取过程。
(3) Service组件的启动过程。
(4) Service代理对象的获取过程。
上述四个使用情景都是基于Binder进程间通信机制的C/C++实现来分析