目录
[Android 系统架构](#Android 系统架构)
[1. Android 应用层](#1. Android 应用层)
[2. Android应用框架层](#2. Android应用框架层)
[2.1 Activity Manager (活动管理器)](#2.1 Activity Manager (活动管理器))
[2.2 Window Manager (窗口管理器)](#2.2 Window Manager (窗口管理器))
[2.3 Content Provider (内容提供器)](#2.3 Content Provider (内容提供器))
[2.4 View System(视图系统)](#2.4 View System(视图系统))
[2.5 Notification Manager(通告管理器)](#2.5 Notification Manager(通告管理器))
[2.6 Package Manager (包管理器)](#2.6 Package Manager (包管理器))
[2.7 Telephony Manager(电话管理器)](#2.7 Telephony Manager(电话管理器))
[2.8 Resource Manager (资源管理器)](#2.8 Resource Manager (资源管理器))
[2.9 Location Manager (位置管理器)](#2.9 Location Manager (位置管理器))
[2.10 GTalk Service](#2.10 GTalk Service)
[3. Android 核心库](#3. Android 核心库)
[3.1 Surface Manager](#3.1 Surface Manager)
[3.2 Media Framework](#3.2 Media Framework)
[3.3 SQLite](#3.3 SQLite)
[3.4 OpenGL|ES](#3.4 OpenGL|ES)
[3.5 FreeType](#3.5 FreeType)
[3.6 WebKit](#3.6 WebKit)
[3.7 SGL](#3.7 SGL)
[3.8 SSL](#3.8 SSL)
[3.9 Libc](#3.9 Libc)
[4. Android运行时(Run Time)](#4. Android运行时(Run Time))
[4.1 什么是 Dalvik](#4.1 什么是 Dalvik)
[4.2 什么是ART](#4.2 什么是ART)
[4.3 Dalvik 与 ART 的区别](#4.3 Dalvik 与 ART 的区别)
[5. Linux内核层](#5. Linux内核层)
Android 系统架构
Android 是在 Linux内核的基础上,使用一种可称为"软件层级"的架构组织起来的。"软件层级"架构是指它含有多个层次,而每层都是由多个软件模块或软件库组成。Android的架构共有四层,如图 1-1 所示。
纵观整个Android系统架构,各种开源的软件包和各种主流的编程语言全部都有"用武之地",从下到上,一同构建出了一款移动操作系统。从编程语言的角度来看,如图 1-1 中所示,所有红色部分都是C语言写的:所有绿色部分都是由C++为主,而辅之以C写成的有用的本地库:所有蓝色部分则都是 Java 语言写成的。从开发者的角度来看,如果我们只是开发一般的应用程序,则只需要使用 Java 语言在应用层做开发即可。如果要开发一些个人或公司自用的框架,则同样使用Java在前两层进行开发即可。如果要做 Android系统级开发,则需要深入本地库和Java运行时环境层,使用C++和C进行开发。如果需要开发Android的驱动程序,则需要从Linux内核层开始开发。
图1-1 Android系统架构示意图
1. Android 应用层
应用层是Android设备真正与用户进行交互的一层, Android设备上的应用程序都是运行在这一层的。其中包括Google开发的应用软件,比如电话、短信、电子邮件、浏览器等,也包括一般开发者所开发的应用软件。这一层使用Java作为其开发语言。
2. Android应用框架层
框架层是我们从事 Android开发的基础,很多核心应用程序也是通过这一层来实现其核心功能的。该层简化了组件的重用,开发人员可以直接使用其提供的组件来进行快速的应用程序开发,也可以通过继承而实现个性化的拓展。由于在其下已经运行了Java运行时环境,所以这一层使用Java语言作为开发语言。Android应用框架层主要包含如下内容。
2.1 Activity Manager (活动管理器)
管理各个应用程序生命周期以及通常的导航回退功能。
2.2 Window Manager (窗口管理器)
管理所有的窗口程序。
2.3 Content Provider (内容提供器)
使得不同应用程序之间存取或者分享数据。
2.4 View System(视图系统)
构建应用程序的基木组件.
2.5 Notification Manager(通告管理器)
使得应用程序可以在状态栏中显示自定义的提示信息。
2.6 Package Manager (包管理器)
Android 系统内的程序管理。
2.7 Telephony Manager(电话管理器)
管理所有的移动设备功能。
2.8 Resource Manager (资源管理器)
提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等。
2.9 Location Manager (位置管理器)
提供位置服务。
2.10 GTalk Service
提供Google Talk服务。
3. Android 核心库
本地库是应用程序框架的基础,是连接应用程序框架层与Linux内核层的重要纽带。主要含有以下几个重要的库。
3.1 Surface Manager
执行多个应用程序时候,负责管理显示与存取操作问的互动,另外也负责2D绘图与3D绘图进行显示合成。
3.2 Media Framework
多媒体库,基于PacketVideo OpenCore,支持多种常用的音频、视频格式录制和回放,编码格式包括MPEG4、MP3、H.264、AAC、 ARM.
3.3 SQLite
小型的关系型数据库引擎。
3.4 OpenGL|ES
根据OpenGL ES 1.0 API 标准实现的3D绘图函数库。
3.5 FreeType
提供点阵字与向量字的描绘与显示。
3.6 WebKit
一套网页浏览器的软件引擎。
3.7 SGL
底层的 2D 图形渲染引擎。
3.8 SSL
在Android上通信过程中实现握手。
3.9 Libc
从BSD继承来的标准C 系统函数库,专门为基于嵌入式Linux 的设备定制。
4. Android运行时(Run Time)
Android 应用程序是用 Java 语言编写的,所以 Android 需要一个 Java 的运行时环境,该环境又包括核心库和Dalvik虚拟机两部分。
核心库提供了Java语言API中的大多数功能,同时也包含了Android的一些核心API,如 android.os、android.net、 android.media等等。
Android 程序不同于J2ME 程序。每个 Android 应用程序都有一个专有的进程,并且不是多个程序运行在一个虚拟机中,而是每个Android程序都有一个Dalivik虚拟机的实例,并在该实例中执行。Dalvik虚拟机不是传统的基于栈的虚拟机,而是一种基于寄存器的Java虚拟机,并进行了内存资源使用的优化以及支持多个虚拟机的特点。需要注意的是,个同于J2ME,Android 程序在虚拟机中执行的并非编译后的字节码,而是通过转换工具 dx 将 Java字节码转成 dex 格式的中间码。
注:ART 和Dalvik 的联系和区别:
4.1 什么是 Dalvik
Dalvik 是 Google 公司自己设计用于 Android 平台的 Java 虚拟机。dex 格式是专为 Dalvik应用设计的一种压缩格式,适合于内存和处理器速度有限的系统。Dalvik允许同时运行多个虚拟机的实例,并且每一个应用作为独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
4.2 什么是ART
在 Dalvik 下,应用每次运行都需要通过即时编译器(JIT)将字节码转换为机器码,即每次都要编译加运行,这一机制并不高效,但让应用安装比较快,而且更容易在不同硬件和架构上运行。ART完全改变了这种做法,在应用安装时就预编译字节码到机器语言,在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。ART是在Android 4.4版本之后出现的,用于替代 Dalvik 虚拟机。
4.3 Dalvik 与 ART 的区别
(1)在 Dalvik 下,应用每次运行都需要通过即时编译器(JIT)将字节码转换为机器码,即每次都要编译加运行,这虽然会使安装过程比较快,但是会拖慢应用以后每次启动的效率。而在 ART 环境中,应用在第一次安装的时候,字节码就会预编译(AOT)成机器码,这样的话,虽然设备和应用的首次启动(安装慢了)会变慢,但是以后每次启动执行的时候,都可以直接运行,因此运行效率会提高。
(2)ART 占用空间比 Dalvik 大(字节码变为机器码之后,可能会增加 10%-20%),这也是著名的"空间换时间大法"。
(3)预编译也可以明显改善电池续航,因为应用程序每次运行时不用重复编译了,从而减少了CPU的使用频率,降低了能耗。
5. Linux内核层
Android是在Linux内核的基础上构建的, Android的内核属于Linux内核的一个分支,它并不是GNU/Linux,因为一般在GNU/Linux中被支持的功能,在Android大多没有被支持。众所周知,Linux 是一个开源的操作系统,由非营利的组织------Linux 基金会所管理。虽然Linux是开源的,但是Android必须在GNU GPL (用于保护开源软件的一个授权规范)的许可下使用Linux的源码,才可以商用。所以为了达到商业应用的目的,Android必须去除被GNU GPL所约束的部分。Android去除了Cairo、 X11、 Alsa、 FFmpeg、 GTK、 Pango和Glibe等,并以Bionic取代Glibe,以Skia取代Cairo,以Opencore取代FFmpeg等。Android 并没有用户空间驱动,而是将所有的驱动都放在内核空间中,并以 HAL 隔开版权问题。
目前, Android的Linux内核层包括安全管理、内存管理、进程管理、网络协议栈、驱动程序模型和电源管理等,这些都依赖于Linux内核。由于Linux内核全部使用C语言编写,所以Android的Linux内核层也全部是用C语言编写的。