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的解耦。
Camera HAL整体架构图 Camera HAL 整体架构(Treble) 应用层 Camera2 API / Camera1 API 框架层(Framework) CameraService(Native) CameraProvider(HIDL/AIDL封装) HAL层(独立进程) Camera HAL 实现(HAL1 / HAL3) V4L2 / ISP / Sensor 驱动 硬件层 Camera Sensor / ISP / MIPI Treble 关键变化 • HAL独立进程 • HIDL/AIDL接口 • 多进程通信 • 热插拔支持 • 版本兼容隔离 • 独立升级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仅用于兼容老旧设备或特殊场景(如仅需基础预览功能)。
HAL1 vs HAL3 流程对比 HAL1 vs HAL3 流程对比 HAL1:固定流水线模型 打开设备 配置预览流 启动预览 拍照(阻塞) 停止预览 关闭设备 HAL3:Capture Request模型 打开Session 配置Stream 提交Request 异步Result 关闭Session 释放资源 HAL1:线性阻塞流水线,一次只能做一件事;HAL3:异步Request/Result模型,支持多流并发、ZSL、高速连拍 HAL3的灵活性带来更高的调试复杂度,需要关注多线程同步、Buffer死锁、Request超时等问题

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+) 官方推荐(新项目首选)
Treble架构HAL实现方式 Treble架构下的HAL实现方式 Framework进程 CameraService CameraManager CameraDeviceImpl CameraCaptureSession HAL进程(CameraProvider) ICameraProvider ICameraDevice ICameraDeviceCallback ICameraDeviceSession HIDL/AIDL Binder IPC 回调/通知 硬件驱动层 V4L2 / ISP / Sensor Driver Treble架构关键特性 • HAL独立进程:Framework与HAL运行在不同进程,互不依赖,HAL崩溃不影响系统稳定性 • 接口稳定:HIDL/AIDL接口版本化,HAL可独立升级,无需更新系统镜像 • 多进程调试:需要关注Binder通信、进程生命周期、权限隔离、SELinux策略

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多进程通信最常见的故障源。

1.4 本章小结