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 相机系统中的完整交互链路:
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 中的所有回调。