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架构示意图
痛点总结: 传统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架构示意图
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架构示意图
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,以享受统一的工具链和更简洁的代码生成。