Android Review

Android Review - Binder机制(一)

2019-10-16  本文已影响0人  你需要一台永动机

简介

Binder机制是Android特有的一种跨进程通信的方式,在日常应用开发中四大组件底层通信机制、Activity传递对象以及AIDL的使用等,都涉及到Binder机制。

Linux内核基础

一:进程隔离
Android系统为了保护进程互不干扰,采用了虚拟空间的技术,所有进程表面是共享了系统,但是数据是不能共享的。若果两个进程需要进行通信,就需要一种通信机制,也就是Binder机制。

二:内核共享
对于用户空间,不同进程之间彼此是不能共享的,而内核空间却是可共享的。

三:访问内核
内核有保护机制,告诉应用程序,只能访问一些许可资源。
内核与上层应用(用户空间)分离开,用户可以通过系统调用,让用户空间访问内核的一些程序。

四:Binder驱动
在 Android 系统中,这个运行在内核空间,负责各个用户进程通过 Binder 实现通信的内核模块就叫 Binder 驱动(Binder Driver)。

为什么使用Binder

Android的系统底层是Linux系统,Linux本身就有很多种IPC的方式,为啥Android要设计Binder机制呢?

Linux的IPC共有8种:

  1. 管道 (PIPE),实际是用于进程间通信的一段共享内存。缺点:需要将一块内存拷贝两次,第一次拷贝到共享区,第二次拷贝到目标进程,效率低。
  2. 命名管道(FIFO),是一种特殊类型的文件。缺点:是基于文件的io操作,性能差。
  3. 信号 (signal),是一种以事件为驱动的通信方式。缺点:不适合信息的传递。
  4. 消息队列(Message queues),是内核地址空间中的内部链表,通过linux内核在各个进程直接传递内容。缺点:跟管道一样。
  5. 信号量(Semaphore),是一种计数器,用于控制对多个进程共享的资源进行的访问。缺点:跟信号一样。
  6. 共享内存(Share Memory),是在多个进程之间共享内存区域的一种进程间的通信方式。缺点:需要自己实现进程间的同步。
  7. 内存映射(Memory Map),是由一个文件到一块内存的映射。缺点:需要自己实现进程间的同步。
  8. 套接字 (Socket),是一种跨网络的通信方式。缺点:传输效率低,开销大。

Android的IPC方式:

  1. 文件系统
  2. Socket
  3. Pipes管道
  4. 共享内存
  5. 隐式Intent
  6. ContentProvider
  7. Broadcast

Binder比以上的IPC方式,具有2个优点

  1. 性能好。Binder采用内存映射的机制,Binder数据的拷贝只要一次。
  2. 更安全。Linux的IPC方式无法获取目标进程的UID/PID,无法鉴别身份;Android可以获取目标进程的进程的UID/PID,从而控制访问权限。协议本身对通信双方做身份校验,因为安全性大大提升

Binder通信的流程

Binder通信流程

在进入通信流程之前我们先来了解图上的一些概念~

通信流程可以分为3步:注册服务、获取服务、使用服务。

一:注册服务

注册服务
  1. 服务端向service_manager发出注册服务的请求
  2. service_manager向binder驱动发出注册服务的请求
  3. binder驱动响应请求,将被注册的服务信息保存到内核中的binder_procs全局链表中
  4. binder驱动返回被注册服务的代理
  5. service_manager将服务的代理保存到svcinfo中
  6. 返回到服务端

二:获取服务

获取服务
  1. 客户端向service_manager发出获取服务请求
  2. service_manager在binder驱动的帮助下查询对应服务端,在svcinfo中查询对应服务端的代理
  3. 给客户端返回服务端的代理

三:使用服务

使用服务
  1. 客户端调用代理中的接口,输入参数
  2. binder驱动分别在在内核空间和服务端开辟缓存区,建立服务端和内核空间的内存映射。
  3. 使用copy_from_user将参数从用户空间复制到内核空间中的缓存区。
  4. 服务端读取缓存区数据,计算结果,将结果写到缓存区中。
  5. binder驱动使用copy_to_user将结果返回给客户端。
  6. 客户端接收到结果,完成通信。
Binder通信的流程

提示:整个调用的过程是一个同步过程,因此客户端调用的过程中不应该在主线程

PS:本文整理自以下博客
安卓移动架构07-Binder核心机
通过一张图来学习安卓的binder机制
若有发现问题请致邮 caoyanglee92@gmail.com

上一篇下一篇

猜你喜欢

热点阅读