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_t 和 camera3_stream_t。这两个结构体,是理解 HAL3 的钥匙。