4. HIDL接口定义:ICameraProvider.hal核心接口、ICameraDevice.hal接口、ICameraDeviceCallback.hal回调接口
在Android HAL架构中,HIDL(HAL Interface Definition Language)是连接Framework与CameraProvider的契约层。本章聚焦于三个核心HIDL接口文件:ICameraProvider.hal、ICameraDevice.hal和ICameraDeviceCallback.hal。理解这些接口的定义、方法签名及数据流向,是进行CameraProvider初始化与通信调试的前提。
4.1 ICameraProvider.hal:服务发现与设备枚举
ICameraProvider.hal是CameraProvider对外暴露的顶层接口,负责设备枚举、服务生命周期管理以及底层硬件抽象。其核心方法定义如下:
| 方法名 | 输入参数 | 返回值 | 功能描述 |
|---|---|---|---|
getCameraIdList |
无 | Status + vec<string> |
返回当前Provider管理的所有Camera设备ID列表 |
getCameraDeviceInterface |
string cameraId |
Status + ICameraDevice |
根据Camera ID获取对应的设备接口实例 |
setCallback |
ICameraProviderCallback |
Status |
注册回调接口,用于通知Framework设备热插拔事件 |
getVendorTags |
无 | Status + vec<VendorTagSection> |
获取供应商自定义的元数据标签集合 |
isSetTorchModeSupported |
无 | Status + bool |
查询是否支持手电筒模式控制 |
以下是一个典型的ICameraProvider.hal接口定义片段(基于Android 11+):
package android.hardware.camera.provider@3.5;
interface ICameraProvider {
getCameraIdList() generates (Status status, vec<string> cameraIds);
getCameraDeviceInterface(string cameraId)
generates (Status status, ICameraDevice device);
setCallback(ICameraProviderCallback callback)
generates (Status status);
getVendorTags()
generates (Status status, vec<VendorTagSection> vendorTagSections);
isSetTorchModeSupported()
generates (Status status, bool support);
};
getCameraDeviceInterface返回的是ICameraDevice接口,而非具体实现。这种设计使得Framework无需关心底层硬件差异,只需通过HIDL接口进行统一调用。
4.2 ICameraDevice.hal:设备控制与数据流管理
ICameraDevice.hal是单个Camera设备的操作接口,负责会话管理、请求提交、元数据配置以及数据流控制。该接口是Framework与Camera HAL进行交互的核心通道。
| 方法名 | 输入参数 | 返回值 | 功能描述 |
|---|---|---|---|
open |
ICameraDeviceCallback |
Status |
打开Camera设备,注册回调接口 |
close |
无 | Status |
关闭Camera设备,释放资源 |
configureStreams |
StreamConfiguration |
Status + HalStreamConfiguration |
配置数据流管道,包括分辨率、格式、方向等 |
processCaptureRequest |
vec<CaptureRequest> |
Status |
提交捕获请求,触发图像采集 |
flush |
无 | Status |
刷新所有待处理的请求,清空管道 |
接口定义示例:
package android.hardware.camera.device@3.5;
interface ICameraDevice {
open(ICameraDeviceCallback callback) generates (Status status);
close() generates (Status status);
configureStreams(StreamConfiguration requestedConfiguration)
generates (Status status, HalStreamConfiguration halConfiguration);
processCaptureRequest(vec<CaptureRequest> requests,
vec<BufferCache> cachesToRemove)
generates (Status status, uint32_t numRequestProcessed);
flush() generates (Status status);
};
configureStreams返回的HalStreamConfiguration可能与请求的配置不一致。HAL层有权根据硬件能力调整分辨率或格式。调试时务必检查返回的实际配置,否则可能导致后续processCaptureRequest失败。
4.3 ICameraDeviceCallback.hal:异步事件与数据回调
ICameraDeviceCallback.hal是Framework实现的回调接口,用于接收来自HAL层的异步事件、捕获结果以及错误通知。该接口是数据从HAL流向Framework的关键通道。
| 方法名 | 输入参数 | 功能描述 |
|---|---|---|
processCaptureResult |
vec<CaptureResult> |
返回捕获结果,包含元数据、缓冲区句柄等 |
notify |
vec<NotifyMsg> |
通知异步事件,如快门、错误、请求完成等 |
接口定义示例:
package android.hardware.camera.device@3.5;
interface ICameraDeviceCallback {
processCaptureResult(vec<CaptureResult> results) generates (Status status);
notify(vec<NotifyMsg> msgs) generates (Status status);
};
processCaptureResult可能被频繁调用(例如30fps预览时每秒30次)。回调实现必须高效,避免在回调中执行耗时操作,否则会导致帧率下降或ANR。
4.4 接口关系与数据流图
以下SVG图展示了三个HIDL接口之间的调用关系与数据流向:
4.5 接口版本演进与兼容性
HIDL接口通过版本号管理演进。Camera HAL从@3.2发展到@3.8,每个版本可能新增或废弃方法。调试时需注意以下兼容性规则:
- 向后兼容:新版本接口必须包含旧版本的所有方法,不能删除或修改已有方法的签名。
- 版本协商:Framework通过
ICameraProvider::getCameraDeviceInterface返回的接口版本决定使用哪些功能。 - 调试检查:使用
lshal命令查看当前注册的HIDL服务版本:adb shell lshal | grep camera
| HIDL版本 | 新增关键特性 | 对应Android版本 |
|---|---|---|
| @3.2 | 基础Provider/Device接口 | Android 8.0 |
| @3.4 | Torch模式支持 | Android 9.0 |
| @3.5 | Buffer缓存管理优化 | Android 10.0 |
| @3.7 | 物理Camera支持 | Android 11.0 |
| @3.8 | Session参数配置增强 | Android 12.0 |
4.6 调试实践:验证接口调用链
在调试CameraProvider初始化时,可以通过以下步骤验证HIDL接口是否正常工作:
- 检查服务注册:使用
adb shell lshal -i android.hardware.camera.provider@3.5::ICameraProvider确认服务已注册。 - 枚举设备:调用
getCameraIdList,检查返回的Camera ID列表是否与硬件配置一致。 - 获取设备接口:对每个Camera ID调用
getCameraDeviceInterface,确认返回的ICameraDevice不为空。 - 配置流测试:尝试配置一个简单的预览流(例如640x480,NV21格式),检查返回的
HalStreamConfiguration是否有效。 - 回调验证:在
processCaptureResult回调中打印结果数量,确认HAL层正确返回数据。
getCameraDeviceInterface返回Status::INTERNAL_ERROR,通常表示HAL层在打开设备时失败。检查设备节点权限(/dev/video*)以及SELinux策略是否允许访问。
通过深入理解这三个HIDL接口的定义与交互关系,开发者可以快速定位CameraProvider初始化过程中的通信问题,为后续的流配置与请求处理调试打下坚实基础。