Android 是一个开源的基于 Linux 的软件栈,它为各种设备和外形规格而创建。图 1 显示了 Android 平台的主要组件。
Linux 内核
Android 平台的基础是 Linux 内核。例如,Android 运行时 (ART) 依赖于 Linux 内核来实现底层功能,例如线程和低级内存管理。
使用 Linux 内核使 Android 能够利用关键安全功能,并允许设备制造商为众所周知的内核开发硬件驱动程序。
硬件抽象层 (HAL)
硬件抽象层 (HAL) 提供标准接口,将设备硬件功能公开给更高级别的Java API 框架。HAL 由多个库模块组成,每个模块都实现特定类型硬件组件(例如摄像头或蓝牙模块)的接口。当框架 API 调用访问设备硬件时,Android 系统会加载该硬件组件的库模块。
Android 运行时
对于运行 Android 5.0(API 级别 21)或更高版本的设备,每个应用都在其自身的进程中运行,并具有其自身的Android 运行时 (ART) 实例。ART 旨在通过执行 Dalvik 可执行文件 (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 框架
您可以通过用 Java 语言编写的 API 访问 Android 操作系统的全部功能集。这些 API 构成了创建 Android 应用所需的构建块,方法是简化对核心模块化系统组件和服务的重用,其中包括:
- 您可以用来构建应用 UI 的丰富且可扩展的视图系统,包括列表、网格、文本框、按钮,甚至可嵌入式网络浏览器
- 提供对非代码资源(例如本地化字符串、图形和布局文件)访问的资源管理器
- 使所有应用都能在状态栏中显示自定义警报的通知管理器
- 管理应用生命周期并提供通用导航返回堆栈的活动管理器
- 使应用能够访问其他应用(例如“联系人”应用)的数据或共享自身数据的内容提供程序
开发者可以完全访问 Android 系统应用使用的相同的框架 API。
系统应用
Android 附带一组用于电子邮件、短信、日历、互联网浏览、联系人等的核心应用。包含在平台中的应用在用户选择安装的应用中没有特殊地位。因此,第三方应用可以成为用户的默认网络浏览器、短信应用,甚至是默认键盘。某些例外情况适用,例如系统的“设置”应用。
系统应用既充当用户的应用,也提供开发者可以从其自身应用中访问的关键功能。例如,如果您希望您的应用发送短信,则无需自己构建该功能。您可以改为调用已安装的任何短信应用来将消息发送给您指定的收件人。