无Binder不Android,Android开发尤其是做framework的应该都有深刻体会,这个专题迟早是要做的,那么话不多说开始吧。

一、什么是Binder

简单地说,Binder是Android平台上的一种跨进程交互技术。该技术最早并不是由Google公司提出的,它的前身是Be Inc公司开发的OpenBinder,而且在Palm中也有应用。后来OpenBinder的作者Dianne Hackborn加入了Google公司,并负责Android平台的开发工作,所以把这项技术也带进了Android。

我们知道,在Android的应用层次上,基本上已经没有过去的进程概念了。然而在实现层次,它毕竟还是要建构在进程之上的。实际上,在 Android内部,那些支撑应用的组件往往会身处于不同的进程,那么应用的底层必然会牵涉大量的跨进程通信。因此Android提供了Binder作为IPC方案。

二、Android为什么要使用Binder作为IPC方案

我们都知道,Linux进程通信方案有很多,那么Android为什么要使用Binder作为IPC方案?

先简单概括性地说说Linux现有的所有进程间IPC方式:

方式 说明
管道 在创建时分配一个page大小的内存,缓存区大小比较有限;
消息队列 信息复制两次,额外的CPU消耗;不合适频繁或信息量大的通信;
共享内存 无须复制,共享缓冲区直接付附加到进程虚拟地址空间,速度快;但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决;
套接字 作为更通用的接口,传输效率低,主要用于不通机器或跨网络的通信;
信号量 常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
信号 不适用于信息交换,更适用于进程中断控制,比如非法内存访问,杀死某个进程等;

然后我们从以下几方面来做个对比:

  • 性能角度(数据拷贝次数):共享内存(0)< Binder(1)< 管道/消息队列/Socket(2)

  • 稳定性角度:Binder是基于C/S架构的,结构清晰,两端相对独立。而共享内存实现方式复杂,没有客户与服务端之别, 需要充分考虑到访问临界资源的并发同步问题,否则可能会出现死锁等问题;从这稳定性角度看,Binder架构优越于共享内存。

  • 安全性角度:传统Linux IPC无任何保护措施,完全由上层协议来确保,另外无法鉴别对方进程身份。 Binder机制对于通信双方的身份是内核进行校检支持的,可以获得对方进程可靠的UID/PID,做安全访问控制。

所以总结Binder的特点:
基于C/S架构,两端相对独立,稳定性好;为发送方添加UID/PID进行身份核验,安全性好;仅需1次数据拷贝,效率较高。

三、Binder数据共享原理

每个Android的进程,只能运行在自己进程所拥有的虚拟地址空间。对应32位系统4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间,当然内核空间的大小是可以通过参数配置调整的。对于用户空间,不同进程之间彼此是不能共享的,而内核空间却是可共享的。Client进程向Server进程通信,恰恰是利用进程间可共享的内核内存空间来完成底层通信工作的,Client端与Server端进程往往采用ioctl等方法跟内核空间的驱动进行交互。

from gityuan

内核态/用户态:
当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)此时处理器处于特权级最高的(0级)内核代码中执行。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。处理器在特权等级高的时候才能执行那些特权CPU指令。

四、Binder架构

4.1 分层设计:

from gityuan

  • Java应用层: 对于上层应用通过调用AMP.startService, 完全可以不用关心底层,经过层层调用,最终必然会调用到AMS.startService.

  • Framework层: Binder通信是采用C/S架构, Android系统的基础架构便已设计好Binder在Java framework层的Binder客户类BinderProxy和服务类Binder;

  • Native 层: 对于Native层,如果需要直接使用Binder(比如media相关), 则可以直接使用BpBinder和BBinder(当然这里还有JavaBBinder)即可, 对于上一层Java IPC的通信也是基于这个层面.

  • Kernel层: 这里是Binder Driver, 前面3层都跑在用户空间,对于用户空间的内存资源是不共享的,每个Android的进程只能运行在自己进程所拥有的虚拟地址空间, 而内核空间却是可共享的. 真正通信的核心环节还是在Binder Driver.

4.2 C/S架构设计:

from gityuan

Binder通信采用C/S架构,从组件视角来说,包含Client、Server、ServiceManager以及binder驱动,其中ServiceManager用于管理系统中的各种服务。无论是注册服务和获取服务的过程都需要ServiceManager,它也是整个Binder通信机制的大管家。

另外,图中的Client,Server,Service Manager之间交互都是虚线表示,是由于它们彼此之间不是直接交互的,而是都通过与Binder驱动进行交互的,从而实现IPC通信方式。其中Binder驱动位于内核空间,Client,Server,Service Manager位于用户空间。Binder驱动和Service Manager可以看做是Android平台的基础架构,而Client和Server是Android的应用层,开发人员只需自定义实现client、Server端,借助Android的基本平台架构便可以直接进行IPC通信。

那么接下来会分多篇文章,来对Binder进行一个相对全面的学习。当然也会参考许多大神的文章。

参考:

https://www.zhihu.com/question/39440766/answer/81511893
http://gityuan.com/2015/10/31/binder-prepare/

更多相关文章

  1. [转】:Android生命周期
  2. Android的UI主线程是ActivityThread吗?
  3. Android(安卓)7.1 APP 启动流程分析
  4. 声波通信、声波传输原理及源代码
  5. android中跨进程通讯的4种方式
  6. Flutter通过BasicMessageChannel实现Flutter 与Android(安卓)iOS
  7. 四大组件之服务(Service)
  8. Zygote进程浅析
  9. android 插件Activity生命周期管理

随机推荐

  1. Android之计时器(Chronometer)的用法
  2. Android(安卓)Gallery3D效果 教程 案例
  3. 2010.12.27——— android service
  4. 2011.09.23——— android sample之Notep
  5. listView中item 图文并存的两种方法
  6. android中图片倒影、圆角效果重绘
  7. Android全屏显示 无标题栏、全屏、设置为
  8. Android(安卓)Adapter
  9. Android(安卓)Settings中快速搜索流程
  10. SAX解析XML文件