Android系统运行于Linux kernel之上,但并不等同于GNU/Linux。通常GNU/Linux里支持的功能,Android系统大都不支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被Android系统移除掉了。
Android系统中以Bionic取代Glibc,以Skia取代Cairo,以OpenCORE取代FFmpeg。Android为了达到商业应用,必须移除被GNU GPL授权证所约束的部分,例如Android系统将驱动程序移到Userspace,使得Linux drive与Linux kernel彻底分开。Bionic/Libc/Kernel/并非标准的Kernel header files。Android系统的Kernel header是利用工具由Linux Kernel header所产生的,目的是为了保留常数、数据结构与宏。Android系统的Linux kernel控制包括安全、存储器管理、程序管理、网络堆栈、驱动程序模型等。
操作系统与应用程序之间的沟通桥梁应分为两层:函数层和虚拟机。Bionic是Android对glibc改良的版本。同时包含了Webkit和Surface flinger。所谓的Webkit就是Apple Safari浏览器背后的引擎。Surface flinger是将2D或3D的内容显示到屏幕上。Android使用的工具链(Toolchain)为Google自制Bionic Libc,采用OpenCORE作为基础多媒体框架。Open CORE可分7块:PVPlayer、PVAuthor、Codec、PacketVideo Multimedia Framework、Operating System Compatibility Library、Common、OpenMAX。使用Skia为核心图形引擎,搭配OpenGL/ES,并采用SQLite数据库系统为多媒体数据库。Skia与Linux Cairo功能相当,相较于Linux Cairo,Skia还只是雏形。2005年,Skia公司被Google收购,2007年初,Skia GL源码被公开,Skia也成为了Google Chrome的图形引擎。
Android的中间层多以Java实现,并且采用特殊的Dalvik虚拟机。Dalvik虚拟机是一种“暂存器形态”的Java虚拟机,变量皆存放于暂存器中,虚拟机的指令相对较少。Dalvik虚拟机可以有多个实例,每个Android应用程序都由一个自属的Dalvik虚拟机来运行,让系统在运行程序时可达到优化。Dalvik虚拟机并非运行Java字节码,而是运行一种称为.dex格式的文件。
Android系统的硬件相关操作被封装到硬件抽象层之中。Android的HAL能以封闭源码的形式提供硬件驱动模块。HAL的目的是为了把Android framework与Linux kernel隔开,让Android不至于过度依赖Linux kernel,以达成Kernel independent的概念,也让Android framework的开发能在不考虑驱动程序实现的前提下发展。
HAL Stub是一种代理人的概念,Stub以*.so文件的形式存在。Stub向HAL“提供”操作函数,并在Android运行时向HAL取得Stub的操作,再调用这些操作函数。HAL里包含了许多的Stub。Runtime只要说明类型,即Module ID,就可以取得操作函数。
有些应用程序需要进行大量的数据计算。这种情况下Java的工作效率就会成为应用程序性能的瓶颈。为了使用C/C++语言编写的高效函数库,Java提供了JNI接口。从Java1.1开始,Java Native Interface(JNI)标准成为Java平台的一部分,它允许Java代码与用其他语言编写的代码进行交互。
Android系统提供了如下的Java库。
android.util涉及系统底层的辅助类库。
android.os提供了系统服务、消息传输、IPC管道。
android.graphics GPhone图形库,包含了文本显示、输入输出、文字样式。
android.database包含底层的API操作数据库(SQLite)。
android.content提供各种数据传输、服务、资源管理。
android.view提供基础的用户界面接口框架。
android.widget显示各种控件,如按钮、列表框、进度条等。
android.app提供高层的程序模型及基本的运行环境。
android.provider各种定义变量标准。
android.telephony提供与拨打电话相关的API交互。
android.webkit默认浏览器操作接口。
Android的核心工程包含了对Android系统基本运行的支持,以及Android系统的编译系统,工程的内容包括bionic、bootloader、build、dalvik、development、framework/base、frame-work/policies/base、hardware/libhardware、hardware/ril、kernel、prebuilt、system/core和system/extras等。
Android的扩展工程包含在external文件夹中,是一些经过修改后适应Android系统的开源工程。有一些工程在主机上运行,也有些在目标机上运行。工程名称及描述如表3-1所示。
表3-1 工程名称及其含义
Android中的Java程序包主要包括应用程序和内容提供器两个部分,应用程序在package/apps目录中,主要包括以下内容:
AlarmClock 闹铃
Browser 浏览器
Calculator 计算器
Calendar 日历
Camera 相机
Contacts 联系人
E-mail 电子邮件
GoogleSearch Google搜索服务
HTML Viewer 网页查看器
IM 即时通信
Launcher 程序加载器
Mms 短信息
Music 音乐
PackageInstaller 包管理器
Phone 电话
Settings 设置
SoundRecorder 录音机
Stk SIM卡工具
Sync 同步服务
Updater 自动更新
VoiceDialer 语音拨号
内容提供器在package/providers目录中,主要包括以下内容:
CalendarProvider
ContactsProvider
DownloadProvider
DrmProvider
GoogleContactsProvider
GoogleSubsribedFeedsProvidercImProvider
MediaProvider
SettingsProvider
SubscribedFeedsProvider
TelephonyProvider