2. Android相机系统架构:从App到Kernel的完整数据流

Android相机系统是一个典型的分层架构,从上至下依次为:应用层(App) → 框架层(Framework) → 硬件抽象层(HAL) → 内核层(Kernel)。每一层都承担着明确的职责,并通过标准化的接口进行通信。理解这一完整的数据流和关键组件,是掌握Camera HAL开发的基石。

核心要点: Android相机架构的设计哲学是“接口隔离,职责单一”。App只关心拍照/录像的语义,Framework负责协调资源与权限,HAL屏蔽硬件差异,Kernel驱动物理设备。这种分层使得OEM厂商可以独立升级HAL实现,而不影响上层应用。

2.1 四层架构总览与数据流方向

一次完整的相机操作(例如拍照),数据流会经历“请求下发”和“数据回传”两个方向。下图展示了从App发起请求到最终获取图像的完整路径。

Android相机系统四层架构与数据流 Android相机系统四层架构与数据流 应用层 (App) Camera2 API / Camera1 API 请求下发 框架层 (Framework) CameraService / CameraProvider CameraDeviceClient / CameraMetadata HAL接口调用 硬件抽象层 (HAL) Camera HAL 3.x / Camera HAL 1.0 V4L2 / 私有驱动接口 内核层 (Kernel) Camera Sensor Driver / ISP Driver / V4L2 数据回传 (图像帧)
数据流双向性: 请求(Request)是自上而下传递的,而图像数据(Buffer)是自下而上回传的。HAL层是这两条路径的交汇点,也是性能优化的关键位置。

2.2 关键组件详解

2.2.1 CameraService(框架层核心)

CameraService 是Android系统中相机子系统的“大管家”,运行在 cameraserver 进程中。它负责管理所有相机设备、处理来自App的绑定请求、协调权限检查、以及生命周期管理。

  • 职责: 相机设备枚举、打开/关闭设备、创建CameraDeviceClient、分发请求、处理回传数据。
  • 进程: 独立进程 /system/bin/cameraserver,通过Binder与App通信。
  • 关键文件: frameworks/av/services/camera/libcameraservice/

2.2.2 CameraProvider(HAL服务封装)

CameraProvider 是Android 8.0(Treble项目)引入的关键组件,它将HAL实现从CameraService中解耦出来,运行在独立的进程中。CameraProvider通过HIDL(Android 8-10)或AIDL(Android 11+)接口与CameraService通信。

特性 CameraProvider(Treble架构) 传统架构(Pre-Treble)
进程模型 独立进程(vendor分区) 与CameraService同进程
接口定义 HIDL / AIDL(稳定、版本化) 直接调用HAL共享库
升级影响 可独立升级HAL,不影响Framework 升级HAL需同步升级系统镜像
安全性 进程隔离,SELinux策略更严格 共享进程空间,风险较高

2.2.3 Camera HAL(硬件抽象层)

Camera HAL 是连接Framework与硬件驱动的桥梁。Android目前主要支持两代HAL接口:HAL 1.0(旧式,已废弃)和 HAL 3.x(当前主流)。HAL 3.x 引入了Pipeline模型,支持更灵活的请求/响应模式。

版本选择: 新项目必须使用HAL 3.x。HAL 1.0仅用于兼容老旧设备,不支持多摄像头、高速连拍、YUV reprocessing等高级特性。

2.3 完整数据流时序(以HAL 3.x拍照为例)

下面以一次典型的拍照请求为例,展示数据在四层之间的完整流转时序。

拍照请求完整数据流时序图 拍照请求完整数据流时序图(HAL 3.x) 时间 App CameraService Camera HAL Kernel Driver ① openCamera() ② 权限检查 + 创建Client ③ configureStreams() ④ createCaptureRequest() ⑤ 构建CaptureRequest ⑥ capture() ⑦ processCaptureRequest() ⑧ 下发到驱动 ⑨ 硬件捕获完成 ⑩ processCaptureResult() ⑪ 回调onCaptureCompleted() ⑫ 获取图像数据

2.4 关键接口与数据结构

在数据流中,有几个核心的数据结构和接口是开发者必须掌握的:

数据结构/接口 所属层 说明
CaptureRequest Framework → HAL 包含拍照参数(AE/AF/AWB、输出目标Surface等)
CaptureResult HAL → Framework 包含实际使用的参数、时间戳、人脸检测结果等元数据
StreamConfiguration Framework ↔ HAL 定义输出流的格式、分辨率、数据空间(如YUV、JPEG、RAW)
camera_metadata_t Framework / HAL 键值对元数据容器,用于传递所有参数和结果
buffer_handle_t HAL → Kernel 图形缓冲区句柄,通过ION/Gralloc分配

2.5 数据流中的Buffer管理

图像数据(Buffer)的传递是性能敏感路径。Android使用 Gralloc 和 ION 内存分配器来管理图形缓冲区。Buffer的传递路径如下:

  1. 分配: HAL通过Gralloc分配Buffer,通常来自ION(连续物理内存)或DMA-BUF。
  2. 填充: Kernel驱动将Sensor数据写入Buffer(通过V4L2或私有驱动)。
  3. 传递: HAL将填充好的Buffer通过 processCaptureResult 回传给Framework。
  4. 消费: Framework将Buffer交给SurfaceFlinger合成显示,或交给MediaCodec编码。
  5. 回收: Buffer消费完成后,Framework通过 returnBuffer 通知HAL回收复用。
性能关键点: Buffer的分配和回收路径必须避免内存拷贝。HAL 3.x 要求使用 dequeueBuffer/queueBuffer 机制实现零拷贝传递。如果HAL实现中出现了memcpy,通常意味着性能瓶颈。

2.6 各层通信机制总结

通信对 通信机制 关键接口/协议
App ↔ CameraService Binder(Android IPC) android.hardware.ICameraService
CameraService ↔ CameraProvider HIDL / AIDL(Treble IPC) android.hardware.camera.provider@2.4 (HIDL) / ICameraProvider (AIDL)
CameraProvider ↔ HAL 直接函数调用(dlopen) camera_module_t / camera3_device_t
HAL ↔ Kernel Driver 系统调用(ioctl/mmap/poll) V4L2 / 私有字符设备驱动

2.7 本章小结

Android相机系统架构的核心设计思想是 分层解耦:

  • App层 通过Camera2 API发起语义化的拍照/录像请求。
  • Framework层 的CameraService负责协调资源、权限和生命周期;CameraProvider将HAL实现隔离到独立进程。
  • HAL层 是真正的硬件抽象边界,实现具体的图像处理Pipeline。
  • Kernel层 驱动物理Sensor和ISP,完成最底层的硬件控制。