1.3 系统结构和代码结构
对Android系统结构的了解,可以从其软件系统架构和开源工程的源代码结构两个方面进行了解。
↘ 1.3.1 软件系统结构
1.Android的软件层次
按照自下而上的结构,Android的软件系统分成4个层次。
● 第1层次:操作系统层(Linux kernel)。Android系统基于Linux操作系统,第1层次为Linux内核和相关驱动。不同硬件平台使用不同的内核。
● 第2层次:库(Libraries)和运行环境(Android Runtime)。包括各个本地的C语言和C++库,可能来自开源工程或者Android的原创。运行环境包括C++语言实现的虚拟机(Dalvik Virtual Machine)和Java核心类(Core Libraries)。
● 第3层次:应用程序框架(Application Framework)。Android原创Java框架层,由几个Java库组成。
● 第4层次:应用程序(Applications)。由Java代码、资源文件、工程描述文件生成的各个单独的应用程序包。
Android的软件结构如图1-2所示。
从宏观上说,Android的第1层次由C语言实现,第2层次由C和/C++实现,第3、4层次主要由Java代码实现。
● Android的操作系统也就是嵌入式Linux的内核和相关驱动程序,使用C语言编写,从操作系统的角度运行于内核空间。
● 库(又称为本地框架)和Java虚拟机实际上是本地层的程序,使用C语言和C++编写,从操作系统的角度运行于用户空间。
● 应用程序框架(又称为Java框架)和应用程序使用Java语言编写,从操作系统的角度运行于用户空间。
图1-2 Android系统的层次结构
Android几个层次之间的主要关系如下所示。
● 第1层次和第2层次之间,从Linux操作系统的角度来看,是内核空间与用户空间的分界线,第1层次运行于内核空间,第2、3、4层次运行于用户空间。
● 第2层次和第3层次之间,是本地代码层和Java代码层的接口。
● 第3 层次和第4 层次之间,是Android框架层和应用程序两层Java程序的接口,Android的系统API属于其中的一部分。
2.框架层的主干
在Android四个层次的系统架构中,第2层本地框架层和Android运行环境,第3层Java框架层,均属于框架层的概念中。
框架层部分是Android开源工程中占据内容比重较大的。在Android庞大的框架层中,存在着一个主干部分和若干非主干部分。主干部分是Android系统的核心,主干部分的不同层次具有紧密的联系,非主干部分属于各种相对独立的功能模块。
Android的主干部分主要包括以下方面。
● C/C++基础库:提供标准的C语言和C++的编程支持。
● C语言的工具库:提供Android的特定的纯C语言的工具支持。
● init可执行程序及其执行的脚本init.rc:作为用户空间第1个进程。
● C++的工具库:提供Android的C++特殊编程支持。
● Binder库和servicemanager可执行程序:提供主要IPC机制支持。
● 几个本地可执行程序:作为守护进程服务于Android。
● Dalvik虚拟机:负责执行字节码。
● Java核心库:提供标准Java语言的支持。
● Java框架库:提供Android的各个Java类库。
● Java框架资源包:提供Android Java框架层的资源。
● Java服务库:提供Android Java框架层的系统服务。
以上的各个方面,基本在软件层次中是自下而上的排列方式。其中连接本地框架层和Java框架层的是JNI(Java本地调用)机制。
↘ 1.3.2 源代码结构
1.工程的分类
按照Google的Android网站的描述,Android全部代码的工程分为3个部分。
● 核心工程(Core Project):建立Android系统的基础,在源代码根目录的几个主要的目录中,Linux内核也属于Android的核心工程。
● 扩展工程(External Project):使用其他开源项目实现的各个功能,在源代码的external目录中。
● 包(Package):提供Android的应用程序包,包括综合应用程序、内容提供者、输入法、墙纸系统等,在源代码的package目录中。
2.根目录的结构
Android源代码的根目录的内容如表1-1所示。
表1-1 Android源代码的根目录结构
Android的源代码是一个庞大的目录,包括了Java、C和C++等语言的代码,支持脚本,开发的二进制工具等多方面的内容。Android源代码中核心的框架部分的几个重要目录如下所示。
● system/core/:一个基本Linux系统用户空间的内容。
● frameworks/base/include/:本地框架层的头文件。
● frameworks/base/libs/:本地框架层的源文件。
● frameworks/base/core/java:Java框架库中主体的Java部分。
● frameworks/base/core/res:Java框架资源包。
● frameworks/base/core/jni:Java框架库中主体的JNI部分。
● frameworks/base/services/java:Java服务库的Java部分。
● frameworks/base/services/jni:Java服务库的JNI部分。
● dalvik和libcore:作为Android运行环境虚拟机和Java核心库。
以上几个部分也是Android开源工程中原创性较强的几个部分,也是整个Android系统的核心和精华。
3.扩展工程中的内容
Android的扩展工程,也就是external目录中包含了众多工程。它们大都来自第三方,而非Android开源工程的原创。
external目录中的内容大部分负责引擎(engine)的职责,运行于Android提供的较低层,处于被调用的地位,其中几个主要的部分如下所示。
● Skia:图形引擎。
● SQLite:数据库系统。
● FreeType:字体引擎。
● Webkit:浏览器引擎。
● 多媒体引擎。
external目录中的扩展工程如表1-2所示。
表1-2 Android的扩展工程
续表
续表
external中有些工程是没有包含在默认的开源工程当中的,也是默认的repo sync不能获得这些源代码,但是可以通过git clone得到。