4. Camera HAL架构演进:从传统HAL到Treble HIDL HAL,再到AIDL HAL的演进路线

Android Camera HAL(硬件抽象层)的架构演进,本质上是Android系统为了解决碎片化、提升升级效率、强化安全隔离而不断推进的产物。从早期的传统HAL(Legacy HAL),到Treble HIDL HAL,再到最新的AIDL HAL,每一次演进都带来了架构设计、通信机制和接口定义方式的深刻变革。

核心演进驱动力: 缩短设备升级周期、解耦Framework与Vendor实现、统一接口标准、提升跨进程通信性能。

4.1 第一阶段:传统HAL(Legacy HAL)

在Android 8.0之前,Camera HAL以共享库(.so)的形式直接加载到mediaserver或cameraserver进程中。Framework通过dlopen动态加载HAL库,并直接调用其中的函数指针。

4.1.1 架构特点

  • 进程内调用: HAL运行在同一个进程空间,无进程间通信(IPC)开销。
  • 接口耦合紧密: Framework直接依赖HAL导出的符号,接口变更需要同步更新Framework和HAL。
  • 无版本管理: 接口版本由头文件隐式定义,升级困难。
  • 安全性弱: HAL崩溃会导致整个cameraserver进程崩溃。

4.1.2 传统HAL架构示意图

传统Camera HAL架构(Legacy HAL) 传统Camera HAL架构(Legacy HAL) Android Framework (cameraserver) dlopen / dlsym 直接调用函数指针 Camera HAL (camera_module_t / hw_module_t) Linux Kernel / V4L2 / ISP Driver ⚠ 关键问题 • 进程内直接调用 • 接口耦合紧密 • 无版本管理
痛点总结: 传统HAL模式下,OEM修改HAL接口后,Framework必须同步修改并重新编译,导致Android版本升级时,设备厂商需要投入大量精力适配,碎片化问题严重。

4.2 第二阶段:Treble HIDL HAL

Android 8.0引入Project Treble,核心变化是将Vendor分区与System分区解耦,HAL接口标准化为HIDL(HAL Interface Definition Language),并通过Binderized或Passthrough模式进行跨进程通信。

4.2.1 架构变革

  • 接口标准化: 使用.hal文件定义接口,支持版本号管理。
  • 进程隔离: HAL运行在独立的vendor进程中,与Framework通过Binder IPC通信。
  • 稳定ABI: Vendor分区可以独立更新,System分区升级时无需重新编译HAL。
  • 两种模式: Binderized模式(纯IPC)和Passthrough模式(同进程加载,但接口仍用HIDL定义)。

4.2.2 HIDL Camera HAL架构示意图

Treble HIDL Camera HAL架构 Treble HIDL Camera HAL架构(Binderized模式) System分区 Camera Framework / CameraService HIDL Client (BpCameraDevice) Vendor分区 HIDL Server (BnCameraDevice) Camera HAL Implementation Kernel / ISP Driver HIDL IPC (Binder) HIDL接口版本管理示例 android.hardware.camera.provider@2.4 :: ICameraProvider @2.4 表示major.minor版本,接口变更时版本号递增 ✅ 优点:接口标准化、进程隔离 ✅ System/Vendor独立升级 ⚠ 缺点:HIDL语法复杂 ⚠ 生成代码量大,性能开销

4.2.3 HIDL接口定义示例

// android/hardware/camera/device/3.4/ICameraDevice.hal
package android.hardware.camera.device@3.4;

interface ICameraDevice {
    /**
     * 配置相机输出流
     * @param streamConfiguration 流配置参数
     * @return Status 操作状态
     */
    configureStreams(StreamConfiguration streamConfiguration)
        generates (Status status);

    /**
     * 处理捕获请求
     * @param request 捕获请求
     * @return CaptureResult 捕获结果
     */
    processCaptureRequest(CaptureRequest request)
        generates (Status status, CaptureResult result);
};
实践要点: HIDL HAL中,Camera HAL需要实现ICameraProvider、ICameraDevice、ICameraDeviceSession等接口,每个接口都有严格的版本号管理。升级接口时,必须创建新的@major.minor版本包。

