Android CameraServer Camera3Device/AidlCamera3Device梳理

📅 2026/7/24 22:07:47
Android CameraServer Camera3Device/AidlCamera3Device梳理
Camera3Device / AidlCamera3Device 设计与实现文件位置:common/CameraDeviceBase.h— 纯虚接口基类device3/Camera3Device.h/Camera3Device.cpp— 核心共享逻辑 (~6000行)device3/aidl/AidlCamera3Device.h/AidlCamera3Device.cpp— AIDL HAL 子类device3/hidl/HidlCamera3Device.h/HidlCamera3Device.cpp— HIDL HAL 子类1. 类层次结构FrameProducer (虚基类) - CameraDeviceBase (纯虚接口, common/CameraDeviceBase.h) - Camera3Device (核心共享逻辑, device3/Camera3Device.h) - AidlCamera3Device (AIDL HAL 子类, device3/aidl/) - HidlCamera3Device (HIDL HAL 子类, device3/hidl/)Camera3Device 实现的 mixin 接口:camera3::SetErrorInterface— 错误状态转换camera3::InflightRequestUpdateInterface— 在途请求簿记camera3::RequestBufferInterface— HAL buffer 请求序列化camera3::FlushBufferInterface— buffer flush 操作AttributionAndPermissionUtilsEncapsulator— 权限/身份工具AIDL vs HIDL 回调差异:HidlCamera3Device直接继承ICameraDeviceCallback(自身就是 HIDL binder 对象)AidlCamera3Device使用独立内部类AidlCameraDeviceCallbacks(std::shared_ptr管理),因为 NDK AIDL 后端不支持sp2. 核心成员变量2.1 Camera3Device变量类型说明mInterfaceLockMutex序列化公共 API(输入/配置端),必须在 mLock 之前获取mLockMutex内部状态主锁mIdconst std::string相机设备 IDmStatusenum Status设备状态机值mStatusChangedCondition状态变更条件变量mRecentStatusUpdatesVectorStatusInfo最近状态变更历史,用于 waitUntilStateThenRelockmErrorCausestd::stringSTATUS_ERROR 时的错误信息mOutputStreamscamera3::StreamSet所有活跃输出流集合mInputStreamspCamera3Stream单个输入流(如有)mInterfacespHalInterface抽象 HAL 接口指针(多态:AidlHalInterface 或 HidlHalInterface)mDeviceInfoCameraMetadata静态相机特性 metadatamPhysicalDeviceInfoMapunordered_mapstring, CameraMetadata逻辑多相机的每个物理相机特性mRequestThreadspRequestThread请求下发线程mStatusTrackerspStatusTracker空闲检测跟踪器mBufferManagerspCamera3BufferManagerGraphicBuffer 管理器mPreparerThreadspPreparerThreadbuffer 预分配后台线程mInFlightMapInFlightRequestMap在途请求跟踪映射(受 mInFlightLock 保护)mResultQueuestd::listCaptureResult已完成捕获结果队列mListenerwpNotificationListener上游通知监听器(CameraDeviceClient)mUseHalBufManagerboolHAL 是否使用自身 buffer 管理mRequestBufferSMRequestBufferStateMachine控制 HAL 何时可请求 buffer 的状态机mDistortionMappersunordered_mapstring, DistortionMapper每相机畸变矫正映射器mZoomRatioMappersunordered_mapstring, ZoomRatioMapper每相机变焦比映射器mRotateAndCropMappersunordered_mapstring, RotateAndCropMapper每相机旋转裁剪映射器mInjectionMethodsspCamera3DeviceInjectionMethods注入相机支持mCameraServiceWatchdogspCameraServiceWatchdog检测 HAL 挂起的看门狗线程2.2 AidlCamera3Device 额外成员变量类型说明mResultMetadataQueueunique_ptrAidlResultMetadataQueue接收 HAL 捕获结果 metadata 的 FMQmCallbacksshared_ptrAidlCameraDeviceCallbacks注册到 HAL 的 AIDL 回调 binder 对象mBatchSizeLimitEnabledbool高速配置的 batch_size_max 是否生效mSensorReadoutTimestampSupportedboolHAL 是否支持传感器读出时间戳3. 核心内部类3.1 HalInterface — HAL 通信策略接口位置:Camera3Device.h:486-646抽象内部类,定义 HAL 通信契约。继承Camera3StreamBufferFreedListener和BufferRecordsInterface。关键纯虚方法:方法说明getTransportType()返回 AIDL 或 HIDLconfigureStreams()配置 HAL 流processBatchCaptureRequests()批量下发捕获请求到 HALflush()/close()生命周期管理constructDefaultRequestSettings()获取默认请求模板signalPipelineDrain()通知 HAL 排空管线isReconfigurationRequired()检查会话参数是否需要重新配置具体子类:子类位置说明AidlHalInterfaceAidlCamera3Device.h:80-164封装 ICameraDeviceSession + AidlRequestMetadataQueueHidlHalInterfaceHidlCamera3Device.h:99-177封装版本化 HIDL session 对象 (3.2-3.7)3.2 RequestThread — 请求下发线程位置:Camera3Device.h:1007-1360继承Thread,从队列取出请求批量下发到 HAL。关键成员:成员类型说明mParentwpCamera3Device拥有设备的弱引用mInterfacespHalInterfaceHAL 接口mRequestQueueRequestList一次性请求队列mRepeatingRequestsRequestListrepeating 请求队列mNextRequestsVectorNextRequest当前正在准备/提交的批次mFrameNumberuint32_t单调递增帧计数器mTriggerMapTriggerMap排队的触发器(AF、AE 预捕获)mLatestSessionParamsCameraMetadata跟踪会话参数用于重配置检测mStatusIdintStatusTracker 注册的组件 ID关键方法:方法说明threadLoop()主循环:waitForNextRequestBatch → prepareHalRequests → sendRequestsBatchsetRepeatingRequests()设置 repeating 请求queueRequestList()一次性请求入队flush()flush 所有待处理请求queueTrigger()排队触发器注入下一个请求setPaused()暂停/恢复线程(重配置期间)