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初始化与通信调试的前提。

调试要点:HIDL接口的稳定性直接影响binder通信的成败。在调试过程中,若出现“transaction failed”或“interface not found”错误,应首先检查接口版本号与方法签名是否匹配。

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接口之间的调用关系与数据流向:

HIDL接口关系与数据流图 ICameraProvider getCameraIdList() getCameraDeviceInterface() ICameraDevice configureStreams() processCaptureRequest() ICameraDeviceCallback processCaptureResult() notify() 返回设备接口 提交请求 注册回调 捕获结果与事件通知 说明:ICameraProvider负责设备发现,ICameraDevice负责请求控制,ICameraDeviceCallback负责异步回调。 三者构成完整的请求-响应闭环。 步骤1:服务发现 getCameraIdList() 步骤2:获取设备 getCameraDeviceInterface() 步骤3:配置流 configureStreams() 步骤4:请求 processCaptureRequest() 步骤5:异步回调 processCaptureResult() / notify()

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接口是否正常工作:

  1. 检查服务注册:使用adb shell lshal -i android.hardware.camera.provider@3.5::ICameraProvider确认服务已注册。
  2. 枚举设备:调用getCameraIdList,检查返回的Camera ID列表是否与硬件配置一致。
  3. 获取设备接口:对每个Camera ID调用getCameraDeviceInterface,确认返回的ICameraDevice不为空。
  4. 配置流测试:尝试配置一个简单的预览流(例如640x480,NV21格式),检查返回的HalStreamConfiguration是否有效。
  5. 回调验证:在processCaptureResult回调中打印结果数量,确认HAL层正确返回数据。
常见错误:如果getCameraDeviceInterface返回Status::INTERNAL_ERROR,通常表示HAL层在打开设备时失败。检查设备节点权限(/dev/video*)以及SELinux策略是否允许访问。

通过深入理解这三个HIDL接口的定义与交互关系,开发者可以快速定位CameraProvider初始化过程中的通信问题,为后续的流配置与请求处理调试打下坚实基础。