4.3 第三阶段:AIDL HAL

Android 12开始,Google推动HAL接口从HIDL向AIDL(Android Interface Definition Language)迁移。AIDL HAL使用与Framework相同的AIDL语法,统一了Android系统的接口定义语言,简化了工具链和开发流程。

4.3.1 核心变化

  • 统一接口语言: 使用.aidl文件定义HAL接口,与Framework Service使用相同的语法和工具。
  • 稳定的AIDL后端: 基于NDK的AIDL后端,支持C++和Java,性能接近HIDL。
  • 更简洁的代码生成: AIDL工具链更轻量,生成的桩代码更少。
  • 直接支持Binder: 原生支持Binder IPC,无需额外的Passthrough模式。
  • 版本管理简化: 使用@VintfStability注解和@Version注解管理接口版本。

4.3.2 AIDL Camera HAL架构示意图

AIDL Camera HAL架构 AIDL Camera HAL架构(Android 12+) System分区 CameraService (Java/C++) AIDL Client (ICameraProvider$Stub$Proxy) Vendor分区 AIDL Server (ICameraProvider$Stub) Camera HAL Implementation (C++ NDK) Kernel / ISP Driver AIDL IPC (Binder) AIDL接口定义示例(统一语法) package android.hardware.camera.provider; @VintfStability interface ICameraProvider { ... } ✅ 统一AIDL语法,减少学习成本 ✅ 代码生成更轻量,编译更快 ✅ 原生支持Binder,性能优化 ✅ 与Framework Service统一工具链

4.3.3 AIDL接口定义示例

// packages/modules/Camera/provider/aidl/android/hardware/camera/provider/ICameraProvider.aidl
@VintfStability
interface ICameraProvider {
    /**
     * 获取相机设备接口列表
     * @return 相机设备接口列表
     */
    String[] getCameraIdList();

    /**
     * 获取相机设备接口
     * @param cameraId 相机ID
     * @return 相机设备接口
     */
    ICameraDevice getCameraDevice(String cameraId);
}

4.4 三阶段架构对比总结

对比维度 传统HAL (Legacy) Treble HIDL HAL AIDL HAL
引入版本 Android 1.0 ~ 7.x Android 8.0 ~ 13 Android 12+
接口定义语言 C头文件 (hardware/libhardware) .hal 文件 (HIDL) .aidl 文件 (AIDL)
通信方式 进程内直接调用 (dlopen) Binder IPC / Passthrough Binder IPC (NDK AIDL)
进程模型 同进程 (cameraserver) 跨进程 (vendor进程) 跨进程 (vendor进程)
版本管理 无显式版本管理 @major.minor 版本包 @VintfStability + @Version
代码生成 无,直接调用函数指针 hidl-gen 生成大量桩代码 aidl 生成轻量桩代码
性能开销 最低(无IPC) 中等(IPC + 序列化) 中等(IPC + 序列化,优化后)
升级灵活性 差,System/Vendor耦合 好,独立升级 好,独立升级
工具链统一性 不统一 HIDL独立工具链 与Framework统一AIDL工具链

4.5 演进路线总结

演进核心逻辑: 从紧耦合到松耦合,从私有接口到标准化接口,从多语言工具链到统一AIDL。每一次演进都在提升系统的可维护性、可升级性和安全性。

当前(Android 14+),Google已明确推荐新开发的HAL使用AIDL,HIDL将逐步被淘汰。对于Camera HAL开发者而言,理解这三阶段的演进路线,有助于在维护旧设备HIDL HAL的同时,平滑过渡到新的AIDL HAL架构。

迁移建议: 如果正在开发新设备,直接使用AIDL HAL;如果维护现有HIDL HAL设备,建议在下一个大版本升级时规划迁移到AIDL,以享受统一的工具链和更简洁的代码生成。