Android 是一个开源的、基于 Linux 的软件堆栈,专为各种设备和外形规格而创建。图 1 展示了 Android 平台的主要组成部分。

图 1. Android 软件堆栈。
Linux 内核
Android 平台的基础是 Linux 内核。例如,Android Runtime (ART) 依赖于 Linux 内核来提供线程和低级内存管理等底层功能。
使用 Linux 内核使 Android 能够利用关键安全功能,并允许设备制造商为已知的内核开发硬件驱动程序。
硬件抽象层 (HAL)
硬件抽象层 (HAL) 提供了标准接口,将设备硬件功能暴露给更高级别的 Java API 框架。HAL 由多个库模块组成,每个模块都实现特定类型硬件组件的接口,例如相机或蓝牙模块。当框架 API 调用以访问设备硬件时,Android 系统会加载该硬件组件的库模块。
Android 运行时
对于运行 Android 5.0(API 级别 21)或更高版本的设备,每个应用都在其自己的进程中运行,并拥有自己的 Android Runtime (ART) 实例。ART 旨在通过执行 Dalvik 可执行文件格式 (DEX) 文件在低内存设备上运行多个虚拟机,DEX 是一种专门为 Android 设计的字节码格式,已针对最小内存占用进行了优化。诸如 d8
等构建工具会将 Java 源文件编译成 DEX 字节码,这些字节码可以在 Android 平台上运行。
ART 的主要功能包括:
- 预先 (AOT) 和即时 (JIT) 编译
- 优化后的垃圾回收 (GC)
- 在 Android 9(API 级别 28)及更高版本中,将应用软件包的 DEX 文件转换为更紧凑的机器码
- 更好的调试支持,包括专用采样分析器、详细的诊断异常和崩溃报告,以及设置观察点以监控特定字段的能力
在 Android 5.0(API 级别 21)版本之前,Dalvik 是 Android 运行时。如果您的应用在 ART 上运行良好,那么它也可以在 Dalvik 上运行,但反之则不然。
Android 还包含一组核心运行时库,它们提供了 Java 编程语言的大部分功能,包括 Java API 框架使用的一些 Java 8 语言特性。
原生 C/C++ 库
许多核心 Android 系统组件和服务(例如 ART 和 HAL)都是由需要用 C 和 C++ 编写的原生库的原生代码构建的。Android 平台提供 Java 框架 API,将其中一些原生库的功能暴露给应用。例如,您可以通过 Android 框架的 Java OpenGL API 访问 OpenGL ES,从而在应用中添加对绘制和操作 2D 和 3D 图形的支持。
如果您正在开发需要 C 或 C++ 代码的应用,您可以使用 Android NDK 直接从您的原生代码访问其中的一些原生平台库。
Java API 框架
Android 操作系统的所有功能集都通过用 Java 语言编写的 API 提供给您。这些 API 构成了您创建 Android 应用所需的构建块,它们简化了核心模块化系统组件和服务的重用,其中包括:
- 一个丰富且可扩展的视图系统,可用于构建应用的用户界面,包括列表、网格、文本框、按钮,甚至可嵌入的网页浏览器
- 一个资源管理器,提供对非代码资源(例如本地化字符串、图形和布局文件)的访问
- 一个通知管理器,使所有应用都可以在状态栏中显示自定义提醒
- 一个 Activity 管理器,用于管理应用的生命周期并提供通用的导航返回堆栈
- 内容提供器,使应用能够访问其他应用(例如“通讯录”应用)的数据,或共享自己的数据
开发者可以完全访问 Android 系统应用使用的相同框架 API。
系统应用
Android 附带了一组核心应用,用于电子邮件、短信、日历、互联网浏览、联系人等。平台中包含的应用与用户选择安装的应用之间没有特殊地位。因此,第三方应用可以成为用户的默认网页浏览器、短信应用,甚至是默认键盘。也有一些例外情况,例如系统的“设置”应用。
系统应用既可以作为用户应用,也可以提供开发者可以从其自己的应用访问的关键功能。例如,如果您希望您的应用能够发送短信,您无需自行构建该功能。您可以转而调用已安装的短信应用,向您指定的收件人发送消息。