《Android Binder机制概述》

  • 概述 

        Android系统中,每个应用程序是由Android的 Activity, Service, Broadcast, ContentProvider 这四大组件中的一个或者多个组合而成,四大组件涉及进程间的通信底层都是依赖于 Binder IPC 机制。例如当进程 A 中的 Activity 要向进程 B 中的 Service 通信,这便需要依赖于 Binder IPC。不仅于此,整个 Android 系统架构中,大量采用了 Binder 机制作为 IPC (进程间通信)方案,当然也存在部分其他的 IPC 方式,比如 Zygote 通信便是采用 socket。

  • Binder

    1. IPC原理

        从进程角度来看 IPC 进程

        《Android Binder机制概述》

       每个 Android 的进程,只能运行在自己进程所拥有的虚拟地址空间。对应一个 4GB 的虚拟地址空间,其中 3GB 是用户空间,1 GB的内核空间,当然内核空间的大小是可以通过参数配置调整的。对于用户空间,不同进程之间彼此是不能共享的,而内核空间确是可共享的的。Client 进程向 Service 进程通信,恰恰是利用进程间可共享的内核内存空间来完成底层通信工作的,Client 端与 Server 端进程往往采用 ioctl 等方法跟内核空间的驱动进行交互。

    2. Binder原理

       Binder通信采用 C/S 架构,从组件视觉来说,包含 Client、Server、ServiceManager 以及 binder 驱动,其中 ServiceManager 用于管理系统中的各种服务。架构图如下所示:

《Android Binder机制概述》

       可以看出无论是注册服务和获取服务的过程都需要 ServeiceManager,需要注意的是此处的 ServiceManager 是指 Native 层的 ServiceManager(C++),并非指 framwork 层的 ServiceManager(Java)。ServiceManager 是整个 Binder 通信机制的大管家,是 Android 进程通信机制 Binder 的守护进程,要掌握 Binder 机制,首先需要了解系统如何首次启动Service Manager。当 Service Manager 启动后,Client 端和 Service 端通信时都需要先获取 Service Manager 接口,才能开始通信服务。

       图中 Client/Service/ServiceManager 之间的相互通信都基于 Binder 机制。既然基于 Binder 机制通信,那么同样也是 C/S 架构,则图中的3大步骤都有相应的 Client 端与 Server端。

       1.注册服务(addService):Server 进程要先注册 Service 到 ServiceManager。该过程:Server 是客户端,ServiceManager 是服务端。

       2.获取服务(getService):Clicent 进程使用某个Service前, 须先向 ServiceManager 中获取相应的 Service。该过程:Client 是客户端,ServiceManager 是服务端。

 

 

  • 源码目录