第九板块:Android 多媒体体系 | 第二十四篇:Camera Service 与 HAL3 成像流水线
所属板块:第九板块 — Android 多媒体体系
前置知识:第二十三篇中的 AudioFlinger 音频架构、Linux 内核驱动(V4L2)、Binder IPC、内存共享机制(Ashmem/ION)、SurfaceFlinger 显示合成
本篇定位:这是 Android 设备视觉采集的精密仪器。如果说屏幕是输出,那么相机就是最高带宽的输入。本篇将彻底拆解 Camera Service 的架构、HAL3 (Camera HAL 3.x) 的请求/响应模型、Capture Request 的流水线化处理、3A 算法(AF/AE/AWB) 的控制闭环、RAW 域与 YUV 域 的图像处理流程。我们将深入 Camera HAL Interface、Kernel V4L2 Driver 与 Framework Service,揭示 Android 如何在 30ms 内完成从光子到比特的转换。
1. 核心结论先行(Thesis Statement)
Android 的相机系统是一个基于流水线的请求-响应系统。
- Camera Service 的本质:相机资源的仲裁者与调度器。它运行在 System Server 中,管理物理相机设备的生命周期,接收应用层的
CaptureRequest,并将其转换为 HAL 层能理解的指令。 - HAL3 的本质:无状态的流水线。它抛弃了旧的 API 模型,采用请求驱动的模式。应用发送一个
CaptureRequest(包含参数和输出 Surface),HAL 处理并返回CaptureResult(包含元数据和图像缓冲区)。 - 成像的本质:光信号 -> 电信号 -> 数字信号 -> 图像处理。这是一个从 Sensor (RAW) 经过 ISP (Image Signal Processor) 处理,最终输出 YUV/JPEG 的过程。
- 零拷贝的本质:跨进程共享内存。应用通过
Surface提供缓冲区(Buffer),Camera Service 将图像数据直接写入这些缓冲区,避免数据拷贝。
2. 相机架构全景图
2.1 从应用预览到 Sensor 曝光
graph TB
subgraph App ["应用进程"]
CamAPI["Camera2 API"]
Preview["Preview Surface (SurfaceView/TextureView)"]
Capture["Capture Surface (ImageReader)"]
end
subgraph SystemServer ["System Server"]
CamService["CameraService"]
CamDevice["CameraDeviceClient"]
end
subgraph HAL ["硬件抽象层"]
HAL3["Camera HAL 3.x"]
ISP["ISP (图像信号处理)"]
end
subgraph Kernel ["Linux 内核"]
V4L2["V4L2 Driver"]
SubDev["Sub-devices (Sensor/Lens/Flash)"]
end
subgraph Hardware ["硬件模组"]
Sensor["CMOS Sensor"]
Lens["镜头"]
Flash["闪光灯"]
end
CamAPI -->|"1. createCaptureSession()"| CamService
CamService -->|"2. 配置 Stream"| HAL3
CamAPI -->|"3. submitCaptureRequest()"| CamDevice
CamDevice -->|"4. processCaptureRequest()"| HAL3
HAL3 -->|"5. 配置寄存器"| V4L2
V4L2 -->|"6. 控制硬件"| SubDev
SubDev -->|"7. 曝光/对焦"| Sensor
Sensor -->|"8. 光子 -> 电子"| ISP
ISP -->|"9. 图像处理 (Bayer -> YUV)"| HAL3
HAL3 -->|"10. 填充 Buffer"| CamDevice
CamDevice -->|"11. onCaptureCompleted()"| CamAPI
CamAPI -->|"12. 图像数据"| Preview
CamAPI -->|"13. 图像数据"| Capture
2.2 核心组件职责表
| 组件 | 层级 | 职责 | 学术定义 |
|---|---|---|---|
| CameraService | Framework | 仲裁者 | 管理相机设备,处理并发访问,分发请求。 |
| CameraDeviceClient | Framework | 会话管理者 | 代表一个应用打开的相机设备,管理 Capture Session。 |
| HAL3 (ICameraDevice) | HAL | 执行者 | 厂商实现的接口,接收 Request,返回 Result。 |
| RequestProcessor | HAL | 流水线调度 | 将 Request 分解为 ISP 可以执行的原子操作。 |
| Metadata | 通用 | 配置与反馈 | 键值对(Key-Value),用于配置参数(AE_MODE)和返回状态(SENSOR_EXPOSURE_TIME)。 |
3. HAL3 的请求-响应模型
3.1 CaptureRequest 的构成
应用发送的每一个请求都是一个完整的指令集。
| 组成部分 | 学术定义 | 示例 |
|---|---|---|
| Target Surfaces | 输出目标 | Preview Surface, Capture Surface, Analysis Surface。 |
| Parameters (Metadata) | 配置参数 | CONTROL_AF_MODE = CONTINUOUS_PICTURE, SENSOR_EXPOSURE_TIME = 10ms。 |
| Template | 预设模板 | TEMPLATE_PREVIEW, TEMPLATE_STILL_CAPTURE。 |
3.2 流水线处理(Pipeline)
HAL3 将图像处理视为一个流水线。
graph LR
subgraph Pipeline ["成像流水线"]
direction LR
A["Sensor 输出 (RAW Bayer)"]
B["黑电平校正 (BLC)"]
C["镜头阴影校正 (LSC)"]
D["去马赛克 (Demosaic)"]
E["噪声抑制 (NR)"]
F["边缘增强 (Sharpening)"]
G["色彩校正 (CCM)"]
H["伽马校正 (Gamma)"]
I["输出 (YUV/JPEG)"]
end
A --> B --> C --> D --> E --> F --> G --> H --> I
学术定义:
- Bayer Pattern: 传感器输出的原始格式(RGGB, BGGR 等)。
- Demosaic: 将单通道的 Bayer 数据插值成三通道的 RGB 数据。
- 3A Algorithms: 自动对焦(AF)、自动曝光(AE)、自动白平衡(AWB)算法在流水线中实时调整参数。
3.3 请求与结果的异步性
HAL3 是完全异步的。
时序:
- App 发送 Request 1。
- App 发送 Request 2。
- HAL 处理 Request 1,返回 Result 1。
- HAL 处理 Request 2,返回 Result 2。
关键:Result 的顺序不一定与 Request 的顺序一致(虽然通常一致),系统通过 frameNumber 来关联。
4. Camera Service 的调度机制
4.1 设备状态管理
CameraService 维护着物理相机的状态机。
stateDiagram-v2
[*] --> Closed: 设备未打开
Closed --> Opened: openCamera()
Opened --> Configured: configureStreams()
Configured --> Active: setRepeatingRequest()
Active --> Idle: stopRepeating()
Idle --> Configured: 重新配置
Configured --> Closed: close()
4.2 并发访问控制
Android 支持多应用同时访问相机吗?不支持。
学术定义:
- 独占访问:CameraService 保证同一时间只有一个进程能打开相机设备。
- 高优先级抢占:如果后台应用正在使用相机,前台应用请求打开,CameraService 会强制关闭后台应用(发送
onDisconnected回调)。
5. 图像缓冲区管理(Buffer Management)
5.1 Surface 与 BufferQueue
应用通过 Surface 向 Camera Service 提供缓冲区。
| Surface 类型 | 用途 | 缓冲区数量 |
|---|---|---|
| SurfaceView | 预览显示 | 3 个 (Triple Buffering) |
| ImageReader | 拍照/分析 | 1-5 个 (取决于 Max Images) |
| MediaCodec | 视频录制 | 2-3 个 |
5.2 零拷贝流程
- App 创建
Surface,背后是一个BufferQueue。 - App 调用
createCaptureSession,CameraService 获取BufferQueue的句柄。 - App 发送
CaptureRequest,指定 Target 为上述Surface。 - HAL 处理完图像,直接将数据写入
BufferQueue中的一个空闲 Buffer。 - App 从
Surface中获取 Buffer,无需拷贝。
6. 3A 算法的控制闭环
6.1 AE(自动曝光)闭环
AE 是一个动态调整的过程。
graph LR
A["Request: 设定曝光参数"] --> B["Sensor 曝光"]
B --> C["ISP 处理"]
C --> D["输出图像"]
D --> E["统计亮度值"]
E --> F["计算误差"]
F -->|"调整"| A
学术定义:
- Exposure Value (EV): 由光圈、快门、ISO 共同决定。
- Metering Region: 测光区域(如中心权重、平均测光)。
6.2 AF(自动对焦)状态机
stateDiagram-v2
[*] --> Inactive: 未激活
Inactive --> PassiveScan: 被动扫描 (预览中)
PassiveScan --> ActiveScan: 主动扫描 (点击对焦)
ActiveScan --> Focused: 合焦成功
ActiveScan --> PassiveScan: 合焦失败
Focused --> Locked: 锁定焦点
Locked --> Inactive: 取消锁定
7. 关键源码深度解析
7.1 CameraService 的请求分发
// frameworks/av/services/camera/libcameraservice/CameraDeviceClient.cpp
status_t CameraDeviceClient::submitRequest(...) {
// 1. 检查请求合法性
if (!isRequestValid(request)) {
return BAD_VALUE;
}
// 2. 将 Framework 请求转换为 HAL 请求
halRequest = convertToHalRequest(request);
// 3. 调用 HAL 接口
mHalDevice->processCaptureRequest(halRequest);
// 4. 更新帧号
mFrameNumber++;
}
7.2 HAL3 的返回结果
// hardware/interfaces/camera/device/3.2/default/CameraDeviceSession.cpp
void CameraDeviceSession::processCaptureResult(...) {
// 1. 填充元数据
result.metadata = mLatestMetadata;
// 2. 填充图像缓冲区
result.outputBuffers[0].buffer = mFilledBuffer;
// 3. 通过回调返回给 Framework
mCallback->processCaptureResult(result);
}
8. 相机系统的常见误区
| 误区 | 学术解释 |
|---|---|
| 分辨率越高,画质越好 | 不一定。高分辨率可能牺牲帧率和进光量,导致噪点增加。 |
| 数码变焦是放大像素 | 是的。数码变焦只是裁剪图像中心区域并插值放大,会损失细节。 |
| 夜景模式是全靠算法 | 不全是。夜景模式需要长曝光(降低 ISO)或多帧合成(提高信噪比)。 |
| 前置摄像头比后置差 | 通常是。物理上,前置摄像头的 Sensor 尺寸、光圈、镜片素质通常低于后置。 |
9. 本篇总结(Knowledge Closure)
| 关键点 | 纯学术定义 |
|---|---|
| Camera Service 的本质 | 相机资源的仲裁者与调度器,管理设备生命周期。 |
| HAL3 的本质 | 无状态的请求-响应流水线,基于 Metadata 配置。 |
| 成像流水线 | 从 RAW Bayer 经过 ISP 处理(BLC, Demosaic, NR, CCM)到 YUV。 |
| 3A 算法 | 自动对焦、曝光、白平衡的实时闭环控制系统。 |
| 零拷贝机制 | 通过 Surface/BufferQueue 实现跨进程共享内存,避免数据搬运。 |
10. 第九板块结语
至此,第九板块:Android 多媒体体系 已全部完结。
我们从 AudioFlinger 的音频合成 出发,深入 AudioPolicyService 的策略仲裁,探索 Camera Service 的请求流水线,最终抵达 HAL3 的成像处理。
我们揭示了 Android 多媒体系统的核心逻辑:用流水线处理高带宽数据,用策略隔离应用,用共享内存消除拷贝。
下一篇预告:第十板块:Android 系统稳定性与调试 | 第二十五篇:Watchdog 与 ANR 的系统级监控