1. 课程导论与预备知识
1.1 Android Camera 整体架构概览
Android Camera 子系统采用分层解耦的架构设计,从上至下依次为 应用层、框架层、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 一致性维护
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-8 章):架构概览、CamX 核心概念、Usecase/Pipeline/Node 详解
- 进阶篇(第 9-18 章):Buffer 管理、3A 集成、Session 配置、多 Camera 协同
- 实战篇(第 19-26 章):CHI 扩展、自定义 Node、性能调优、功耗优化
- 专题篇(第 27-30 章):调试技巧、稳定性分析、兼容性测试、新特性展望