Android CameraServer架构理解
0. 全链路架构总览
+=====================================================================+ | App 层 (Java/Native) | | android.hardware.camera2 (Camera2 API) | | android.hardware.Camera (Camera1 API, 兼容垫片) | +=====================================================================+ | Binder IPC: AIDL (ICameraDeviceUser / ICamera) v +=====================================================================+ | Framework 层 (Camera Framework) | | CameraManager -> CameraDevice -> CameraCaptureSession | | CameraDeviceCallbacks (结果/事件回调) | | CaptureRequest / OutputConfiguration | +=====================================================================+ | Binder IPC: AIDL (ICameraService) v +=====================================================================+ | Camera Service 进程 (cameraserver) | | [本文重点分析的 libcameraservice] | | CameraService -> CameraDeviceClient -> Camera3Device | | CameraProviderManager -> ProviderInfo -> DeviceInfo3 | +=====================================================================+ | Binder IPC: AIDL (ICameraProvider/ICameraDeviceSession) [当前标准] | HIDL (旧版本兼容) v +=====================================================================+ | Camera Provider 进程 (vendor 分区) | | AIDL 接口实现 (当前标准) -> HAL3 接口调用 | | HIDL 接口 (旧版本兼容) | | 通过 dlopen 加载 HAL3 SO 库 | +=====================================================================+ | HAL3 接口 (camera_module_t / camera3_device_t) v +=====================================================================+ | Camera HAL (厂商实现) | | 通过 dlopen 加载 HAL3 SO 库 | | 处理图像处理流水线、流配置、请求处理 | +=====================================================================+ | v +=====================================================================+ | Camera Driver (内核层) | | V4L2 框架 | | v4l2_subdev 子设备 | +=====================================================================+ | I2C / MIPI CSI v +=====================================================================+ | Camera Hardware (硬件层) | | Sensor / ISP (IPE/BPS) / Lens Actuator / OIS / Flash / EEPROM | +=====================================================================+核心设计理念:
- Treble 项目: 将平台厂商实现 (vendor) 与系统框架 (system) 隔离,Camera HAL Module 从 Camera Service 解耦到独立进程 Camera Provider
- 双重跨进程: App->Service 通过 AIDL,Service->Provider 通过 AIDL(当前标准,旧平台兼容 HIDL)
- 接口与实现分离: AIDL 接口定义暴露给厂商实现,HAL3 接口由厂商填充具体逻辑
各层职责:
| 层级 | 进程 | 核心职责 |
|---|---|---|
| App | App 进程 | 用户交互,创建 CaptureRequest,配置 Stream |
| Framework | App 进程 | Camera2 API 实现,封装 Camera Service 调用 |
| Camera Service | cameraserver | 中转站角色,管理客户端/设备/Provider,权限控制,驱逐策略 |
| Camera Provider | cameraserver (vendor) | AIDL 接口实现(当前标准),HAL3 接口调用,SO 库加载 |
| Driver | 内核 | V4L2 框架,子设备控制 |
| Hardware | 硬件 | Sensor 曝光/增益控制,ISP 图像处理,Lens 对焦 |
1. 总体架构设计 (libcameraservice)
1.1 Camera Service 内部分层架构
+-------------------------------------------------------------------+ | App 进程 (Java/Native) | | android.hardware.camera2 / android.hardware.Camera | +-------------------------------------------------------------------+ | (Binder IPC: ICameraDeviceUser / ICamera) v +-------------------------------------------------------------------+ | cameraserver 进程 (libcameraservice) | | | | +--------------------+ +------------------------------------+ | | | CameraService | | CameraProviderManager | | | | (Binder 服务) |--->| (HAL Provider 发现) | | | | "media.camera" | | ProviderInfo[] -> DeviceInfo3 | | | +--------------------+ +------------------------------------+ | | | | | | +-------v-----------+ +-----------v-----------+ | | | API 层 | | HAL 传输层 | | | | api1/ Camera2Client| | aidl/ AidlCameraService| | | | api2/ CameraDevice | | hidl/ HidlCameraService| | | | Client | +------------------------+ | | +--------+----------+ | | | | v | | +--------v----------+ +-------------------+ | | | 客户端基类 | | Camera3Device | | | | Camera2ClientBase |<--->| (Device3 层) | | | +--------------------+ | AidlCamera3Device | | | | HidlCamera3Device | | | +-------------------+ | | | | | +---------------------------------v-------------------------------+| | | Stream 层 (device3/) || | | Camera3Stream -> Camera3IOStreamBase -> Camera3OutputStream || | | -> Camera3InputStream || | | -> Camera3SharedOutputStream || | | Camera3StreamSplitter / Camera3BufferManager || | +------------------------------------------------------------------+| +-------------------------------------------------------------------+ | (AIDL IPC) [当前标准,HIDL 为旧版本兼容] v +-------------------------------------------------------------------+ | Camera HAL (厂商实现) | | ICameraDeviceSession / ICameraDevice | +-------------------------------------------------------------------+1.2 目录结构
| 目录 | 职责 |
|---|---|
root/ | CameraService 核心 (CameraService.h/cpp, CameraFlashlight, CameraServiceWatchdog) |
aidl/ | 稳定 NDK AIDL 服务包装 (AidlCameraService, AidlCameraDeviceUser, DeathPipe) |
hidl/ | HIDL-to-AIDL 桥接适配器(旧版本兼容) (HidlCameraService, HidlCameraDeviceUser, CameraHybridInterface) |
api1/ | 旧版 Camera1 API 客户端 (Camera2Client) |
api1/client2/ | API1 流水线组件 (FrameProcessor, StreamingProcessor, CaptureSequencer, JpegProcessor, ZslProcessor, CallbackProcessor, Parameters) |
api2/ | 现代 Camera2 API 客户端 (CameraDeviceClient, CameraOfflineSessionClient, CompositeStream 变体) |
common/ | 共享基类 (Camera2ClientBase, CameraDeviceBase, CameraProviderManager, FrameProcessorBase) |
common/aidl/ | AIDL ProviderInfo |
common/hidl/ | HIDL ProviderInfo |
device3/ | Camera3 设备 + Stream 实现 (Camera3Device, streams, mappers, StatusTracker, BufferManager) |
device3/aidl/ | Camera3Device 的 AIDL 传输层 |
device3/hidl/ | Camera3Device 的 HIDL 传输层 |
device3/deprecated/ | 已废弃的 Camera3StreamSplitter |
config/ | SharedSessionConfigReader/Utils |
gui/ | RingBufferConsumer |
utils/ | 工具类 (ClientManager, AttributionAndPermissionUtils, TagMonitor, ExifUtils, SessionConfigurationUtils 等) |
tests/ | 单元测试 |
fuzzer/,libcameraservice_fuzzer/ | 模糊测试 |
1.3 Binder 服务注册与双重角色
CameraService继承BinderService<CameraService>,通过静态instantiate()注册为"media.camera"服务。服务入口点是AidlCameraService(NDK 稳定 AIDL),它包装了核心CameraService类。
Camera Service 的双重角色:
- 对上 (AIDL Server): 作为服务端,通过 AIDL 接口处理来自 Camera Framework 的跨进程请求
- 对下 (AIDL Client): 作为客户端,通过 AIDL 接口将请求转发至 Camera Provider(旧平台兼容 HIDL)
1.4 AIDL 接口定义
| AIDL 接口 | 实现类 | 关键方法 |
|---|---|---|
ICameraService.aidl | CameraService | getNumberOfCameras()获取相机数量,connectDevice()打开设备,addListener()添加状态监听 |
ICameraDeviceUser.aidl | CameraDeviceClient | disconnect()关闭设备,submitRequestList()发送请求,beginConfigure()/endConfigure()配置流,createDefaultRequest()创建默认请求 |
ICameraDeviceCallbacks.aidl | FrameworkCameraDeviceCallbacks | onResultReceived()结果回传,onCaptureStarted()采集开始通知,onDeviceError()错误通知 |
ICameraServiceListener.aidl | FrameworkCameraManagerGlobal | onStatusChanged()设备状态变更通知 |
1.4 API1 状态说明
API1 (android.hardware.Camera)仍在使用,但不再是直接对接 Camera HAL 1.0。它作为兼容垫片运行在 HAL3 之上:
- App 调用
ICamera(Binder) ->CameraService::connect()(API_1) ->Camera2Client(翻译层) ->Camera3Device(HAL3) - HAL 1.0 已被明确拒绝 (
ERROR_DEPRECATED_HAL) - 代码库中无废弃标记、无移除计划、无 feature flag 控制 API1
CameraProviderManager::getAPI1CompatibleCameraDeviceIds()等兼容性基础设施仍在维护
2. 核心模块详解
2.1 CameraService(中央服务)
文件:CameraService.h/.cpp(290KB 源码, 72KB 头文件 – 代码库中最大)
继承关系:
CameraService : BinderService<CameraService>, BnCameraService, IBinder::DeathRecipient, CameraProviderManager::StatusListener, IServiceManager::LocalRegistrationCallback, AttributionAndPermissionUtilsEncapsulator关键内部类:
| 类 | 职责 |
|---|---|
BasicClient | 所有相机客户端的抽象基类。持有 camera ID、朝向、方向、PID/UID、远程 binder。管理权限生命周期 (notifyCameraOpening, startCameraStreamingOps, finishCameraStreamingOps, notifyCameraClosing)。 |
Client | API1 客户端基类。继承BnCamera+BasicClient。声明 ICamera 纯虚方法 (lock, unlock, startPreview, takePicture)。 |
CameraState | 每设备状态容器 (ID, status, cost, 冲突设备, 物理相机)。存储在mCameraStatesmap 中。 |
CameraClientManager | 支持驱逐的活跃客户端容器,通过ClientDescriptor封装。使用ClientManager<BasicClient>模板。 |
UidPolicy | 追踪 UID 空闲/活跃状态以执行隐私策略。空闲 UID 不能使用相机。 |
SensorPrivacyPolicy | 执行传感器隐私开关(启用时终止所有相机访问)。 |
ServiceListener | ICameraServiceListener回调的 death-recipient 包装。 |
CameraInjectionSession | 用于测试的相机注入。 |
关键成员变量:
mCameraProviderManager(sp) – HAL provider 管理mActiveClientManager(CameraClientManager) – 活跃客户端追踪/驱逐mCameraStates(map<string, shared_ptr>) – 每设备状态mFlashlight(sp) – 闪光灯/手电筒控制mServiceLock(Mutex) – 主服务锁mUidPolicy,mSensorPrivacyPolicy– 隐私执行mTorchStatusMap,mTorchClientMap– 手电筒状态追踪mVirtualDeviceCameraIdMapper– 虚拟设备 camera ID 重映射
ICameraService Binder 接口方法:
getNumberOfCameras(),getCameraInfo(),getCameraCharacteristics()– 相机枚举connect()– API1 连接 (返回 ICamera)connectDevice()– API2 连接 (返回 ICameraDeviceUser)addListener()/removeListener()– 相机状态回调setTorchMode(),turnOnTorchWithStrengthLevel(),getTorchStrengthLevel()– 手电筒控制getConcurrentCameraIds(),isConcurrentSessionConfigurationSupported()– 并发相机injectCamera(),injectSessionParams()– 测试注入warmUp()– 预热相机设备notifySystemEvent(),notifyDeviceStateChange()– 系统事件
2.2 Camera2ClientBase(模板客户端基类)
文件:common/Camera2ClientBase.h/.cpp
Camera2ClientBase<TClientBase> : TClientBase, NotificationListenerAPI1 (Camera2Client) 和 API2 (CameraDeviceClient) 共享的模板基类。提供:
connect()/disconnect()– 设备生命周期initialize(sp<CameraProviderManager>)– 调用initializeImpl()创建 Camera3Device- 通知回调:
notifyError(),notifyShutter(),notifyAutoFocus/Exposure/Whitebalance() notifyActive()/notifyIdle()– 空闲/活跃状态切换
关键成员:mDevice(sp) – HAL3 设备包装。
2.3 Camera2Client(API1 客户端)
文件:api1/Camera2Client.h/.cpp
Camera2Client : Camera2ClientBase<CameraService::Client>在 HAL3 之上实现旧版android.hardware.Camera(API1) 接口。包含 API1 专用流水线组件:
StreamingProcessor– 管理预览/录像流CaptureSequencer– 编排拍照序列JpegProcessor– JPEG 编码ZslProcessor– 零快门延迟处理CallbackProcessor– 回调数据传递Parameters– API1 参数管理
请求 ID 范围: 预览 (10M-20M), 录像 (20M-30M), 拍照 (30M-40M)。
2.4 CameraDeviceClient(API2 客户端)
文件:api2/CameraDeviceClient.h/.cpp
CameraDeviceClientBase : CameraService::BasicClient, BnCameraDeviceUser CameraDeviceClient : Camera2ClientBase<CameraDeviceClientBase>, FrameProcessorBase::FilteredListener现代 Camera2 API 实现。关键方法:
submitRequest()/submitRequestList()/cancelRequest()– 捕获请求管理beginConfigure()/endConfigure()/createStream()/deleteStream()– 流配置startStreaming()/waitUntilIdle()/flush()– 流生命周期prepare()/tearDown()– Buffer 预分配switchToOffline()– 切换到离线处理
关键成员:mFrameProcessor,mStreamMap,mConfiguredOutputs,mCompositeStreamMap,mResultMetadataQueue。
组合流:DepthCompositeStream,HeicCompositeStream,JpegRCompositeStream– 继承CompositeStream基类。
与 Camera3Device 的连接关系 (初始化时建立):
Camera2ClientBase::initialize()调用Camera3Device::initialize()初始化设备Camera3Device::setNotifyCallback()将 Camera2ClientBase 注册为事件回调接收者- 实例化
FrameProcessorBase并传入Camera3Device,建立 metadata 中转联系 FrameProcessorBase启动后台线程,等待 Camera3Device 的结果- Camera3Device 事件 (notify) -> 直接给 CameraDeviceClient
- Camera3Device metadata -> FrameProcessorBase -> CameraDeviceClient
2.5 Camera3Device(HAL3 设备)
文件:device3/Camera3Device.h/.cpp
Camera3Device : CameraDeviceBase, SetErrorInterface, InflightRequestUpdateInterface, RequestBufferInterface, FlushBufferInterface核心设备抽象。抽象类 –AidlCamera3Device和HidlCamera3Device提供传输层特定实现。
关键内部类:
| 类 | 职责 |
|---|---|
HalInterface | 抽象 HAL 会话包装 (configureStreams, processBatchCaptureRequests, flush, close)。具体实现:HidlHalInterface,AidlHalInterface。 |
RequestThread | 专用线程,负责向 HAL 提交捕获请求。管理请求队列、重复请求、触发器、暂停/恢复、批量提交。 |
CaptureRequest | 单个捕获请求,包含设置列表、输入/输出流、批大小。 |
PreparerThread | 后台线程,用于预分配流 Buffer。 |
Camera3DeviceInjectionMethods | 管理 HAL 接口替换(注入测试)。 |
RequestBufferStateMachine | 控制 HAL 何时可以请求 Buffer (ready/stopped/pending-stop)。 |
状态机:
STATUS_ERROR -> STATUS_UNINITIALIZED -> STATUS_UNCONFIGURED -> STATUS_CONFIGURED -> STATUS_ACTIVE关键成员:
mInterface(sp) – HAL 会话接口mOutputStreams(StreamSet) – 所有活跃输出流mInputStream(sp) – 可选输入流mRequestThread(sp) – 请求提交线程mStatusTracker(sp) – 空闲/活跃状态追踪mBufferManager(sp) – 共享 Buffer 管理mInFlightMap– 在途请求追踪mDistortionMappers,mZoomRatioMappers,mRotateAndCropMappers,mUHRCropAndMeteringRegionMappers– 每相机 metadata 映射器
Camera3Device 作为 ICameraDeviceCallback 的角色:
- Camera3Device 实现了 Provider 端的
ICameraDeviceCallback接口 - 初始化时通过
CameraProviderManager::openSession()将自身作为回调传入 Provider - Provider 通过此回调将结果 (notify/processCaptureResult/returnStreamBuffers) 回传给 Camera3Device
- Camera3Device 内部再将事件和数据分发给 CameraDeviceClient 和 FrameProcessorBase
2.6 AidlCamera3Device / HidlCamera3Device(传输层)
AidlCamera3Device(device3/aidl/AidlCamera3Device.h/.cpp) —当前标准:
AidlHalInterface包装ICameraDeviceSession(AIDL)- 使用
AidlRequestMetadataQueue(FMQ) 实现快速请求提交 AidlCameraDeviceCallbacks实现BnCameraDeviceCallback(processCaptureResult, notify, requestStreamBuffers, returnStreamBuffers)- 通过
std::shared_ptr管理(NDK 后端要求)
HidlCamera3Device(device3/hidl/HidlCamera3Device.h/.cpp) —旧版本兼容:
HidlHalInterface包装多版本 HIDL 会话 (V3_2 至 V3_7)- 使用
RequestMetadataQueue(HIDL FMQ) - 版本化会话指针:
mHidlSession(V3_2),mHidlSession_3_3…mHidlSession_3_7
2.7 CameraProviderManager(HAL Provider 管理器)
文件:common/CameraProviderManager.h/.cpp
CameraProviderManager : hidl::manager::V1_0::IServiceNotification, IServiceManager::LocalRegistrationCallback发现并管理所有 Camera HAL provider(当前标准 AIDL,兼容旧版 HIDL)。
关键内部结构:
| 结构体 | 职责 |
|---|---|
StatusListener | 纯虚回调接口 (由 CameraService 实现)。onDeviceStatusChanged(), onTorchStatusChanged(), onNewProviderRegistered()。 |
ProviderInfo | 每 provider 状态: 名称、设备列表、vendor tags、手电筒支持。 |
DeviceInfo | 每设备: ID、版本、特性、状态、资源开销。 |
DeviceInfo3 | HALv3 特有,含特性修正 (单色、HEIC、JPEG/R、深度等)。 |
关键方法:initialize(),getCameraCount(),getCameraDeviceIds(),getCameraCharacteristics(),openAidlSession(),openHidlSession(),setTorchMode(),hasFlashUnit(),isSessionConfigurationSupported(),warmUp()。
2.8 Stream 层次结构
Camera3StreamInterface (纯虚接口) | v Camera3Stream (基类, 继承 camera_stream C 结构体) | v Camera3IOStreamBase (增加 buffer 计数、帧计数) | +---> Camera3OutputStream (输出到 Surface 消费者) | | | +---> Camera3SharedOutputStream (通过 StreamSplitter 支持多 Surface) | +---> Camera3InputStream (输入/重处理, 来自 BufferItemConsumer)Camera3OutputStream:处理 Buffer 出队/入队到 Surface、BufferManager 集成、批量操作、PreviewFrameSpacer (显示 Vsync 同步)、镜像模式、丢帧支持。
Camera3SharedOutputStream:通过Camera3StreamSplitter支持最多 4 个消费者 Surface。用于共享相机会话。
Camera3FakeStream:用于测试/注入的伪流。
2.9 StatusTracker
文件:device3/StatusTracker.h/.cpp
StatusTracker : Thread通过聚合组件状态 (流、RequestThread、BufferManager) 追踪空闲/活跃状态。后台线程处理状态变更事件和合并的 fence。当所有组件都空闲且所有 fence 信号就绪时,通过notifyStatus()通知 Camera3Device。
2.10 CameraFlashlight
文件:CameraFlashlight.h/.cpp
FlashControlBase (抽象) | +---> ProviderFlashControl (HAL provider v2.4+) CameraFlashlight (门面)管理闪光单元发现和手电筒控制。使用CameraProviderManager进行 provider 级手电筒控制。旧的 HAL v1 向后兼容模式已移除。
2.11 Buffer 管理
Camera3BufferManager(device3/Camera3BufferManager.h/.cpp): 跨流管理共享 Buffer 池。动态分配/授予/回收 Buffer。
Camera3StreamSplitter(device3/Camera3StreamSplitter.h/.cpp): 将单个 HAL 输出流拆分到多个消费者 Surface。由 Camera3SharedOutputStream 使用。
PreviewFrameSpacer(device3/PreviewFrameSpacer.h/.cpp): 重新调整预览帧间距以匹配显示 Vsync 时序。
2.12 CameraServiceWatchdog(看门狗)
文件:CameraServiceWatchdog.h/.cpp
功能:检测 Camera HAL 的异常状态(卡死/超时),超时后杀死相关进程并生成 tombstone 用于调试。
工作机制:
- 独立线程,通过循环计数器(cycle counter)监控每个被监视线程的执行时间
- 周期长度:
kCycleLengthMs = 100ms(每个 cycle 100ms) - 最大周期:
kMaxCycles = 650(即最大容忍65 秒)
使用方式:通过WATCH()宏包裹需要监控的函数调用:
#defineWATCH(toMonitor)watchThread([&](){returntoMonitor;},gettid(),__FUNCTION__)当前监控的调用(Camera3Device.cpp):
interface->close()(line 384) — HAL 关闭操作mRequestThread->flush()(line 1899) — flush 操作
超时处理流程:
- 周期 0~487 (0~48.7s): 正常监控,cycles 递增
cycles == mMaxCycles * 3/4(487): 预警告 — 通知 CameraServiceProxy dump 所有相关进程的 stack tracecycles >= mMaxCycles(650 = 65s): 触发 abort- 激活 Perfetto trace(300s 冷却期)
- 记录 close 日志(CAMERA_WATCHDOG_ERROR)
kill(provider_pids, SIGABRT)— 杀死 Provider 进程abort()— 杀死 cameraserver 进程,生成 tombstone
关键代码位置:
- 初始化:
Camera3Device.cpp:283— 创建并启动 watchdog 线程 - 监控 close():
Camera3Device.cpp:384 - 监控 flush():
Camera3Device.cpp:1899 - 启用/禁用:
Camera3Device.cpp:4774—setCameraServiceWatchdog()
禁用方式:
adb shell cmd media.camera set-watchdog0# 禁用adb shell cmd media.camera set-watchdog1# 启用2.13 关键类间关系(继承、组合、聚合、关联)
继承层次
Core Device 继承链:
RefBase └── FrameProducer └── CameraDeviceBase └── Camera3Device ├── AidlCamera3Device │ └── AidlCamera3SharedDevice └── HidlCamera3DeviceStream 继承链:
RefBase └── Camera3StreamInterface ├── Camera3OutputStreamInterface └── Camera3Stream └── Camera3IOStreamBase ├── Camera3OutputStream │ └── Camera3SharedOutputStream └── Camera3InputStreamClient 继承链:
RefBase └── BasicClient ├── Client (BnCamera) [API1] │ └── Camera2ClientBase<Client> │ └── Camera2Client [API1] └── CameraDeviceClientBase (BnCameraDeviceUser) └── Camera2ClientBase<CameraDeviceClientBase> └── CameraDeviceClient [API2]HAL Interface 继承链:
HalInterface (Camera3Device 内部类) ├── AidlHalInterface └── HidlHalInterface RequestThread ├── AidlRequestThread └── HidlRequestThread组合关系(强生命周期 sp<>, unique_ptr<>)
CameraService 拥有:
sp<CameraProviderManager>— Provider 管理器sp<CameraFlashlight>— 闪光灯控制sp<UidPolicy>,sp<SensorPrivacyPolicy>— 策略管理CameraClientManager— 管理所有sp<BasicClient>vector<sp<ServiceListener>>— 服务监听器列表
Camera2ClientBase<T> 拥有:
sp<CameraDeviceBase> mDevice— 实际为 Camera3Device 子类shared_ptr<CameraServiceProxyWrapper>
CameraDeviceClient (API2) 拥有:
sp<FrameProcessorBase>— 帧处理器map<SurfaceKey, sp<CompositeStream>>— 复合流映射unique_ptr<MetadataQueue>— FMQ 结果队列
Camera3Device 拥有:
sp<HalInterface> mInterface— HAL 接口(Aidl/Hidl)sp<RequestThread>— 请求提交线程sp<PreparerThread>— Buffer 预分配线程sp<StatusTracker>— 状态追踪sp<Camera3BufferManager>— Buffer 管理sp<Camera3DeviceInjectionMethods>— 注入方法StreamSet— 输出流集合(包含 sp<Camera3Stream>)
Camera3OutputStream 拥有:
sp<Surface> mConsumer— 消费者 Surfacesp<Camera3BufferManager>— Buffer 管理(外部设置)sp<BufferProducerListener>— 生产者监听
AidlHalInterface 拥有:
shared_ptr<ICameraDeviceSession>— AIDL 会话shared_ptr<AidlRequestMetadataQueue>— 请求 FMQ
HidlHalInterface 拥有:
sp<ICameraDeviceSession>V3_2~V3_7 — 多版本 HIDL 会话shared_ptr<RequestMetadataQueue>— 请求 FMQ
聚合关系(弱生命周期 wp<>, 原始指针)
Camera3Device 持有弱引用:
wp<NotificationListener>— 通知监听(CameraDeviceClient)
RequestThread 持有弱引用:
wp<Camera3Device>— 父设备wp<NotificationListener>— 通知监听
FrameProcessorBase 持有弱引用:
wp<FrameProducer>— 设备(Camera3Device)
Camera3Stream 持有弱引用:
wp<Camera3StreamBufferFreedListener>— Buffer 释放监听wp<StatusTracker>— 状态追踪
AidlCameraDeviceCallbacks 持有弱引用:
wp<AidlCamera3Device>— 父设备
关联关系(非拥有)
AidlCameraService → CameraService:
CameraService* mCameraService(原始指针,不拥有)— AidlCameraService 包装 CameraService 的 AIDL 接口
Camera3OutputUtils / Camera3OutputUtilsTemplated:
- 自由函数命名空间,通过参数引用 CaptureOutputStates 等结构体操作 StreamSet、InFlightMap 等
所有权链总览
CameraService ├── sp<CameraProviderManager> ├── sp<CameraFlashlight> ├── CameraClientManager (管理 sp<BasicClient>) └── vector<sp<ServiceListener>> Camera2ClientBase<T> ├── sp<CameraDeviceBase> (实际 Camera3Device) └── shared_ptr<CameraServiceProxyWrapper> Camera3Device ├── sp<HalInterface> (Aidl/Hidl) ├── sp<RequestThread> ├── sp<PreparerThread> ├── sp<StatusTracker> ├── sp<Camera3BufferManager> ├── StreamSet (sp<Camera3Stream>) └── wp<NotificationListener> (CameraDeviceClient) Camera3OutputStream ├── sp<Surface> mConsumer ├── sp<Camera3BufferManager> └── wp<Camera3StreamBufferFreedListener> AidlHalInterface ├── shared_ptr<ICameraDeviceSession> └── shared_ptr<AidlRequestMetadataQueue> FrameProcessorBase └── wp<FrameProducer> (Camera3Device)设计模式
| 模式 | 应用 |
|---|---|
| 策略模式 | HalInterface抽象类,AidlHalInter |
