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 层在其中的桥梁位置:

Android 系统分层架构与 HAL 位置 应用层 (Application Layer) 系统应用 · 第三方 App · Launcher 应用框架层 (Application Framework) ActivityManager · WindowManager · ContentProvider 系统运行库层 (Libraries & Runtime) libc · WebView · MediaFramework · ART 硬件抽象层 (HAL) ★ 本章核心 Camera HAL · Audio HAL · Sensor HAL · GPS HAL Linux 内核层 (Kernel) Display Driver · Touch Driver · Wi-Fi Driver · I2C/SPI 解耦 边界 硬件 无关

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 拍照为例,展示一次硬件操作从应用层到内核层的完整调用路径:

  1. 应用层:用户点击拍照按钮,Camera App 调用 android.hardware.Camera.takePicture()。
  2. 应用框架层:CameraService 接收请求,通过 Binder IPC 将调用传递到 Camera HAL 接口。
  3. HAL 层:Camera HAL 模块(如 camera.xxx.so)实现 camera_device_ops_t::take_picture(),调用内核驱动提供的设备节点(如 /dev/video0)。
  4. 内核层:V4L2(Video for Linux 2)驱动接收 ioctl 命令,操作摄像头传感器硬件,返回图像数据。
  5. 数据回传:图像数据沿原路径返回:内核 → HAL → Framework → App。

下图展示了这一调用路径的流程:

Camera 拍照调用路径 Camera App CameraService Camera HAL V4L2 驱动 图像数据 数据回传路径(虚线) 关键点 HAL 层是用户空间与内核空间的唯一桥梁,负责协议转换与数据封装

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 模块开发、驱动对接、性能优化的基础。