1. Camera HAL架构概述
Android Camera HAL(硬件抽象层)是连接Android框架与底层相机硬件的关键桥梁。在Treble架构引入后,HAL的边界更加清晰,多进程通信成为主流实现方式。本章从整体架构出发,梳理HAL3与HAL1的核心差异,并深入Treble架构下的HAL实现路径,为后续AIDL服务调试奠定基础。
1.1 Android Camera HAL整体架构
Camera HAL位于Android系统的中间层,向上对接Camera Framework(Java/Native),向下驱动V4L2、ISP等硬件模块。整体架构分为三层:
- 应用层:Camera2 API / Camera1 API,通过Binder与Framework通信。
- 框架层:CameraService(Native服务)、CameraProvider(Treble架构下的HAL封装)。
- HAL层:Camera HAL实现(HAL1 / HAL3),直接操作硬件驱动。
关键认知:Treble架构将HAL从Framework进程中分离为独立进程(CameraProvider),通过HIDL/AIDL接口通信,实现了Framework与HAL的解耦。
1.2 HAL3与HAL1的区别
HAL1和HAL3是Android Camera HAL的两个主要版本,它们在设计理念、接口复杂度、性能特性上存在显著差异。HAL3专为Camera2 API设计,支持更精细的控制和更高的性能。
| 对比维度 | HAL1 | HAL3 |
|---|---|---|
| 引入版本 | Android 4.0 (API 14) | Android 5.0 (API 21) |
| 设计目标 | 简单预览/拍照 | 精细控制、多帧、高速连拍 |
| 操作模式 | 固定流水线(预览→拍照→回放) | 灵活Capture Request/Result模型 |
| 流控制 | 单流(预览或拍照) | 多流并行(预览+拍照+分析) |
| 元数据 | 简单参数(size/format) | 丰富元数据(AE/AWB/AF/3A状态) |
| Buffer管理 | Framework分配Buffer | HAL可分配/选择Buffer |
| 性能特性 | 延迟较高,吞吐量有限 | 低延迟,高吞吐量,支持ZSL |
| 调试复杂度 | 较低,单线程模型 | 较高,多线程/多流并发 |
工程建议:新项目应优先选择HAL3实现,以充分利用Camera2 API的能力。HAL1仅用于兼容老旧设备或特殊场景(如仅需基础预览功能)。
1.3 Treble架构下的HAL实现方式
Treble架构(Android 8.0+)将HAL从Framework进程中彻底分离,形成独立的HAL进程(CameraProvider)。HAL与Framework之间通过HIDL(HAL Interface Definition Language)或AIDL(Android Interface Definition Language)进行跨进程通信。
1.3.1 Treble架构核心组件
- CameraProvider:独立的HAL进程,实现ICameraProvider接口,负责枚举相机设备、创建CameraDevice。
- CameraDevice:代表单个相机设备,实现ICameraDevice接口,处理Capture Request/Result。
- CameraService:Framework端的Native服务,通过Binder与CameraProvider通信。
- HIDL/AIDL接口:定义跨进程通信契约,支持同步/异步调用、回调、热插拔通知。
调试注意:Treble架构下,HAL进程崩溃不会导致Framework重启,但会导致相机服务不可用。需要关注进程隔离带来的通信延迟、Binder线程池耗尽、回调超时等问题。
1.3.2 HIDL vs AIDL 实现对比
| 对比维度 | HIDL实现 | AIDL实现 |
|---|---|---|
| 引入版本 | Android 8.0 (Treble首发) | Android 12+ (推荐) |
| 接口定义 | .hal文件 → hidl-gen生成 | .aidl文件 → aidl-cpp生成 |
| 通信机制 | Binder + HwBinder | Binder (统一) |
| 稳定性 | 稳定(VTS强制测试) | 稳定(Android 12+成熟) |
| 代码生成 | C++/Java双端 | C++/Java/Kotlin |
| 调试工具 | halctl、lshal | aidl-trace、binder |
| 迁移趋势 | 逐步废弃(Android 14+) | 官方推荐(新项目首选) |
1.3.3 AIDL服务实现示例
以下是一个简化的CameraProvider AIDL接口定义示例,展示Treble架构下HAL与Framework的通信契约:
// ICameraProvider.aidl
package android.hardware.camera.provider;
interface ICameraProvider {
/**
* 获取相机设备ID列表
*/
String[] getCameraIdList();
/**
* 打开指定相机设备
* @param cameraId 相机ID
* @return ICameraDevice 相机设备接口
*/
ICameraDevice openCamera(String cameraId);
/**
* 注册相机状态回调
*/
void setCallback(ICameraProviderCallback callback);
}
// ICameraDevice.aidl
package android.hardware.camera.device;
interface ICameraDevice {
/**
* 创建相机会话
* @param outputStreams 输出流配置
* @param callback 会话回调
* @return ICameraDeviceSession 会话接口
*/
ICameraDeviceSession createSession(
in StreamConfiguration[] outputStreams,
ICameraDeviceSessionCallback callback
);
/**
* 获取相机特性
* @return CameraMetadata 相机元数据
*/
CameraMetadata getCameraCharacteristics();
}
调试切入点:在AIDL服务调试中,重点关注Binder事务大小限制(1MB)、回调超时(默认5秒)、进程死亡通知(linkToDeath)等关键点。这些是Camera HAL多进程通信最常见的故障源。