第九板块:Android 多媒体体系 | 第二十四篇:Camera Service 与 HAL3 成像流水线

38 阅读6分钟

第九板块: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 InterfaceKernel V4L2 DriverFramework 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 核心组件职责表

组件层级职责学术定义
CameraServiceFramework仲裁者管理相机设备,处理并发访问,分发请求。
CameraDeviceClientFramework会话管理者代表一个应用打开的相机设备,管理 Capture Session。
HAL3 (ICameraDevice)HAL执行者厂商实现的接口,接收 Request,返回 Result。
RequestProcessorHAL流水线调度将 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 是完全异步的。

时序

  1. App 发送 Request 1。
  2. App 发送 Request 2。
  3. HAL 处理 Request 1,返回 Result 1。
  4. 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 零拷贝流程

  1. App 创建 Surface,背后是一个 BufferQueue
  2. App 调用 createCaptureSession,CameraService 获取 BufferQueue 的句柄。
  3. App 发送 CaptureRequest,指定 Target 为上述 Surface
  4. HAL 处理完图像,直接将数据写入 BufferQueue 中的一个空闲 Buffer。
  5. 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 的系统级监控