天天看点

Binder通讯机制1. Binder通信机制介绍1.1 Android与Linux通信机制的比较

大纲

  1. Binder通信机制介绍
    1. Android与Linux通信机制的比较
    2. Binder在Service服务中的作用
    3. Binder通信机制流程
  2. 数据结构分析
  3. 驱动分析
  4. Binder的流程分析
    1. Service Manager成为守护进程
    2. Server和Client获得ServiceManager的远程接口
    3. Server向SM注册服务
    4. Client从SM获得服务
  5. 基于framework层的实现
    1. 初始化framework层Binder框架
    2. C/S获得ServiceManager的Java远程接口过程
    3. XXXService的接口定义和启动过程,添加自己到SM中
    4. Client获得XXXService的Java远程接口过程
    5. Client通过Java远端接口使用XXXService提供的服务
  6. 实际应用
    1. PMService例子
    2. 碰到的问题及解决办法

1. Binder通信机制介绍

1.1 Android与Linux通信机制的比较

虽然Android继承使用Linux的内核,但Linux与Android的通信机制不同。

在Linux中使用的IPC通信机制如下:

  1. 传统IPC:无名pipe, signal, trace, 有名管道
  2. AT&T Unix 系统V:共享内存,信号灯,消息队列
  3. BSD Unix:Socket

而在Android中,并没有使用这些,取而代之的是Binder机制。Binder机制是采用OpenBinder演化而来,在Android中使用它的原因如下:

  1. 采用C/S的通信模式。而在linux通信机制中,目前只有socket支持C/S的通信模式,但socket有其劣势,具体参看第二条。
  2. 有更好的传输性能。对比于Linux的通信机制,socket:是一个通用接口,导致其传输效率低,开销大;管道和消息队列:因为采用存储转发方式,所以至少需要拷贝2次数据,效率低;共享内存:虽然在传输时没有拷贝数据,但其控制机制复杂(比如跨进程通信时,需获取对方进程的pid,得多种机制协同操作)。
  3. 安全性更高。Linux的IPC机制在本身的实现中,并没有安全措施,得依赖上层协议来进行安全控制。而Binder机制的UID/PID是由Binder机制本身在内核空间添加身份标识,安全性高;并且Binder可以建立私有通道,这是linux的通信机制所无法实现的(Linux访问的接入点是开放的)。

综上所述,Android采用Binder机制是有道理的。既然Binder机制这么多优点,那么我们接下来看看它的实现思路是怎样的。

1.2 Binder在Service服务中的作用

在android中,有很多Service都是通过binder来通信的,比如MediaServer旗下包含了众多service:

  •     AudioFlinger 音频核心服务
  •     AudioPolicyService:音频策略相关的重要服务
  •     MediaPlayerService:多媒体系统中的重要服务
  •     CameraService:有关摄像/照相的重要服务

继续阅读