在我们之前的文章
在我们之前的文章Android一瞥中,我们介绍了Android的发展历程,解释了它的软件架构以及在Android平台开发应用需要注意什么。在本篇文章中,我将深入讨论Binder,复杂并且巨大的Android平台中的核心子系统。我将解释Binder中提供的不同组件,应用进程如何与系统进程通信,以及数据是如何被分享的。
由于智能手机的硬件性能的提升,被称为手中的PC,智能手机开始取代PC。伴随这种趋势,移动操作系统也开始支持多任务和使用多核CPU处理各种多媒体任务。大多数移动操作系统都是基于PC操作系统的。保留了现有PC操作系统的架构,内核稍作了修改以满足移动环境的要求,并添加一些优化的功能。Windows Phone基于微软Windows系统,iOS基于Mac的OS X,Google的Android系统基于Linux内核,三者都是最受欢迎的移动操作系统。
智能手机-手中的电脑,手中的PC操作系统
如果你有类似这样的疑问,
如果PC的操作系统被植入到智能手机中,什么将会被修改,怎样以及为什么修改?
开源的Android平台能提供给你非常完美的答案。Android平台包含了最新的软件技术,它通过他的开发者社区提供了大量的信息并且允许用户直接修改它的开源代码。
Android继承了Linux内核非常强大的底层系统,如内存管理,多任务以及文件管理。另外,它还降低了开发门槛,通过提供适用于基于Dalvik虚拟机的Java应用的各种各样的开发工具。虽然底层系统是用C++语言实现的,它们是非常高效的代码。实际上,Android开发者说Android系统的一个优点就是相比于其他系统,他们使用的是C++实现的。
因此,Android是一个包括多种技术的系统,如Linux内核,C++,Java,Dalvik虚拟机等。
不管怎样,它都是Linux进程
Android提供了进程单元组件模型。换句话说,为应用提供相机功能的系统服务,负责屏幕显示的系统服务,所有这样的Android组件最终都是以Linux进程形式展示的。
因为Android运行在基于Linux内存,进程姐文件管理之上,系统服务也会因保护被Linux进程隔离开来。系统进程是使用Java代码和C++ Native代码编写的,所以服务运行在Dalvik虚拟机上,例如WiFi,定位和Activity服务等。
为了支持移动设备例如智能手机,Android系统所有默认的系统功能都被以服务进程(server process)的类型提供。换句话说,为了使用例如SurfaceFlinger
或AudioFlinger
这样的功能,作为一个运行在用户模式下的独立进程的请求应该被发出。
例如,当我开发的应用调用Android SDK的API来获得位置信息时,应用发送请求给提供位置服务的内部Linux进程,然后获得回复。同样地,当相机被使用时,与相机服务进行交互。
由于所有系统服务都被作为服务进程(server process),一种进程间发送和回复请求的机制是必要的。在Android中,被称为Binder机制。Android通过Binder使用其他进程提供的方法。
然后,为什么开发一种新的机制,而不使用Linux提供的跨进程通信机制(IPC),例如Sockets和Pipes? 这主要是因为性能,正如我们之前讨论的,Android的所有系统功能都被以服务进程的形式提供,所以一个最优的跨进程通信方法是必要的,而Binder因此而诞生。Binder引用被所有进程共享的内核内存来降低由于内存拷贝造成的开销。另外,它提供了用C++编写的远端程序调用(RPC)框架。
系统方法都被以服务进程的形式提供,请求和回复都通过Binder机制。你会问,
Android系统架构会因此有什么好处?
易于拓展和移除功能 增加新的系统服务或移除现有的功能变得很容易。
易于测试 测试被限制在组件单元级别,所以不可能测试整个服务,因此有着更严格的测试。
易于通信(port) 与新的处理器通信需要一些改变,提供了通信所需要的工具。
支持分布式系统 进程间通信是基于Binder的,因此它保证了组件间位置的透明。
这些好处和微核架构的操作系统的优点很相似。
让我们进一步讨论Binder。
绑定所有功能的Binder
Binder机制源于一个简单的想法。“让(进程间的)请求和回复被写进所有进程都能共享(share)到的区域,让每个进程都指向内存地址。”因此内核区域正好满足这些要求。
Binder驱动用来使用内核区域,它的作用是转换内存地址,每个进程将内核区域的内存地址映射到引用。
Binder驱动能被ioctl()
系统方法使用,ioctl方法是标准的Linux方法。这种机制被称为Binder IPC。
这里有一种C++框架,处理使用Binder IPC传输的数据,发起远端程序调用(RPC)。通常用于创建系统服务。然后,一个进程能使用其他进程的方法就像它自己的一样。
结论
在这边简短的文章中,我尝试在Android大量的技术背后介绍一些简单的知识。我希望对你理解Android系统有所帮助。
总之,Binder是Android系统的基础。我们主要学习了Binder的三个组件:驱动(Driver)、IPC和RPC。