1. 课程导论与预备知识

1.1 Camera HAL 在 Android 系统中的位置与作用

Camera HAL(Hardware Abstraction Layer)是 Android 相机子系统中连接 Framework 与底层硬件驱动的关键中间层。它位于 Android 系统的 硬件抽象层,向上通过 HIDL(HAL Interface Definition Language)接口与 Camera Service 通信,向下直接操作 V4L2、Sensor 驱动等内核模块。

从系统架构角度看,Camera HAL 承担以下核心职责:

  • 接口标准化:将不同厂商的 Camera 硬件差异封装成统一的 HIDL 接口,使上层 Framework 无需关心具体硬件实现。
  • 流管理:处理预览、拍照、视频录制等数据流的配置、启动、停止和切换。
  • 元数据传递:负责 Android 相机元数据(如 AE/AWB/AF 状态、传感器能力)的填充与上报。
  • Buffer 管理:协调 Gralloc、ION/DMA-BUF 等内存分配器,实现 Camera 数据的高效传递。
  • 3A 算法集成:集成自动曝光(AE)、自动白平衡(AWB)、自动对焦(AF)算法,或透传给底层 ISP。
关键认知: Camera HAL 是 Android 相机生态中“唯一必须由硬件厂商实现”的软件层。Google 提供的默认实现(如 Emulated Camera HAL)仅用于模拟器或参考设计,量产设备必须由 SoC 厂商或 OEM 编写自有 HAL。
Android Camera 系统架构分层图 应用层 (Camera App / API2) Framework (CameraService / CameraProvider) HIDL 接口 (android.hardware.camera.provider) Camera HAL (HAL3 / HIDL 实现) 内核驱动 (V4L2 / ISP / Sensor Driver) Camera HAL 是唯一由硬件厂商实现的软件层,其余层由 Android 开源项目(AOSP)提供

1.2 学习路线图

本课程采用“自顶向下、由浅入深”的递进式学习路径,共分为 6 个阶段:

阶段 章节范围 核心内容 产出物
基础入门 第 1-4 章 HIDL 语法、Camera HAL 接口定义、AOSP 源码结构 能阅读并理解 HIDL 接口文件
核心实现 第 5-12 章 HAL3 核心流程(open/configure_streams/process_capture_request)、Buffer 管理、3A 集成 能编写一个最小可运行的 Camera HAL 实现
调试与优化 第 13-18 章 logcat 分析、CTS 测试、性能调优、内存泄漏排查 能通过 Camera CTS 基本测试项
进阶特性 第 19-23 章 多 Camera 协同、HDR、夜景模式、高帧率录制 能实现多 Camera 同步方案
驱动交互 第 24-27 章 V4L2 ioctl、Sensor 驱动接口、MIPI CSI 配置 能编写 HAL 到驱动的数据通路
实战项目 第 28-30 章 从零实现一个虚拟 Camera HAL、移植到真实设备 完整的 Camera HAL 实现项目
学习建议: 初学者建议按顺序学习,有 HAL3 或 V4L2 经验的开发者可直接从第 5 章开始。每章结束后完成配套的“动手实验”环节,代码量累计约 3000-5000 行。

1.3 所需软硬件环境

1.3.1 硬件环境

硬件项 最低配置 推荐配置 说明
开发主机 4 核 CPU / 16GB RAM / 200GB 磁盘 8 核 CPU / 32GB RAM / 500GB SSD 用于编译 AOSP 和 HAL 代码
目标设备 Android 10+ 设备(支持 Treble) Pixel 4/5 或 Qualcomm 参考板 用于部署和调试 HAL
调试工具 USB 3.0 数据线 USB-C 调试线 + UART 串口板 adb 调试和内核日志抓取

