Android binder简析

Binder是什么?

  • “binder” 这个单词有着粘合剂的意思,寓意为一个系统的主干,可以将系统中的不同模块粘合成一个整体。

  • Android 系统中每个进程都维护着一个线程池用来响应别的进程的请求;Binder 框架则负责管理对象间的引用计数、内核空间缓冲区和通信模型等。

  • Binder 使用 ServiceManager 来管理各个系统服务;当进程的服务被注册时, binder_node 实体节点会被插入到内核空间的红黑树中,ServiceManager 则会在进程的内核空间中添加ref引用。

为什么使用Binder?

  • 传输性能:Binder 只需拷贝一次数据;虽然共享内存只需一次,但是使用起来很复杂。

当Client向Server发送数据时,Client会先从自己的进程空间把数据拷贝到内核空间,因为Server和内核共享数据,所以不再需要重新拷贝数据,而是直接通过内存地址的偏移量直接获取到数据地址。总体来说只拷贝了一次数据。

  • 安全性

传统的IPC方式没有严格的安全措施;比方说Socket,IP地址可以由客户端手动填入,调用者的身份很容易进行伪造。

Android会为每个已安装的应用程序添加属于自己的UID,Binder 基于此会根据请求端的UID来鉴别调用者的身份,保障了安全性。

  • 易用性

Binder 使用的是C/S通信方式,一个进程可以开启服务专门负责处理某个模块的业务,多个进程可以作为Client同时向Server发起请求。

使用了面向对象的设计,发起一次binder call就像在调用本地方法一样简单。

Server和内核为什么共享数据

Server和内核空间之所以能够共享一块空间数据主要是通过binder_mmap来实现的。它的主要功能是在内核的虚拟地址空间申请一块和用户虚拟内存相同大小的内存,然后再申请一个page大小的内存,将它映射到内核虚拟地址空间和用户虚拟内存空间,从而实现了用户空间缓冲和内核空间缓冲同步的功能。

Binder原理(clinet与server如何通讯)

  1. Server创建了Binder实体,为其取一个字符形式,可读易记的名字。
  2. 将这个Binder连同名字以数据包的形式通过Binder驱动发送给ServiceManager,通知ServiceManager注册一个名字为XX的Binder,它位于Server中。
  3. 驱动为这个穿过进程边界的Binder创建位于内核中的实体结点以及ServiceManager对实体的引用,将名字以及新建的引用打包给ServiceManager。
  4. ServiceManager收数据包后,从中取出名字和引用填入一张查找表中。但是一个Server若向ServiceManager注册自己Binder就必须通过这个引用和ServiceManager的Binder通信。
  5. Server向ServiceManager注册了Binder实体及其名字后,Client就可以通过名字获得该Binder的引用了。Clent也利用保留的引用向ServiceManager请求访问某个Binder:我申请名字叫XX的Binder的引用。
  6. ServiceManager收到这个连接请求,从请求数据包里获得Binder的名字,在查找表里找到该名字对应的条目,从条目中取出Binder引用,将该引用作为回复发送给发起请求的Client。

当然,不是所有的Binder都需要注册给ServiceManager广而告之的。Server端可以通过已经建立的Binder连接将创建的Binder实体传给Client,当然这条已经建立的Binder连接必须是通过实名Binder实现。由于这个Binder没有向ServiceManager注册名字,所以是匿名Binder。Client将会收到这个匿名Binder的引用,通过这个引用向位于Server中的实体发送请求。匿名Binder为通信双方建立一条私密通道,只要Server没有把匿名Binder发给别的进程,别的进程就无法通过穷举或猜测等任何方式获得该Binder的引用,向该Binder发送请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值