1.2 Android体系结构
要深入学习Android,必须理解Android的体系结构,本节将分别从静态和动态两种视角对Android的体系结构进行介绍。
1.2.1 静态视角的体系结构
Android采用了分层的体系结构,各层的结构和功能非常清晰。从上往下看,Android分为四层,分别是:1)应用层,2)应用框架层,3)Android运行环境和系统运行库层,4)Linux内核层,如图1-1所示。
1.应用层
应用层位于Android体系结构的最上层。Google在Android中内置了一些核心应用程序,如图1-1所示,有主屏幕(Home)、联系人(Contacts)、电话(Phone)、浏览器(Browser),另外还有日历(Calendar)、地图、SMS短消息程序、图库(Gallery)、输入法、闹钟(Alarm)等。开发者还可以使用应用框架层提供的API 编写自己的应用程序,这也是Android 开源的巨大优势之一。
应用程序主要用Java语言编写,自Android 1.5开始,Google提供了NDK开发工具,可以方便地开发基于JNI的应用程序。NDK便于开发者开发需要基于C/C++才能实现的功能,也可以提高程序执行效率。
2.应用框架层
应用框架层是Android体系结构的第二层,它不仅为应用层提供API,而且是一种重要的机制。这种机制为应用层提供了可以复用的组件,提供了应用层开发的规范,屏蔽了应用层与底层交互的复杂性。应用框架层提供的API并不完全对第三方应用程序开放,有一部分API是隐藏的。开发第三方应用程序需要依赖Android SDK提供的API,它只是应用框架层API的一个子集。
本层主要是使用Java和JNI实现的,位于该层的主要组件如表1-2所示。
3.Android运行环境和系统运行库层
Android运行环境和系统运行库层位于Android体系结构的第三层。本层相当于中间件层,为应用框架层提供服务,它分成两个部分:一部分是系统运行库,包含各种系统库和第三方库;另一部分是Android 运行环境,这里主要是使用C++和C实现的。
应用框架层为应用层提供的功能,在底层大多是由系统运行库实现的。Android应用层使用的多媒体、浏览器、数据库、图形引擎等,其功能实现均位于该层。
Android应用层的Java程序运行在虚拟机中。Android提供了Dalvik虚拟机以支持Java运行环境。
系统运行库的主要组件如表1-3所示。
Android运行环境的主要组件如表1-4所示。
4.Linux内核层
Android 自ICS开始基于Linux 3.0内核,充分利用了Linux内核基于权限的安全模型、内存管理、进程管理、网络协议栈和驱动模型等优点,并在Low Memory Killer、进程间通信(Binder)、电源管理以及日志系统(Logger)等方面引入了不同于标准Linux的全新实现。Android对标准Linux内核做了大量剪裁和优化,其修改主要集中在以下方面:
弃用标准Linux的GUI系统。
采用更有效率的Bionic Libc库代替glibc库。
基于ARM架构增加了Gold-Fish平台。
专有的驱动程序:Binder、Logger、PowerManager、Timed GPIO、Alarm、Ashmem、RAM Console。
Android对标准Linux内核做了很多修改,有兴趣的读者可以自行比较这两部分源代码的区别。
Linux Kernel遵守GPL license,Android遵守Apache license。为了避开GPL license完全开放源码的规定,保护硬件厂商的驱动程序,Android把控制硬件的操作放到了Android HAL(Hardware Abstraction Layer,硬件抽象层)中,在内核驱动中只有简单的读写寄存器的操作。遵守Apache license,硬件厂商可以只提供二进制代码,而不需要提供源码。HAL层并没有在官方的体系结构图中体现出来,实际上它位于Linux内核层和Android运行环境和系统运行库层之间。
Patrick Brady 在2008年Google I/O大会上发表了题为“Anatomy & Physiology of an Android”的演讲,他在演讲中提出了HAL层的概念,如图1-2所示。
注意 引入HAL层,可以使Android与Linux的耦合度更低,减少Android对Linux内核和驱动的依赖,方便系统移植和接口开发。
熟悉了Android的四层体系结构后,有必要对一些容易混淆的概念加以界定和区分。这里涉及的概念有应用框架层、框架层和frameworks。
应用框架层:特指Android四层体系结构中的Application Framework。应用框架层不仅为应用层提供API和UI控件,而且为应用层提供了一套代码设计的模式。引入应用框架层后,应用层被浓缩为Activity、Service、Content Provider和Broadcast Receiver四大组件。
框架层:严格意义上讲,并没有一个明确的界限去定义框架层。从Android体系结构的视角,可以把应用框架层、Android运行环境和系统运行库层以及Binder都归入框架层的范畴。从源代码的视角,可以把dalvik、frameworks、external、libcore、system这几个包的内容归入框架层的范畴。本书中框架层的概念便基于上述定义。
frameworks:一般指Android源码中的frameworks包。
1.2.2 动态视角的体系结构
静态的体系结构是从横向分层的角度诠释Android是什么。如果静态的体系结构不足以让读者理解Android的运行机制,我们可以看看Google工程师Sans Serif是怎么描述Android体系结构的,如图1-3所示。
在图1-3中,将Android划分为两个交互的空间:用户空间和内核空间。
1.用户空间
用户空间分为两个交互的子系统:Native子系统和Java子系统。两个子系统通过JNI技术连接在一起,建立在内核空间之上。
Native子系统主要由NDK开发的App、应用框架层Native部分和标准库C/C++部分组成。
Java子系统主要由SDK开发的App、系统内置App、应用程序框架层Java部分、标准库的Java接口组成。
运行时,Java应用程序调用应用框架层的接口使用标准库提供的服务。整个系统的运行环境和进程管理便由Dalvik和Linux Kernel负责。
2.内核空间
内核空间分为两部分:Linux内核和Android扩展支持,用于完成操作系统运行支持。其中Android扩展部分包括Binder、Logger、OOM等机制。
熟悉了Android的体系结构,接下来我们就要下载Android源码看个究竟。