1. 课程导论与预备知识

1.1 Android Camera 整体架构概览

Android Camera 子系统采用分层解耦的架构设计,从上至下依次为 应用层、框架层、HAL 层 和 内核驱动层。每一层都定义了清晰的接口边界,使得上层应用无需关心底层硬件差异,底层厂商也能在不影响上层的前提下进行硬件适配与优化。

Android Camera 整体架构分层图 应用层 (Application) Camera2 API / CameraX 客户端 框架层 (Framework) CameraService / CameraProvider HAL 层 (Hardware Abstraction Layer) CamX HAL / 厂商自定义 HAL 内核驱动层 (Kernel Driver) V4L2 / ISP / Sensor 驱动 说明: • 本课程聚焦于红色标注的 HAL 层,特别是 Qualcomm CamX 架构下的实现。 • 上层通过 HIDL / AIDL 接口与 HAL 通信,下层通过内核驱动控制硬件。

1.2 HAL 层在系统中的位置与作用

Camera HAL 层位于 Android 框架与内核驱动之间,是连接上层策略与底层硬件的关键桥梁。其核心职责包括:

  • 硬件抽象:向上层提供统一的 Camera 设备接口,屏蔽不同厂商、不同型号 Sensor 和 ISP 的差异。
  • 流管理:管理预览、拍照、录像等数据流的创建、配置与销毁。
  • 元数据处理:负责 3A(自动对焦、自动曝光、自动白平衡)控制、统计信息上报等。
  • Buffer 管理:协调 Gralloc / ION 等内存分配器,实现高效的数据传递。
层级 主要组件 与 HAL 的交互方式
Framework CameraService 通过 HIDL/AIDL 调用 HAL 接口
HAL 层 CamX / CHI 实现 ICameraProvider / ICameraDevice
Kernel V4L2 / Sensor 驱动 通过 ioctl / mmap 与 HAL 交互
学习提示: CamX 是 Qualcomm 在 Android 8.0 之后推出的新一代 Camera HAL 架构,它基于模块化、可配置的设计理念,将传统的 monolithic HAL 拆分为多个可插拔的 Usecase、Pipeline 和 Node,极大提升了灵活性和复用性。

1.3 学习本课程所需的前置技能

本课程面向有一定嵌入式开发基础的工程师,建议在开始学习前掌握以下技能:

1.3.1 C++ 编程基础

CamX HAL 核心代码使用 C++17 标准编写,大量运用面向对象、模板、智能指针等特性。你需要熟悉:

  • 类与继承、虚函数、多态
  • STL 容器(vector、map、shared_ptr)
  • RAII 资源管理、异常安全
  • Lambda 表达式与函数对象
// CamX 中常见的智能指针用法示例
#include <memory>

class CameraNode {
public:
    virtual ~CameraNode() = default;
    virtual int32_t ProcessRequest() = 0;
};

using NodePtr = std::unique_ptr<CameraNode>;

void CreateNode() {
    // 使用 unique_ptr 管理节点生命周期
    NodePtr node = std::make_unique<ConcreteNode>();
    node->ProcessRequest();
} // 离开作用域自动释放

1.3.2 Linux 驱动基础

HAL 层需要直接与内核驱动交互,理解以下概念对调试和开发至关重要:

  • V4L2 框架:视频设备的打开、流式 I/O、缓冲区队列管理
  • 设备树与平台驱动:Sensor 上电时序、I2C 寄存器配置
  • 中断与同步:VSYNC 信号、帧完成中断处理
  • DMA 与内存管理:ION/DMABUF 分配器、Cache 一致性维护
HAL 层与内核驱动的交互流程 CamX HAL Pipeline / Node Request 处理 V4L2 驱动 VIDIOC_* ioctl QBUF / DQBUF Sensor / ISP MIPI CSI RAW 数据 关键交互流程: 1. HAL 通过 open() 打开 /dev/videoX 节点 → 2. 调用 VIDIOC_S_FMT 设置格式 → 3. REQBUFS 申请缓冲区 → 4. QBUF 入队 → 5. STREAMON 启动流 → 6. POLL 等待帧完成 → 7. DQBUF 取出数据

1.3.3 推荐学习路径

技能领域 推荐资源 预计学习时间
C++ 基础 《C++ Primer》第 5 版 / cppreference.com 2-4 周
Linux 驱动 《Linux Device Drivers》第 3 版 / LWN.net 3-6 周
Android 框架 AOSP 官方文档 / Android Camera 开发者指南 1-2 周
常见误区: 很多初学者试图跳过 C++ 和 Linux 驱动基础直接学习 CamX,结果在阅读源码时被智能指针、模板特化、V4L2 缓冲区管理等概念卡住。建议先花 2-3 周巩固基础,再进入本课程的核心章节。

1.4 课程内容概览

本课程共 30 章,分为四个阶段:

  1. 基础篇(第 1-8 章):架构概览、CamX 核心概念、Usecase/Pipeline/Node 详解
  2. 进阶篇(第 9-18 章):Buffer 管理、3A 集成、Session 配置、多 Camera 协同
  3. 实战篇(第 19-26 章):CHI 扩展、自定义 Node、性能调优、功耗优化
  4. 专题篇(第 27-30 章):调试技巧、稳定性分析、兼容性测试、新特性展望