1. Camera HAL3 概述:Android Camera 架构演进、HAL3 设计哲学、与 HAL1 的核心区别

好,咱们直接进入正题。

做 Camera 底层开发,绕不开 HAL3。我当年从 HAL1 转到 HAL3 的时候,说实话,挺痛苦的。但熬过来之后,你会发现 HAL3 的设计确实漂亮。今天这一讲,我就带你理清 HAL3 的来龙去脉。

1.1 Android Camera 架构演进:从 HAL1 到 HAL3

Android Camera 架构,说白了就是 App 怎么跟底层硬件打交道。早期是 HAL1,后来是 HAL3,中间还有个 HAL2 的过渡版本——不过 HAL2 基本没人用,咱们就不提了。

为什么会从 HAL1 演进到 HAL3?

我举个例子。你想想看,HAL1 时代,拍照就是「按下快门 → 拍一张照片 → 返回」。这个过程是串行的,一次只能做一件事。你想边预览边拍照?可以,但底层实现很别扭。你想在拍照的同时做人脸检测?HAL1 基本做不到。

HAL3 的核心目标,就是解决这些痛点。它把 Camera 抽象成一个「流水线」,各个模块可以并行工作。预览、拍照、人脸检测、HDR 合成……这些操作可以同时进行,互不干扰。

一句话总结:HAL1 是「单线程」的,HAL3 是「多线程流水线」的。

1.2 HAL3 的设计哲学:一次配置,多次使用

HAL3 的设计哲学,我个人理解就八个字:一次配置,多次使用

什么意思呢?

在 HAL1 里,每次拍照你都得重新配置 sensor、重新申请 buffer、重新做 3A 计算。效率很低。HAL3 不一样,它把整个拍照流程拆成几个阶段:

  • 配置阶段(Configure):一次性告诉底层,你要什么分辨率、什么帧率、什么格式。底层根据你的需求,分配好所有资源。
  • 请求阶段(Request):配置好了之后,你只需要不断下发「请求」就行了。每个请求可以指定不同的参数,比如曝光时间、白平衡、对焦位置。
  • 结果阶段(Result):底层处理完一个请求,返回对应的图像数据和 metadata。

你看,配置只做一次,后面就是不断地请求和返回。这样效率就上来了。

避坑指南:我曾经在项目里犯过一个错——每次拍照都重新配置 stream。结果帧率掉到 10fps 以下。后来才发现,配置阶段是耗时的,应该只做一次。嗯,这个坑我替你们踩过了。

1.3 HAL3 与 HAL1 的核心区别

咱们用一张表来对比,这样更直观:

对比维度 HAL1 HAL3
工作模式 串行,一次只能做一个操作 流水线,多个操作可并行
数据流 固定 pipeline,不可定制 可配置的 stream,灵活组合
控制粒度 粗粒度,只能控制拍照/录像 细粒度,每个 request 可单独控制
metadata 基本没有,全靠扩展 标准化的 metadata,覆盖所有参数
buffer 管理 HAL 自己管理,容易碎片化 由 framework 统一管理,更高效
多摄像头支持 基本不支持 原生支持多摄像头协同

这张表你多看几遍。我面试别人的时候,经常拿这几个点来问。能说清楚的人,基本对 HAL3 就有底了。

1.4 从 HAL1 到 HAL3,到底变了什么?

说白了,HAL3 把 Camera 从「黑盒」变成了「白盒」。

HAL1 时代,你调用 takePicture(),底层怎么处理的?你不知道。曝光、增益、白平衡,都是 HAL 自己决定的。你只能拿到一张 JPEG 图片,中间过程完全不可控。

HAL3 不一样。它把每个环节都暴露给你:

  • 你可以控制 sensor 的曝光时间和增益
  • 你可以控制 ISP 的处理参数
  • 你可以控制输出格式,是 YUV、RAW 还是 JPEG
  • 你甚至可以拿到每一帧的 3A 统计数据

这种「白盒化」的设计,让上层应用有了极大的发挥空间。比如 Google 的 HDR+ 算法,就是基于 HAL3 的 RAW 数据流做的。

注意:HAL3 虽然灵活,但复杂度也上来了。我见过不少团队,HAL1 跑得好好的,一上 HAL3 就各种问题。原因很简单——HAL3 对底层驱动的要求更高。如果你的 sensor 驱动不支持细粒度控制,那 HAL3 的优势就发挥不出来。

1.5 我的一点个人体会

做 Camera 底层这么多年,我最大的感受是:HAL3 的设计思路,其实代表了整个嵌入式系统的发展方向——从「封闭」走向「开放」,从「固定」走向「可配置」。

你想想看,现在的手机摄像头动辄三颗、四颗,还有 ToF、深度传感器。如果还用 HAL1 那种串行模式,根本玩不转。HAL3 的流水线架构,就是为了应对这种复杂性而生的。

所以,不管你现在做的是哪个平台——高通、MTK、展锐——HAL3 都是你必须啃下来的硬骨头。啃下来之后,你会发现 Camera 底层其实没那么神秘。

好,这一讲就到这里。下一讲,咱们深入 HAL3 的核心数据结构——camera3_device_tcamera3_stream_t。这两个结构体,是理解 HAL3 的钥匙。