1. Camera HAL 概述:Android 相机系统的分层架构

Camera HAL(Hardware Abstraction Layer)是 Android 相机子系统中连接 Framework 与 内核驱动 的关键中间层。它定义了统一的硬件操作接口,使上层应用无需关心具体传感器、ISP 或平台差异。理解 HAL 的位置与作用,是进行 Camera HAL 开发的前提。

1.1 Camera HAL 在 Android 系统中的位置

从软件栈角度看,Camera HAL 位于 Android Framework(Java/Native 层)与 Linux 内核驱动 之间。其核心职责是:

  • 向上:实现 camera_device_t 或 ICameraDevice 接口,响应 Framework 的打开、预览、拍照、流配置等请求。
  • 向下:通过 V4L2、I²C、SPI 等内核接口控制摄像头传感器、闪光灯、对焦马达等硬件。
关键概念: HAL 层屏蔽了不同 SoC(如 Qualcomm、MediaTek、Rockchip)的硬件差异,使同一套 Android Framework 代码可适配多种摄像头模组。

1.2 Camera HAL 与 Framework、内核驱动的交互关系

下图展示了 Camera HAL 在 Android 相机系统中的完整交互链路:

Camera HAL 在 Android 相机系统中的位置与交互关系 应用层 (Camera App / 第三方 App) Android Framework (CameraManager / CameraService) Camera HAL (HAL3 / HAL1 实现) Linux 内核驱动 (V4L2 / Sensor / ISP 驱动) 硬件设备 (Camera Sensor / ISP / Flash / Actuator) 通过 AIDL / HIDL 调用 Camera API2 / API1 实现 camera_device_t 或 ICameraDevice 通过 ioctl / read / write 操作 V4L2 设备节点 请求 / 回调 / 元数据 帧数据 / 控制命令

1.3 HAL 层与 Framework 的交互机制

Camera HAL 与 Framework 之间通过 HIDL(Android 8.0+)或 AIDL(Android 13+)接口进行通信。核心交互流程如下:

步骤 Framework 侧 HAL 侧 说明
1 CameraManager.openCamera() open() / init() 建立 HAL 设备会话
2 CameraCaptureSession.setRepeatingRequest() process_capture_request() 下发预览/拍照请求
3 CameraDevice.CaptureCallback notify() / process_capture_result() 返回帧结果与元数据
4 CameraManager.closeCamera() close() / flush() 释放资源、停止流
开发提示: 在 HAL3 架构下,Framework 通过 camera3_callback_ops_t 接收 HAL 异步回调。务必保证回调线程安全,避免死锁或帧丢失。

1.4 HAL 层与内核驱动的交互方式

Camera HAL 通过 V4L2(Video for Linux 2)框架与内核驱动交互,这是 Linux 平台上最通用的摄像头驱动模型。典型操作包括:

  • 打开设备:open("/dev/video0", O_RDWR)
  • 查询能力:ioctl(fd, VIDIOC_QUERYCAP, &cap)
  • 设置格式:ioctl(fd, VIDIOC_S_FMT, &fmt)
  • 请求缓冲区:ioctl(fd, VIDIOC_REQBUFS, &req)
  • 入队/出队帧:ioctl(fd, VIDIOC_QBUF, &buf) / VIDIOC_DQBUF
  • 流控制:ioctl(fd, VIDIOC_STREAMON, &type) / VIDIOC_STREAMOFF
// 典型 V4L2 帧采集流程(伪代码)
int fd = open("/dev/video0", O_RDWR);
struct v4l2_format fmt = {0};
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 1920;
fmt.fmt.pix.height = 1080;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_NV12;
ioctl(fd, VIDIOC_S_FMT, &fmt);

struct v4l2_requestbuffers req = {0};
req.count = 4;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
ioctl(fd, VIDIOC_REQBUFS, &req);

// 映射缓冲区、入队、启动流、循环 DQBUF/QBUF...
ioctl(fd, VIDIOC_STREAMON, &type);

1.5 Camera HAL 版本演进与选择

Android 相机 HAL 经历了从 HAL1 到 HAL3 的演进,目前主流平台均使用 HAL3(camera3_device_t)。下表对比了关键差异:

特性 HAL1 HAL3
架构模式 同步、阻塞式 异步、流水线式
帧控制粒度 粗粒度(预览/拍照切换) 逐帧控制(per-frame settings)
元数据支持 有限 完整(android.* 元数据)
多流支持 不支持 支持(同时输出不同分辨率/格式)
适用场景 低端平台、兼容模式 主流 Android 设备、Camera2 API
注意: 从 Android 10 开始,Google 已弃用 HAL1 支持。新项目应直接基于 HAL3 开发,并实现 camera3_device_ops_t 中的所有回调。

1.6 本章小结