平台架构
https://developer.android.com/guide/platform?hl=zh-cn
从下到上依次分为:
- Linux内核层
- 硬件抽象层 HAL
- 系统运行库层
- Java API 框架
- 系统应用
每一层都包含大量的子模块或子系统。
Linux内核层 (Linux Kernel)
Android 平台的基础是 Linux 内核。例如,Android Runtime (ART) 依靠 Linux 内核来执行底层功能,例如线程和低层内存管理。
使用 Linux 内核可让 Android 利用主要安全功能,并且允许设备制造商为著名的内核开发硬件驱动程序。
Android平台以Linux内核为基础,避开了直接与硬件打交道,为驱动开发提供了高度扩展性和易用性,大大降低了 Android 系统移植工作的难度。
硬件抽象层 (Hardware Abstract Layer,HAL)
硬件抽象层 (HAL) 提供标准界面,向更高级别的 Java API 框架显示设备硬件功能。HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如相机或蓝牙模块。当框架 API 要求访问设备硬件时,Android 系统将为该硬件组件加载库模块。
Linux内核层与HAL层共同实现了对硬件的支持。其中HAL层运行在用户空间(User Space),而Linux内核驱动程序运行在内核空间(Kernel Space)。为什么不把它们整合起来放到内核空间呢?技术角度是可以实现的,然而商业角度上会损害硬件厂商的利益。Linux内核源代码版权遵循GNU License(发布产品时必须公布源代码),而Android源代码版权遵循Apache License(发布产品时无须公布源代码)。
也就是说,Android放在内核空间的驱动程序对硬件的支持是不完整的,因此被踢出Linux内核主线代码树。
系统运行库层
这一层中包含了支撑整个系统正常运行的基础库,由系统类库和Android运行时组成。由于这些库多数由C/C++实现,因此也被一些开发人员称为“C库层”,以区别应用程序框架层。
原生 C/C++ 库 (Native C/C++ Libraries)
许多核心 Android 系统组件和服务(例如 ART 和 HAL)构建自原生代码,需要以 C 和 C++ 编写的原生库。Android 平台提供 Java 框架 API 以向应用显示其中部分原生库的功能。例如,您可以通过 Android 框架的 Java OpenGL API 访问 OpenGL ES,以支持在应用中绘制和操作 2D 和 3D 图形。
如果开发的是需要 C 或 C++ 代码的应用,可以使用 Android NDK 直接从原生代码访问某些原生平台库。
名称 | 简介 |
---|---|
Webkit | 一个开源的Web浏览器引擎 |
OpenMAX AL | 一个不需要授权、跨平台的软件抽象层,以C语言实现的软件接口,用来处理多媒体。 |
Libc | Linux下的ANSI C的函数库 |
Media Framework | 基于PacketVideo的OpenCORE的多媒体库,支持多种常见音视频格式的录制和播放 |
OpenGL ES | 免授权费的,跨平台的,功能完善的2D和3D图形应用程序接口API,主要针对多种嵌入式系统专门设计 |
Android运行时 (Android Runtime)
对于运行 Android 5.0(API 级别 21)或更高版本的设备,每个应用都在其自己的进程中运行,并且有其自己的 Android Runtime (ART) 实例。ART 编写为通过执行 DEX 文件在低内存设备上运行多个虚拟机,DEX 文件是一种专为 Android 设计的字节码格式,经过优化,使用的内存很少。编译工具链(例如 Jack)将 Java 源代码编译为 DEX 字节码,使其可在 Android 平台上运行。
ART 的部分主要功能包括:
预先 (AOT) 和即时 (JIT) 编译
优化的垃圾回收 (GC)
在 Android 9(API 级别 28)及更高版本的系统中,支持将应用软件包中的 Dalvik Executable 格式 (DEX) 文件转换为更紧凑的机器代码。
更好的调试支持,包括专用采样分析器、详细的诊断异常和崩溃报告,并且能够设置观察点以监控特定字段
在 Android 版本 5.0(API 级别 21)之前,Dalvik 是 Android Runtime。如果您的应用在 ART 上运行效果很好,那么它应该也可在 Dalvik 上运行,但反过来不一定。
Android 还包含一套核心运行时库,可提供 Java API 框架所使用的 Java 编程语言中的大部分功能,包括一些 Java 8 语言功能。
Java API 框架 (Java API Framework)
您可通过以 Java 语言编写的 API 使用 Android OS 的整个功能集。这些 API 形成创建 Android 应用所需的构建块,它们可简化核心模块化系统组件和服务的重复使用,包括以下组件和服务:
- 丰富、可扩展的视图系统,可用以构建应用的 UI,包括列表、网格、文本框、按钮甚至可嵌入的网络浏览器
- 资源管理器,用于访问非代码资源,例如本地化的字符串、图形和布局文件
- 通知管理器,可让所有应用在状态栏中显示自定义提醒
- Activity 管理器,用于管理应用的生命周期,提供常见的导航返回栈
- 内容提供程序,可让应用访问其他应用(例如“联系人”应用)中的数据或者共享其自己的数据
开发者可以完全访问 Android 系统应用使用的框架 API。
与"C库层"对应,这一层往往被称作“Java库层”。一方面为上层应用层提供API接口,另一方面也是不少系统级服务进程的实现,是与Android应用开发者关系最直接的一层。提供了开发Android应用程序所需的一系列类库,高度封装直接调用。应用框架层的主要实现代码在frameworks/base和frameworks/av目录下。
系统应用 (System Apps)
Android 随附一套用于电子邮件、短信、日历、互联网浏览和联系人等的核心应用。平台随附的应用与用户可以选择安装的应用一样,没有特殊状态。因此第三方应用可成为用户的默认网络浏览器、短信 Messenger 甚至默认键盘(有一些例外,例如系统的“设置”应用)。
系统应用可用作用户的应用,以及提供开发者可从其自己的应用访问的主要功能。例如,如果您的应用要发短信,您无需自己构建该功能,可以改为调用已安装的短信应用向您指定的接收者发送消息。
源码根目录中的packages目录对应着系统应用,其中:
- apps 核心应用程序
- experimental 第三方应用程序
- inputmethods 输入法目录
- providers 内容提供者目录
- screensavers 屏幕保护
- services 通信服务
- wallpaper 墙纸