1. Android 系统架构概览:从应用层到内核层的完整软件栈
Android 系统采用分层架构设计,从上到下依次为应用层、应用框架层、系统运行库层、硬件抽象层(HAL)和 Linux 内核层。每一层都为其上层提供明确的接口与服务,同时屏蔽下层的实现细节。理解这一分层结构,是掌握 HAL 层适配的前提。
核心观点:HAL 层是 Android 系统实现“硬件无关性”的关键边界。它将内核驱动与上层框架解耦,使得同一套 Android 系统可以在不同硬件平台上运行,而无需修改上层代码。
1.1 五层架构总览
下表总结了 Android 软件栈各层的核心职责与典型组件:
| 层级 | 核心职责 | 典型组件/技术 | 开发语言 |
|---|---|---|---|
| 应用层 | 用户直接交互的界面与功能 | 系统应用(电话、设置)、第三方 App | Java / Kotlin |
| 应用框架层 | 提供应用开发所需的 API 与系统服务 | ActivityManager、WindowManager、ContentProvider | Java |
| 系统运行库层 | 提供核心库与运行时环境(ART) | libc、WebView、MediaFramework、SQLite | C / C++ |
| 硬件抽象层(HAL) | 定义统一接口,隔离内核驱动差异 | Camera HAL、Audio HAL、Sensor HAL | C / C++ |
| Linux 内核层 | 硬件资源管理与驱动执行 | Display Driver、Touch Driver、Wi-Fi Driver | C |
注意:在 Android 8.0(Oreo)之后,HAL 层被进一步模块化为“Treble”架构,HAL 接口被标准化为 HIDL(HAL Interface Definition Language),实现了 Framework 与 HAL 的独立更新。
1.2 分层架构关系图
下图展示了 Android 完整软件栈的层次关系,以及 HAL 层在其中的桥梁位置:
1.3 HAL 层的核心作用
HAL 层位于系统运行库层与 Linux 内核层之间,其核心作用可以归纳为以下三点:
- 接口标准化:HAL 为每种硬件类型(如 Camera、Audio、Sensor)定义了一套固定的接口函数。上层框架只需调用这些接口,无需关心底层驱动如何实现。
- 驱动隔离:内核驱动直接操作硬件寄存器,与硬件平台强相关。HAL 层将驱动细节封装在共享库(.so)中,即使更换硬件平台,也只需替换对应的 HAL 库,上层代码无需改动。
- 权限与安全边界:HAL 运行在用户空间,内核驱动运行在内核空间。通过 HAL 层,Android 系统可以限制上层应用对硬件的直接访问,避免因驱动漏洞导致系统崩溃。
常见误区:HAL 层不是内核驱动的一部分,也不是应用框架的一部分。它是一个独立的用户空间库层,通过 dlopen 动态加载,由 Android 的 hwservicemanager 或旧版的 hw_get_module 机制管理。
1.4 数据流与调用路径
以 Camera 拍照为例,展示一次硬件操作从应用层到内核层的完整调用路径:
- 应用层:用户点击拍照按钮,Camera App 调用
android.hardware.Camera.takePicture()。 - 应用框架层:CameraService 接收请求,通过 Binder IPC 将调用传递到 Camera HAL 接口。
- HAL 层:Camera HAL 模块(如
camera.xxx.so)实现camera_device_ops_t::take_picture(),调用内核驱动提供的设备节点(如/dev/video0)。 - 内核层:V4L2(Video for Linux 2)驱动接收 ioctl 命令,操作摄像头传感器硬件,返回图像数据。
- 数据回传:图像数据沿原路径返回:内核 → HAL → Framework → App。
下图展示了这一调用路径的流程:
1.5 HAL 层在 Treble 架构中的演进
Android 8.0 引入的 Treble 架构对 HAL 层进行了重大重构,核心变化如下:
| 对比维度 | 传统 HAL(Android 7.x 及之前) | Treble HAL(Android 8.0+) |
|---|---|---|
| 接口定义 | 头文件(.h)约定,无版本管理 | HIDL 文件(.hal)定义,支持版本化 |
| 加载方式 | hw_get_module() 直接 dlopen |
hwservicemanager 注册/发现服务 |
| 更新独立性 | Framework 与 HAL 必须一起更新 | Framework 与 HAL 可独立 OTA 更新 |
| 通信机制 | 直接函数调用(同进程) | Binderized HAL(跨进程)或 Passthrough |
| 安全性 | HAL 运行在 system 进程上下文 | HAL 运行在独立进程,受 SELinux 约束 |
实践提示:本课程后续章节将同时覆盖传统 HAL 与 Treble HAL 的适配方法。对于新项目,建议优先采用 Treble 架构的 HIDL 方式,以获得更好的模块化与可维护性。
1.6 本章小结
- Android 系统分为五层:应用层、应用框架层、系统运行库层、HAL 层、Linux 内核层。
- HAL 层位于用户空间与内核空间之间,提供标准化的硬件访问接口。
- HAL 层的核心价值在于解耦:使上层框架不依赖具体硬件实现,降低移植成本。
- Treble 架构进一步将 HAL 接口标准化为 HIDL,实现了 Framework 与 HAL 的独立演进。
- 理解 HAL 层的位置与作用,是后续进行 HAL 模块开发、驱动对接、性能优化的基础。