1 Android 系统架构
Android 是谷歌开发的一款基于 Linux 内核的操作系统。系统架构分为五层,从下到上依次是 Linux 内核层、硬件抽象层、系统运行库层、应用框架层和应用层。
1.1 Linux 内核层(Linux Kernel)
Android 系统的核心系统服务基于 Linux 内核的,在此基础上添加了部分 Android 专用驱动。系统的安全性、网络协议、内存管理、进程管理、驱动程序都由 Linux 内核所提供。
使用 Linux 内核可以让 Android 利用主要的安全功能,并且允许设备制造商为内核开发硬件驱动程序。
Linux 内核层包括以下组件:
- 音频驱动(Audio Driver):基于 ALSA(Advanced Linux sound architecture)的高级 Linux 声音体系驱动;
- Binder(IPC)Driver:Android 的一个特殊的驱动程序,具有单独的设备节点,提供进程间通信的功能;
- 显示驱动(Display Driver):基于 Linux 的帧缓冲(Frame Buffer)驱动;
- 键盘驱动程序(KeyBoard Driver):为输入设备提供支持;
- 蓝牙驱动(Bluetooth Driver):基于 IEEE802151 标准的无限传输技术;
- 照相机驱动(Camera Dirver):常用的基于 Linux 的 V412(Video for Linux)驱动;
- USB 驱动(USB Driver):提供 USB 设备的连接支持;
- WIFI 驱动(WIFI Driver):基于 IEEE802.|1 标准的驱动程序,可以链接无线网络;
- Flash 内存驱动(Flash Memory Driver):基于MTD 的 Flash 驱动程序区;
- 电源管理(Power management):对电池电量的监控;
另外,Android Runtime(ART)就是依靠 Linux 内核来执行底层功能的,其中包括线程和低层内存管理。
1.2 硬件抽象层(HAL)
HAL(Hardware Abstract Layer)硬件抽象层,是 Google 开发对底层硬件操作屏蔽的一个层次结构,简单来说就是,上层应用不需要关心底层硬件是如何工作的,只需要调用底层提供的统一接口即可。
其实,Android 系统完全可以没有 HAL 层,访问硬件可以通过调用 Linux 内核的标准函数来实现,但是,如何访问 Linux 内核就涉及到了技术专利和商业机密,厂商不想公开源代码,只愿提供二进制代码。而 Linux 内核采用了 GPL 协议,任何人都可以获取或者修改其源代码,因此 Google 在 Android 系统架构中增加了一个 HAL 层,不想公开的代码可以放在这个位置。
另外,HAL 提供标准界面,向更高级别的 Java API 框架显示设备硬件功能。 HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如,相机或蓝牙模块。 当框架 API 要求访问设备硬件时,Android 系统将为该硬件组件加载库模块。
Hardware /ˈhɑːrdwer/( 计算机)硬件;五金制品;装备,设备
abstract /ˈæbstrækt/ 抽象的,纯概念的;
layer /ˈleɪər/ 层;层次,等级;
GPL:GNU(操作系统)通用公共许可证,GPL 授权有以下特点:任何软件挂上 GPL 授权之后,即为自由软件,任何人可以获取、修改其源代码,经过修改后的源代码也要公开。
严格来说,Linux 只是一个操作系统内核,大部分 Linux 发行版都是由操作系统内核加上 GNU 的软件或者工具形成的完整的操作系统,也就是 GNU/Linux。GNU/Linux 是一种 Unix Like 操作系统。
1.3 Android Runtime
运行时库又分为核心库和 ART(Android 5.0 系统之后,Dalvik 虚拟机被 ART 取代)。 核心库提供了 Java 语言核心库的大多数功能,包括 Java 8 语言功能,这样开发者可以使用 Java 语言来编写 Android 应用。
与 JVM 相比,Dalvik 虚拟机(DVM)是专门为移动设备定制的,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个 Dalvik 应用作为一个独立的 Linux 进程执行。
每个应用都在自己的进程中运行,并且有其自己的 ART 实例。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
ART 执行的是 DEX文件。DEX 文件是专门为 Android 设计的字节码文件格式,使用的内存很少。
ART 的机制与 DVM 不同,DVM 中的应用每次运行时,字节码都需要通过即时编译器(Just In Time,JIT)转换为机器码,这会使得应用的运行效率降低。而在 ART 中,系统在安装应用时会进行一次预编译(Ahead Of Time,AOT),将字节码预先编译程机器码并存储在本地,这样应用每次运行时就不需要执行编译了,运行效率也大大提高。
ART 主要的功能包括:
- 预先(AOT Ahead-of-time compiler)和即时(JIT Just-In-Time compiler)编译;
- 优化的垃圾回收(GC);
- 在 Android 9(API 级别 28)以及更高的系统版本中,支持将应用软件包中的 Dalvik Executable 格式(DEX)文件转换为更紧凑的机器代码;
- 更好的调试支持,包括专用采样分析器、详细的诊断异常和崩溃报告,并且能够设置观察点以监控特定字段;
compiler /kəmˈpaɪlər/ 编译器;[计] 编译程序;编辑者,汇编者
如果一个应用可以在 ART 中运行的效果很好,那么,它在 Dalvik 上运行的也很好,但反过来不一定。
1.4 原生 C/C++ 库
许多核心的 Android 系统组件和服务(例如 ART 和 HAL)构建自原生代码,需要用 C/C++ 编写的原生库。 Android 平台提供 Java 框架 API 向应用显示部分原生库的功能。例如,我们可以通过 Andorid 框架的 Java OpenGL API 访问 OpenGL ES,以支持在应用中绘制和操作 2D 和 3D 图形。
如果开发的是需要 C/C++ 代码的应用,可以使用 Andorid NDK 直接从原生代码访问某些原生平台库。
以下是主要的 C/C++ 程序库:
- OpenGL ES: 3D绘图函数库
- Libc: 从 BSD 继承来的标准 C 系统函数库,专门为基于嵌入式 Linux 的设备定制
- Media Framework: 多媒体库,支持多种常用的音频、视频格式录制和回放
- SQLite: 轻型的关系行数据库引擎
- SGL: 底层的 2D 图形渲染引擎
- SSL: 安全套阶层,是一种为网络通信提供安全以及数据完整的安全协议
- FreeType: 可移植的字体引擎,它提供统一的接口来访问多种字体格式文件
1.5 应用框架层(Java API Framework)
应用框架层是为开发人员提供了开发应用程序所需要的 API, 我们平时开发应用程序都是调用着一层所提供的 API ,当然也包括系统应用。这一层是由 Java 代码编写的,可以称为 Java Framework。
开发人员可以通过 Java 语言编写的 API 使用 Android OS 的整个功能集。这些 API 是创建 Android 应用所需的构建块,它们可以简化核心、模块化系统组件和服务的重复使用,包括以下组件和服务:
- 丰富、可扩展的视图系统,可用于构建应用的 UI,包括列表、网格、文本框、按钮甚至可嵌入网络浏览器;
- 资源管理器,用于访问非代码资源,例如本地化的字符串、图形和布局文件;
- 通知管理器:可让所有应用在状态栏中显示自定义提醒;
- Activity 管理器:用于管理应用的生命周期,提供常见的导航返回栈;
- 内容提供程序:可让应用访问其他应用(如,“联系人”应用)中的数据或者共享自己的数据;
以下是具体的系统功能:
- Activity Manager(活动管理器): 管理各个应用程序生命周期,以及常用的导航回退功能;
- Location Manager(位置管理器): 提供地理位置及定位功能服务;
- Package Manager(包管理器): 管理所有安装在 Android 系统中的应用程序;
- Notification Manager(资源管理器): 使得应用程序可以在状态栏中显示自定义的提示信息;
- Resource Manager(资源管理器): 提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等;
- Telephony Manager(电话管理器): 管理所有移动设备功能;
- Window Manager(窗口管理器): 管理所有开启的窗口程序;
- Content Provider(内容提供器): 使得不同应用程序之间可以共享数据;
- View System(视图系统): 构建应用程序的基本组件;
1.6 应用层(System Apps)
Android 随附一套用于电子邮件、短信、日历、互联网浏览和联系人等核心应用。平台随附的应用与用户可以选择安装的应用一样,没有特殊的状态。因此,第三方应用可成为用户的默认网络浏览器、短信 Messenger 甚至默认键盘(也有一些例外,例如系统的“设置”应用)。
系统内置的应用程序以及非系统级别的应用程序都属于应用层,负责与用户进行直接交互,通常都是用 Java 进行开发的。
系统应用可作为用户的应用,开发者也可以在自己的应用中访问其中的功能。例如,如果我们的应用要发送短信,我们无需构建该功能,直接就可以调用已经安装的短信应用向制定的接收者发送消息。
2 计算机硬件系统和软件系统
一个计算机系统由硬件系统和软件系统两部分组成:
ROM(Read-Only Memory):只读存储器,以非破坏性读出方式工作,只能读出无法写入信息。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失,所以又称为固定存储器。ROM 所存的数据通常是装入整机前写入的, 整机工作过程中只能读出,不像随机存储器能快速方便地改写存储内容。ROM 所存的数据稳定,断电后所存的数据也不回改变,并且结构较简单,使用方便,因而常用于存储各种固定程序和数据。
RAM(Random Access Memory):随机存取存储器,也叫主存,是与 CPU 直接交换数据的内部存储器。它可以随时写入(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。RAM 工作时可以随时从任何一个指定的地址写入(存入)或读出(读取)信息。它与 ROM 的最大区别是数据的易失性,即一旦断电所存储的数据将随之丢失。RAM 在计算机和数字系统中用来暂时存储程序、数据和中间结果。