随着android移动设备平台系统的发展,Binder机制得到越来越多人的关注的。什么是binder,总体上说,Binder是一个轻量级的IPC组件框架,binder是一个分布式的组件架构,它类似于COM和CORBA。一个叫做open-binder的开源项目,在Android的操作系统上的实现后,就成了现在人们在android上看到的binder。
所以binder不是一个新技术和新想法,Binder在android之前就存在了。它最在开发在BeOS上,后来在Palm OS Cobalt得到产品化。andorid里的binder基本上binder的作者按照binder最初的设计思想参考Palmsource开放出来的开源项目openbinder在android里面重新实现的。
(二)binder机制的特点
Android虽然构建在Linux上面,但是在IPC机制方面,没有利用Linux提供IPC机制,而是自己实现了一套轻量级的IPC机制——binder机制。binder的如下特性,使得它成为android不可或缺的一部分:
(1) 具有分布式的架构。
(2)面向系统级的开发。
面向系统层的,而不是面向应用层的。openbinder的目标是进程和IPC,而不是面向跨网络通讯。
(3)本身使用C++语言实现。
(4)多线程编程的支持。
支持多线程编程的各种线程模型。不强制使用特定的线程模型。
(5) 可支持多操作系统平台。
从BeOS开始, 到Windows和Palm OS Cobalt,再到android。binder都是可以在这些不同平台实现和使用的。binder使用一些组件和对象来呈现一些基本的系统服务,比如进程和共享内存。它没有试图取代和隐藏操作系统中那些传统的概念,而是拥抱和超越它们。这使得binder可以支持大多数的传统操作系统平台。
(6)良好的硬件伸缩性。
对硬件要求很低。从50MHz ARM 7 CPU (without memory protection) 到 400MHz ARM 9 CPU,以及更强大的CPU。
(7). 用户可定制性高。
作为IPC的机制实现,串联了系统里的大部分组件,并且将各个组件之间的耦合行降到最低。各个组件的可以自由修改和替换,提高了用户的可定制性。
(8)Binder对硬件要求很低,这正好符合android的实际情况,android的产品线广泛,芯片主频各个层次的都有,要在低端的机器上跑的顺畅,软件本身的性能要求还是很重要。
(三)binder应用模型
一个IPC通讯我们可以简单理解成客户端-服务器模式,客户端请求服务,服务端接收到客户端请求后处理相应,或可能带回结果返回给客户端。binder机制在android系统的进程间通讯模型总结如下:
(1)客户端通过某种方式得到服务器端的代理对象。从客户端角度看来代理对象和他的本地对象没有什么差别。它可以像其他本地对象一样调用其方法,访问其变量。
(2)客户端通过调用代理对象的方法向服务器端发送请求信息。
(3)代理对象通过binder设备节点(/dev/binder),把用户请求信息发送到Linux内核空间(实际上是内存共享),由Binder驱动获取并发送到服务进程。
(4)服务进程处理用户请求,并通过Linux内核的Binder驱动返回处理结果给客户端的代理对象。
(5)客户端收到服务端的返回结果。
整个过程大致如上所述,可以想象一下bingder机制的引入,给进程间的通讯带来什么好处?没错,就是“线程迁移”,就像是一个线程带着参数,进入另一个进程执行,然后带着结果返回,和调用自己的函数一样的效果。
本文暂不对binder机制的细节进行描述,在后续文章中会有对binder机制进行详细分析。这里我们先来看看binder机制的框架组成。
(四)Binder机制的组成
(1)Binder驱动
binder是内核中的一个字符驱动设备位于/dev/binder。这个设备是Android系统IPC的核心部分,客户端的服务代理用来通过它向服务器(server)发送请求,服务器也是通过它把处理结果返回给客户端的服务代理对象。这部分内容,在Android中通过一个IPCThreadState对象封装了对Binder驱动的操作。
(2)Service Manager
这个东西主要用来负责管理服务。Android中提供的系统服务都要通过Service Manager注册自己,将自己添加进服务管理链表中,为客户端提供服务。而客户端如果要和特定的系统服务端通讯,就需要向Service Manager来查询和获得所需要服务。可以看出Service Manager是系统服务对象的管理中心。
(3)服务(Server)
需要强调的是这里服务是指的是System Server,而不是SDK server,向客户端提供服务。
(4)客户端
一般是指Android系统上面的应用程序。它可以请求Server中的服务。
(5)代理对象
是指在客户端应用程序中获取生成的Server代理(proxy)类对象。从应用程序角度看代理对象和本地对象没有差别,都可以调用其方法,方法都是同步的,并且返回相应的结果。
binder机制的实现使用C/C++实现的,但在android的应用程序中,也会有java部分的内容。下面会介绍binder机制中的“服务管家”--service manager。