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 10+中,Camera HAL以独立的
CameraProvider进程运行,与Framework的CameraService通过HIDL/AIDL通信。这种进程隔离设计增强了系统稳定性——即使HAL崩溃也不会直接导致System Server挂掉。
2.2 从App到Framework的调用链路
当用户打开相机App并点击拍照按钮时,背后经历了一系列复杂的跨进程与跨层调用。以下是典型的预览流建立过程:
- App调用CameraManager.openCamera():通过CameraManager获取CameraDevice实例,触发Framework层的权限检查与设备枚举。
- CameraService创建CameraDeviceClient:Framework层的CameraService收到请求后,创建CameraDeviceClient对象,并为其分配一个唯一的Camera ID。
- Camera3Device初始化:CameraDeviceClient内部持有Camera3Device实例,该实例负责与HAL层交互,管理Stream配置与Request提交。
- 创建Session与配置Stream:App通过createCaptureSession()配置输出Surface(如PreviewSurface、ImageReader Surface),Framework将这些Surface转换为HAL层的Stream。
- 提交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.providerAIDL接口,性能更优,支持更灵活的跨进程数据传输。高通平台从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;
2.4 Buffer在调用链路中的流转
Buffer是贯穿整个Camera调用链路的核心数据载体。理解Buffer在不同层级间的传递方式,是掌握HAL层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的跨进程传递与资源释放。