Android启动binder机制

####

binder是什么

binder是跨进程的ipc通信,跟管道,共享内存,信号等不同,它是一个android系统创建的全新的IPC通信,基于binder驱动,

可以跨进程调用函数,传输大图片

binder的优点
  1. 性能

    linux常用的进程通信比如socket,管道等是需要内核作为中转的,需要两次数据copy,一次从应用层copy到内核,一次从内存copy到应用层。然而binder是给一块物理内存同时映射到内核和目标进程的用户空间,将数据从应用层copy到内核空间时,相当于将数据copy到了另一个进程的用户空间了,只用copy一次。

  2. 方便易用

    逻辑简单直接,不易出现问题。共享内存虽然性能很好,但远不如binder好用

  3. 安全

    普通的linux跨进程访问是很不安全的,比如socket,它的IP地址端口等都是开放的,别人只要知道了他的IP地址就能链接他。或者说命名管道也是,知道了管道的名字就能读写数据了,这很容易被人恶意利用的。主要是我们拿不到调用方可靠身份信息,身份信息总不能让调用方自己填写,这明显是不可靠的,可靠的方式这个身份信息只能有IPC机制本身在内核态中添加,关于这点binder是做到了。

bindder架构

系统服务的binder通信架构,只有系统服务才能注册到serviceManager, 应用端的服务是不能注册到serviceManager的,通过不了权限验证。

Client:应用进程

Server:系统服务,可能运行在SystemServer进程或单独的进程,Server先与Client/应用启动,Server先与ServiceManager交互的,Server启动时将自己的binder注册到ServiceManager

ServiceManager: 单独的系统进程,Servicemanager启用binder机制后进入loop循环,等待Client和Server的请求

这三种进程启动时都会先启动binder机制,这是binder通信的前提

bind机制启动
  • 打开binder驱动

  • 映射虚拟内存,分配内存缓冲区

  • 注册binder线程

  • 进入binder loop