第一章:Camera HAL 概述

大家好,我是你们这门课的主讲人。在移动影像领域摸爬滚打了十多年,从功能机时代一路干到现在的计算摄影,踩过的坑确实不少。今天咱们正式开始聊 Android Camera HAL,这是整个相机系统的核心枢纽。

说实话,很多刚入行的朋友一上来就扎进代码里,结果越看越迷糊。为什么?因为你不了解全景。就像拼图一样,你得先知道整张图长什么样,才能找到自己那块的位置。这一章,我们就先把 Camera 架构的全景图铺开来看。

1.1 Android Camera 架构全景

Android 的相机架构,说白了就是一条流水线。从上到下,大致分这么几层:

  • 应用层(App):你手机里的相机 App,或者第三方调用 Camera API 的应用。
  • Framework 层:Android 系统提供的 Camera API 和 Camera Service。这里负责管理权限、协调资源、分发数据。
  • HAL 层(硬件抽象层):这是我们今天的主角。它把硬件厂商的驱动和上层框架隔离开来。
  • Kernel 层(内核层):真正的硬件驱动,比如 V4L2、ISP 驱动、传感器驱动等。

我习惯把这四层比作一个餐厅:App 是点菜的顾客,Framework 是服务员,HAL 是厨师长,Kernel 是后厨的切菜工和炉灶师傅。顾客说「我要拍照」,服务员传话给厨师长,厨师长指挥后厨干活,最后把菜端上来。

你想想看,如果没有 HAL 这一层,Framework 直接跟 Kernel 打交道会怎样?那每个手机厂商的驱动都不一样,Google 得为每一款手机写一套 Framework 代码,这显然不现实。所以 HAL 的作用就是——定义一套标准接口,让上层不用关心底层是谁家的硬件

核心要点:HAL 是 Android 相机系统的「翻译官」。它把千奇百怪的硬件能力,翻译成 Framework 能理解的统一语言。

1.2 HAL 的作用与地位

HAL 到底有多重要?我举个例子。有一次我在调试一款新平台的相机,预览画面一直偏绿。应用层和 Framework 层查了个遍,都没问题。最后定位到 HAL 层——原来是 ISP 的 AWB(自动白平衡)增益参数传错了。你看,问题往往就出在这个中间层。

HAL 承担着几个关键职责:

  1. 设备管理:打开、关闭摄像头,切换前后摄。
  2. 流控制:配置预览流、拍照流、视频流的分辨率和格式。
  3. 参数处理:把上层下发的 3A 参数(自动对焦、自动曝光、自动白平衡)翻译成驱动能理解的寄存器值。
  4. 数据传递:把 sensor 采集到的原始数据,经过 ISP 处理后,送到上层显示或编码。

嗯,这里要注意一点。很多人以为 HAL 只是简单的「传话筒」,其实不是。好的 HAL 实现,往往要自己做大量的图像处理优化。比如我在项目中遇到过,某些平台的 ISP 不支持 HDR 合成,那 HAL 层就得自己写多帧对齐和融合算法。说白了,HAL 的边界在哪里,完全取决于硬件的能力和产品的需求。

个人经验:我建议你在开始写 HAL 代码之前,先花一周时间把硬件 datasheet 啃透。别急着写代码,先搞清楚 sensor 的帧率上限、ISP 的管线延迟、MIPI 接口的带宽。这些参数决定了你的 HAL 能做成什么样。

1.3 HAL 版本演进:HAL1 vs HAL3

Android Camera HAL 经历过两次大的版本迭代。我刚开始做 Android 相机时,用的还是 HAL1。那时候功能简单,能预览、能拍照、能录像,就这三板斧。

但后来手机拍照越来越卷,多帧降噪、夜景模式、人像虚化……这些功能 HAL1 根本搞不定。为什么?因为 HAL1 的设计太死板了。

对比项 HAL1 HAL3
设计理念 固定管线,一次只能做一件事 灵活管线,支持多路并发流
数据流 预览和拍照走不同的路径 统一使用 buffer 队列,灵活复用
3A 控制 HAL 内部自动处理,上层无法干预 上层可以下发 3A 参数,精细控制
多帧能力 不支持 支持 burst 模式,多帧捕获
适用场景 基础拍照、录像 计算摄影、专业模式、AI 场景

我曾经在一个项目里被 HAL1 坑惨了。当时要做个「先拍照后对焦」的功能,HAL1 根本没法实现,因为它的管线是固定的,拍完照就结束了,没法再回头取数据。后来只能硬着头皮上 HAL3,重新写了一遍底层。

所以我的建议是:新项目直接上 HAL3,别犹豫。虽然 HAL3 的复杂度比 HAL1 高了一个数量级,但它的灵活性是 HAL1 完全没法比的。你想想看,现在哪个手机没有夜景模式、人像模式?这些功能在 HAL1 上根本跑不起来。

避坑指南:我曾经见过有人把 HAL1 强行魔改,加了一堆 hack 代码来实现多帧功能。结果呢?稳定性一塌糊涂,动不动就 ANR(应用无响应)。别走这条路,老老实实上 HAL3 才是正道。

1.4 学习路线图

这门课的内容比较多,我给大家画个路线图,心里有个数:

  • 第一阶段:基础入门(第 1-3 章)
    搞懂架构、搭建开发环境、跑通第一个 HAL 实例。这个阶段别贪多,能跑起来就算赢。
  • 第二阶段:核心机制(第 4-7 章)
    深入理解 buffer 管理、stream 配置、request 流程。这是 HAL3 最难啃的骨头,我当年啃了整整两个月。
  • 第三阶段:实战进阶(第 8-10 章)
    做几个真实项目:预览优化、拍照流程、录像流程。边做边学,效果最好。
  • 第四阶段:性能调优(第 11-12 章)
    延迟分析、内存优化、功耗控制。这部分是区分初级和高级工程师的分水岭。

我个人习惯是「先跑通,再优化」。很多初学者喜欢把每个细节都搞懂再动手,结果往往卡在某个点上就放弃了。我的建议是:先照着代码跑一遍,看到画面出来了,你就有信心了。然后再回头去抠细节。

嗯,这一章就到这里。下一章我们开始搭建开发环境,手把手教你编译第一个 HAL 模块。到时候记得准备好你的开发板,咱们真刀真枪地干。

本章小结:

  • Camera 架构分四层:App → Framework → HAL → Kernel
  • HAL 是硬件抽象层,负责隔离上层和底层
  • HAL3 比 HAL1 更灵活,新项目建议直接上 HAL3
  • 学习路线:先跑通,再优化,别卡在细节上