-
概述
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 的进程,只能运行在自己进程所拥有的虚拟地址空间。对应一个 4GB 的虚拟地址空间,其中 3GB 是用户空间,1 GB的内核空间,当然内核空间的大小是可以通过参数配置调整的。对于用户空间,不同进程之间彼此是不能共享的,而内核空间确是可共享的的。Client 进程向 Service 进程通信,恰恰是利用进程间可共享的内核内存空间来完成底层通信工作的,Client 端与 Server 端进程往往采用 ioctl 等方法跟内核空间的驱动进行交互。
2. Binder原理
Binder通信采用 C/S 架构,从组件视觉来说,包含 Client、Server、ServiceManager 以及 binder 驱动,其中 ServiceManager 用于管理系统中的各种服务。架构图如下所示:
可以看出无论是注册服务和获取服务的过程都需要 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 是服务端。
3)使用服务:Client 根据得到的 Service 信息建立与 Service 所在的 Server进程通信的道路,然后就可以直接与 Service 交互。该过程:Client 是客户端,Server是服务端。
图中的 Client,Server,Service Manager 之间交互都是虚线表示,是由于它们彼此之间不是直接交互的,而是都通过与 Binder驱动进行交互的,从而实现 IPC 通信方式。其中 Binder 驱动位于内核空间,Client,Server,Service Manager 位于用户空间。Binder 驱动和 Service Manager 可以看做是 Android 平台的基础框架,而 Client 和 Server 是 Android 的应用层,开发人员只需自定义实现 Client、Server 端,借助 Android 的基础平台框架便可以直接进行 IPC 通信。
3. C/S 模式
BpBinder(客户端)和 BBinder(服务端)都是 Android 中 Binder 通信相关的代表,它们都从 IBinder 类中派生而来,关系图如下:
1)Client 端:BpBinder.transact() 来发送事务请求;
2)Server端:BBinder.onTransact() 会接收到相应事务。
-
学习提纲
1)注册服务、获取服务;
2)启动 Service Manager、获取 Service Manager;
3)认识 Binder Driver;
4)framework 层分析
5)使用 Binder;
6)使用 AIDL;
7)Binder 总结。
-
源码目录
从上之下,整个 Binder 架构所涉及的总共有以下5个目录:
/framework/base/core/java/ (Java)
/framework/base/core/jni/ (JNI)
/framework/native/libs/binder (Native)
/framework/native/cmds/servicemanager/ (Native)
/kernel/drivers/staging/android (Driver)
1)Java framework
/framework/base/core/java/android/os/
- IInterface.java
- IBinder.java
- Parcel.java
- IServiceManager.java
- ServiceManager.java
- ServiceManagerNative.java
- Binder.java
/framework/base/core/jni/
- android_os_Parcel.cpp
- AndroidRuntime.cpp
- android_util_Binder.cpp (核心类)
2) Native framework
/framework/native/libs/binder
- IServiceManager.cpp
- BpBinder.cpp
- Binder.cpp
- IPCThreadState.cpp (核心类)
- ProcessState.cpp (核心类)
/framework/native/include/binder/
- IServiceManager.h
- IInterface.h
/framework/native/cmds/servicemanager/
- service_manager.c
- binder.c
3) Kernel
/kernel/drivers/staging/android/
- binder.c
- uapi/binder.h