虽可儿的小窝

Thoughts, stories and ideas.

0%

一 开篇

一 开篇

1 概述

Android 系统中,四大组件所涉及的多进程间的通信底层都是依赖于 Binder IPC 机制。不仅如此,整个 Android 架构中,都大量采用了 Binder 机制作为 IPC 方案。

2 Binder

2.1 IPC 原理

从进程的角度来看 IPC 机制

从图可以看出来,每个进程只能运行在自己所拥有的虚拟地址空间,对于用户空间来说,不同进程之间彼此是不能共享的,而内核空间却是可以共享的。

所以,Client 进程向 Server 进程通信,就是利用可共享的内核内存空间来完成的,往往采用的是 ioctl 等方法跟内核空间的驱动进行交互的。

2.2 Binder 原理

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

此处的 ServiceManager 指的是 Native 层的 ServiceManager,他是整个 Binder 通信机制的大管家,是 Android 进程间通信机制 Binder 的守护进程。

要掌握 Binder 机制,首先需要了解系统是如何首次启动 ServiceManager。还有当启动之后,如果先获取 ServiceManager 接口,这样才能开始通信服务。

图中 Client、Server、ServiceManager 之间的相互通信都是基于 Binder 机制,所以也同样是 C/S 架构,即图中的三大步骤都有相应的 Client 端与 Server 端。

  1. 注册服务(addService):Server 进程要先注册 Service 到 ServiceManager。该过程,Server 是客户端,ServiceManager 是服务端。
  2. 获取服务(getService):Client 进程使用某个 Service 前,须向 ServiceManager 中获取相应的 Service。该过程,Client 是客户端,ServiceManager 是服务端。
  3. 使用服务:Client 根据得到的 Service 信息建立与 Service 所在的 Server 进程通信的通路,然后就可以直接与 Service 交互。该过程,Client 是客户端,Server 是服务端。

另外,他们之间的交互都不是直接交互的,而是通过与 Binder 驱动进行交互的,Binder 驱动位于内核空间,从而实现 IPC 通信方式。

开发人员的话,只需自定义实现 Client、Server 端,借助 Android 的基本平台架构便可以直接进行 IPC 通信。

3 总结

本篇主要介绍了什么是 IPC,IPC 的原理,即通过可共享的内核空间来进行通信,往往采用的是 ioctl 等方法。

然后介绍了什么是 Binder,Binder 的原理,采用 C/S 架构,通过与 Binder 驱动进行交互,Binder 驱动位于内核空间。Binder 机制拥有三个组件,三个组件之间的通信也都是基于 Binder 机制,所以同样是 C/S 架构。

Binder 机制的流程有三步,首先是 Server 向 ServiceManager 注册服务。接着,Client 向 ServiceManager 获取服务,最后,Client 就可以向 Server 进行通信了。

Suikeer

关于作者