1.2 Android体系结构

要深入学习Android,必须理解Android的体系结构,本节将分别从静态和动态两种视角对Android的体系结构进行介绍。

1.2.1 静态视角的体系结构

Android采用了分层的体系结构,各层的结构和功能非常清晰。从上往下看,Android分为四层,分别是:1)应用层,2)应用框架层,3)Android运行环境和系统运行库层,4)Linux内核层,如图1-1所示。

1.2 Android体系结构 - 图1

图 1-1 静态视角的Android体系结构

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所示。

1.2 Android体系结构 - 图2

3.Android运行环境和系统运行库层

Android运行环境和系统运行库层位于Android体系结构的第三层。本层相当于中间件层,为应用框架层提供服务,它分成两个部分:一部分是系统运行库,包含各种系统库和第三方库;另一部分是Android运行环境,这里主要是使用C++和C实现的。

应用框架层为应用层提供的功能,在底层大多是由系统运行库实现的。Android应用层使用的多媒体、浏览器、数据库、图形引擎等,其功能实现均位于该层。

Android应用层的Java程序运行在虚拟机中。Android提供了Dalvik虚拟机以支持Java运行环境。

系统运行库的主要组件如表1-3所示。

1.2 Android体系结构 - 图3

Android运行环境的主要组件如表1-4所示。

1.2 Android体系结构 - 图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所示。

1.2 Android体系结构 - 图5

图 1-2 Android HAL层

注意 引入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包。