美文网首页Android
Android Binder(上)

Android Binder(上)

作者: 洋芋掉到碗里去了 | 来源:发表于2018-02-17 11:51 被阅读7次

Binder是Android系统中进程间通讯(IPC)的一种方式,也是Android系统中最重要的特性之一。Android中的四大组件Activity,Service,Broadcast,ContentProvider,不同的App等都运行在不同的进程中,它是这些进程间通讯的桥梁。

1. Binder通信机制

1.1 一些思考

用户空间/内核空间:
  • Kernel space 是 Linux 内核的运行空间,User space 是用户程序的运行空间。 为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。
  • Kernel space 可以执行任意命令,调用系统的一切资源; User space 只能执行简单的运算,不能直接调用系统资源,必须通过系统接口(又称 system call),才能向内核发出指令。

系统调用/内核态/用户态
  • 用户空间访问内核空间的唯一方式就是系统调用;通过这个统一入口接口,所有的资源访问都是在内核的控制下执行,以免导致对用户程序对系统资源的越权访问,从而保障了系统的安全和稳定。
  • 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。处理器在特权等级高的时候才能执行那些特权CPU指令。

Android内核是基于Linux系统,而Linux现存多种进程间IPC方式:管道,消息队列,共享内存,套接字,信号量,信号。

然而考虑到性能与安全性的问题,使用Binder是安卓的最佳解决方案。在移动设备上,广泛地使用跨进程通信肯定对通信机制本身提出了严格的要求;Binder相对出传统的Socket方式,更加高效;另外,传统的进程通信方式对于通信双方的身份并没有做出严格的验证,只有在上层协议上进行架设;比如Socket通信ip地址是客户端手动填入的,都可以进行伪造;而Binder机制从协议本身就支持对通信双方做身份校检,因而大大提升了安全性。这个也是Android权限模型的基础。

引自 Android 项目开源网站:https://source.android.com

从下往上依次为:

  • 内核层:Linux 内核和各类硬件设备的驱动,这里需要注意的是,Binder IPC 驱动也是在这一层实现,比较特殊;
  • 硬件抽象层:封装「内核层」硬件驱动,提供可供「系统服务层」调用的统一硬件接口;
  • 系统服务层:提供核心服务,并且提供可供「应用程序框架层」调用的接口;
  • Binder IPC 层:作为「系统服务层」与「应用程序框架层」的 IPC 桥梁,互相传递接口调用的数据,实现跨进层的通讯;
  • 应用程序框架层:这一层可以理解为 Android SDK,提供四大组件,View 绘制体系等平时开发中用到的基础部件。

Android 中「应用程序框架层」以 SDK 的形式开放给开发者使用,「系统服务层」中的核心服务随系统启动而运行,通过应用层序框架层提供的 Manager 实时为应用程序提供服务调用。系统服务层中每一个服务运行在自己独立的进程空间中,应用程序框架层中的 Manager 通过 Binder IPC 的方式调用系统服务层中的服务。

1.2 Binder架构

Binder架构采用分层架构设计,每一层都有其不同的功能:

  • Java应用层:对于上层应用通过调用AMP.startService,完全可以不用关心底层,经过层层调用,最终必然会调用到AMS.startService;
  • Java IPC层:Binder通信是采用C/S架构,Android系统的基础架构便已设计好Binder在Java framework层的Binder客户类BinderProxy和服务类Binder;
  • Native IPC层:对于Native层,如果需要直接使用Binder(比如media相关),则可以直接使用BpBinder和BBinder(当然这里还有JavaBBinder)即可,对于上一层Java IPC的通信也是基于这个层面;
  • Kernel物理层:这里是Binder Driver, 前面3层都跑在用户空间,对于用户空间的内存资源是不共享的,每个Android的进程只能运行在自己进程所拥有的虚拟地址空间,而内核空间却是可共享的。真正通信的核心环节还是在Binder Driver。

1.3 Binder IPC原理

转自http://blog.csdn.net/freekiteyu/article/details/70082302

Binder通信采用C/S架构,从组件视角来说,包含Client、Server、ServiceManager以及binder驱动,其中ServiceManager用于管理系统中的各种服务。Binder 在 framework 层进行了封装,通过 JNI 技术调用 Native(C/C++)层的 Binder 架构,Binder 在 Native 层以 ioctl 的方式与 Binder 驱动通讯。

  • Client:用户需要实现的代码,如 AIDL 自动生成的接口类
  • Binder Driver:在内核层实现的 Driver
  • Server:这个 Server 就是 Service 中 onBind 返回的 IBinder 对象

1.4 Binder驱动

转自http://blog.csdn.net/freekiteyu/article/details/70082302

用户空间中 binder_open(), binder_mmap(), binder_ioctl() 这些方法通过 system call 来调用内核空间 Binder 驱动中的方法。内核空间与用户空间共享内存通过 copy_from_user(), copy_to_user() 内核方法来完成用户空间与内核空间内存的数据传输。 Binder驱动中有一个全局的 binder_procs 链表保存了服务端的进程信息。


摘录自:

  1. Android 接口定义语言 (AIDL)
  2. 绑定服务
  3. Binder学习指南
  4. 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制

相关文章

网友评论

    本文标题:Android Binder(上)

    本文链接:https://www.haomeiwen.com/subject/ezymtftx.html