2. Android Camera整体架构:从App到Framework到HAL的调用链路、CameraProvider与HAL3接口

在深入高通Camera HAL层的Buffer管理之前,必须首先理解Android Camera系统的整体架构。本章将剖析从上层App到底层HAL的完整调用链路,重点讲解CameraProvider进程与HAL3接口的设计哲学,为后续的Buffer管理实战打下坚实的架构基础。

2.1 四层架构总览

Android Camera系统采用分层解耦设计,从上到下依次为:应用层、Framework层、HAL层与内核驱动层。每一层都通过明确定义的接口进行通信,确保上层应用无需关心底层硬件差异。

架构核心原则:上层调用者只与抽象接口交互,底层实现细节对上层透明。Buffer管理作为贯穿全链路的核心数据载体,其生命周期管理直接影响拍照与录像的帧率、延迟与内存效率。
Android Camera 四层架构总览 Android Camera 四层架构总览 应用层 (App Layer) Camera2 API / CameraX / 第三方相机应用 Framework层 (Java/Native) CameraService / CameraDeviceClient / Camera3Device BufferQueue / Surface / Stream配置管理 HAL层 (Camera HAL) CameraProvider (HIDL/AIDL) / camera3_device_t Buffer管理 / 流处理 / 3A算法集成 内核驱动层 (Kernel Driver) V4L2 / ISP驱动 / MIPI CSI / DMA-BUF Buffer流转路径 App → Framework → HAL → Kernel
架构要点:在Android 10+中,Camera HAL以独立的CameraProvider进程运行,与Framework的CameraService通过HIDL/AIDL通信。这种进程隔离设计增强了系统稳定性——即使HAL崩溃也不会直接导致System Server挂掉。

2.2 从App到Framework的调用链路

当用户打开相机App并点击拍照按钮时,背后经历了一系列复杂的跨进程与跨层调用。以下是典型的预览流建立过程:

  1. App调用CameraManager.openCamera():通过CameraManager获取CameraDevice实例,触发Framework层的权限检查与设备枚举。
  2. CameraService创建CameraDeviceClient:Framework层的CameraService收到请求后,创建CameraDeviceClient对象,并为其分配一个唯一的Camera ID。
  3. Camera3Device初始化:CameraDeviceClient内部持有Camera3Device实例,该实例负责与HAL层交互,管理Stream配置与Request提交。
  4. 创建Session与配置Stream:App通过createCaptureSession()配置输出Surface(如PreviewSurface、ImageReader Surface),Framework将这些Surface转换为HAL层的Stream。
  5. 提交CaptureRequest:App通过Session提交CaptureRequest,Framework将其封装为HAL层的camera3_capture_request_t结构体,送入HAL处理。
关键调用链路组件说明
组件名称 所在层级 核心职责 与Buffer管理的关系
CameraManager App层 (Java) 相机设备枚举与连接管理 提供CameraDevice句柄
CameraService Framework (Native) 权限控制、设备调度、Client管理 分配BufferQueue生产者端
Camera3Device Framework (Native) Stream配置、Request序列化、结果回调 管理Stream与Buffer流转状态机
CameraProvider HAL层 (独立进程) 封装HAL实现,提供HIDL/AIDL服务 负责Buffer的实际分配与填充
camera3_device_t HAL层 (C结构体) HAL3接口函数表,定义所有操作回调 process_capture_request接收Buffer句柄

2.3 CameraProvider与HAL3接口详解

CameraProvider是Android Treble架构的产物,它将HAL实现从Framework进程中剥离,运行在独立的cameraserver或provider进程中。这种架构使得OEM可以独立升级相机HAL,而不影响Framework的稳定性。

2.3.1 CameraProvider的两种服务模式

  • HIDL模式(Android 8~10):使用android.hardware.camera.provider@2.4接口,通过ICameraProvider与ICameraDevice进行通信。HAL实现需要继承ICameraDeviceCallback接口。
  • AIDL模式(Android 11+):使用android.hardware.camera.provider AIDL接口,性能更优,支持更灵活的跨进程数据传输。高通平台从SM8250(骁龙865)开始全面转向AIDL模式。
高通平台注意:在AIDL模式下,Buffer的跨进程传递使用HalBuffer结构体,其中包含native_handle_t指针。高通HAL层需要特别注意native_handle的克隆与释放,避免内存泄漏或野指针。

2.3.2 HAL3接口核心函数表

HAL3接口定义在hardware/libhardware/include/hardware/camera3.h中,核心结构体为camera3_device_ops_t。以下是Buffer管理相关的关键函数:

typedef struct camera3_device_ops {
    // 初始化设备,分配硬件资源
    int (*initialize)(const struct camera3_device *,
                      const camera3_callback_ops_t *callback_ops);

    // 配置Stream,定义Buffer的格式、尺寸与使用场景
    int (*configure_streams)(const struct camera3_device *,
                             camera3_stream_configuration_t *stream_list);

    // 注册Buffer(Framework将Buffer句柄传递给HAL)
    int (*register_stream_buffers)(const struct camera3_device *,
                                   const camera3_stream_buffer_set_t *buffer_set);

    // 处理Capture Request,核心Buffer填充入口
    int (*process_capture_request)(const struct camera3_device *,
                                   camera3_capture_request_t *request);

    // 获取元数据,包括Buffer相关的静态信息
    void (*get_metadata)(const struct camera3_device *,
                         camera_metadata_t *settings);

    // 刷新所有待处理的Request
    int (*flush)(const struct camera3_device *);

    // 销毁设备,释放所有Buffer资源
    void (*dump)(const struct camera3_device *, int fd);
} camera3_device_ops_t;
HAL3接口核心调用流程 HAL3接口核心调用流程(Buffer视角) CameraService initialize() configure_streams() register_stream_buffers() process_capture_request() Buffer生命周期关键点 ① configure_streams: 定义Buffer属性 ② register_stream_buffers: 注册Buffer句柄 ③ process_capture_request: 填充Buffer数据

2.4 Buffer在调用链路中的流转

Buffer是贯穿整个Camera调用链路的核心数据载体。理解Buffer在不同层级间的传递方式,是掌握HAL层Buffer管理的前提。

Buffer在各层间的传递形式
层级 Buffer表示形式 所有权归属 传递方式
App层 Surface / Image App进程 通过Surface传递到Framework
Framework层 ANativeWindow / GraphicBuffer SurfaceFlinger / BufferQueue 通过BufferQueue跨进程传递
HAL层 camera3_stream_buffer / buffer_handle_t CameraProvider进程 通过HIDL/AIDL传递native_handle
Kernel层 DMA-BUF fd / ion handle ISP驱动 / 硬件 通过文件描述符传递
高通平台特殊处理:在高通平台上,HAL层接收到的buffer_handle_t通常对应ION/DMA-BUF分配的内存。HAL需要调用mmap将物理地址映射到用户空间,供ISP硬件写入数据。Buffer管理的关键在于:何时映射、何时取消映射、如何避免内存碎片。

2.5 本章小结

本章从宏观到微观,系统梳理了Android Camera的四层架构与调用链路。核心要点包括:

  • CameraProvider作为独立进程,通过HIDL/AIDL与Framework通信,是HAL层Buffer管理的执行主体。
  • HAL3接口的configure_streams、register_stream_buffers、process_capture_request三个函数构成了Buffer生命周期的核心三角。
  • Buffer在各层以不同形式传递,从App的Surface到Kernel的DMA-BUF fd,每一层都需要正确的生命周期管理。
  • 高通平台在AIDL模式下,需要特别关注native_handle的跨进程传递与资源释放。