1.3.2 软件环境

  • 操作系统:Ubuntu 20.04 LTS 或 22.04 LTS(64 位)
  • AOSP 源码:Android 12 (android-12.0.0_r32) 或更高版本
  • 交叉编译工具链:AOSP 自带工具链(基于 Clang/LLVM)
  • 辅助工具:repo、git、adb、fastboot、ccache、Python 3.8+
  • IDE/编辑器:VS Code(推荐安装 C/C++ 扩展、HIDL 语法高亮插件)
开发环境搭建流程 步骤 1 安装 Ubuntu 20.04 步骤 2 安装依赖包 步骤 3 下载 AOSP 源码 步骤 4 配置编译环境 步骤 5 编译 AOSP 目标 步骤 6 刷机并验证 提示:首次完整编译 AOSP 约需 2-4 小时(视机器性能),建议使用 ccache 加速后续增量编译 编译命令示例:source build/envsetup.sh && lunch aosp_arm64-userdebug && make -j$(nproc)

1.3.3 AOSP 源码获取与编译

以下为标准的 AOSP 源码下载与编译流程:

# 1. 安装 repo 工具
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=$PATH:~/bin

# 2. 初始化 AOSP 仓库(以 Android 12 为例)
mkdir ~/aosp && cd ~/aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-12.0.0_r32
repo sync -j8  # 根据网络情况,耗时 1-3 小时

# 3. 安装编译依赖
sudo apt-get install git-core gnupg flex bison build-essential \
  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
  libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev \
  lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

# 4. 编译
source build/envsetup.sh
lunch aosp_arm64-userdebug
make -j$(nproc) 2>&1 | tee build.log
常见问题:
  • 磁盘空间不足:AOSP 完整源码约 40GB,编译产物约 80GB,请确保至少有 200GB 可用空间。
  • Python 版本:Android 12 要求 Python 3.8+,请使用 python3 --version 确认。
  • Java 版本:Android 12 使用 OpenJDK 11,可通过 sudo apt install openjdk-11-jdk 安装。
  • 网络问题:如果 repo sync 失败,可尝试使用国内镜像源(如中科大、清华 AOSP 镜像)。

1.4 Camera HAL 源码结构概览

在 AOSP 源码中,Camera HAL 相关代码主要分布在以下路径:

路径 内容 重要性
hardware/interfaces/camera/ Camera HIDL 接口定义(.hal 文件) ★★★★★
hardware/libhardware/modules/camera/ Google 参考实现(Emulated Camera HAL) ★★★★
frameworks/av/camera/ CameraService 和 CameraClient 实现 ★★★
system/media/camera/ 相机元数据定义(camera_metadata) ★★★★
device///camera/ 厂商自定义 Camera HAL 实现 ★★★★★
Camera HAL 源码关键路径关系 HIDL 接口定义 hardware/interfaces/camera/ Google 参考实现 hardware/libhardware/modules/ 厂商 HAL 实现 device/<vendor>/<device>/ CameraService frameworks/av/camera/ 元数据定义 system/media/camera/ 内核驱动 kernel/drivers/media/ 开发 Camera HAL 时,最常修改的是“厂商 HAL 实现”路径下的代码,同时需要参考 HIDL 接口定义

1.5 预备知识清单

在学习本课程之前,建议读者具备以下基础知识:

  • C/C++ 编程:熟练掌握指针、内存管理、多线程编程(pthread/std::thread)
  • Linux 系统编程:理解文件 I/O、ioctl、mmap、poll/epoll 等系统调用
  • Android 基础:了解 Android 系统架构、Binder IPC 机制、Treble 架构
  • V4L2 基础:了解 Video for Linux 2 框架的基本概念(非必须,第 24 章会详细讲解)
  • Git 版本控制:能够使用 git 进行代码管理和 patch 提交
快速自测: 如果你能回答以下问题,说明已具备学习本课程的基础条件:
1. 什么是 HIDL?它与 AIDL 有什么区别?
2. Android Treble 架构的核心目的是什么?
3. 如何通过 adb 抓取 Camera 相关的 log?
4. 简述 V4L2 的 open/ioctl/mmap 流程。