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 接口由厂商填充具体逻辑各层职责:层级进程核心职责AppApp 进程用户交互,创建 CaptureRequest,配置 StreamFrameworkApp 进程Camera2 API 实现,封装 Camera Service 调用Camera Servicecameraserver中转站角色,管理客户端/设备/Provider,权限控制,驱逐策略Camera Providercameraserver (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 ProviderInfocommon/hidl/HIDL ProviderInfodevice3/Camera3 设备 + Stream 实现 (Camera3Device, streams, mappers, StatusTracker, BufferManager)device3/aidl/Camera3Device 的 AIDL 传输层device3/hidl/Camera3Device 的 HIDL 传输层device3/deprecated/已废弃的 Camera3StreamSplitterconfig/SharedSessionConfigReader/Utilsgui/RingBufferConsumerutils/工具类 (ClientManager, AttributionAndPermissionUtils, TagMonitor, ExifUtils, SessionConfigurationUtils 等)tests/单元测试fuzzer/,libcameraservice_fuzzer/模糊测试1.3 Binder 服务注册与双重角色CameraService继承BinderServiceCameraService,通过静态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.aidlCameraServicegetNumberOfCameras()获取相机数量,connectDevice()打开设备,addListener()添加状态监听ICameraDeviceUser.aidlCameraDeviceClientdisconnect()关闭设备,submitRequestList()发送请求,beginConfigure()/endConfigure()配置流,createDefaultRequest()创建默认请求ICameraDeviceCallbacks.aidlFrameworkCameraDeviceCallbacksonResultReceived()结果回传,onCaptureStarted()采集开始通知,onDeviceError()错误通知ICameraServiceListener.aidlFrameworkCameraManagerGlobalonStatusChanged()设备状态变更通知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 控制 API1CameraProviderManager::getAPI1CompatibleCameraDeviceIds()等兼容性基础设施仍在维护2. 核心模块详解2.1 CameraService(中央服务)文件:CameraService.h/.cpp(290KB 源码, 72KB 头文件 – 代码库中最大)继承关系:CameraService : BinderServiceCameraService, BnCameraService, IBinder::DeathRecipient, CameraProviderManager::StatusListener, IServiceManager::LocalRegistrationCallback, AttributionAndPermissionUtilsEncapsulator关键内部类:类职责BasicClient所有相机客户端的抽象基类。持有 camera ID、朝向、方向、PID/UID、远程 binder。管理权限生命周期 (notifyCameraOpening, startCameraStreamingOps, finishCameraStreamingOps, notifyCameraClosing)。ClientAPI1 客户端基类。继承BnCamera+BasicClient。声明 ICamera 纯虚方法 (lock, unlock, startPreview, takePicture)。CameraState每设备状态容器 (ID, status, cost, 冲突设备, 物理相机)。存储在mCameraStatesmap 中。CameraClientManager支持驱逐的活跃客户端容器,通过ClientDescriptor封装。使用ClientManagerBasicClient模板。UidPolicy追踪 UID 空闲/活跃状态以执行隐私策略。空闲 UID 不能使用相机。SensorPrivacyPolicy执行传感器隐私开关(启用时终止所有相机访问)。ServiceListenerICameraServiceListener回调的 death-recipient 包装。CameraInjectionSession用于测试的相机注入。关键成员变量:mCameraProviderManager(sp) – HAL provider 管理mActiveClientManager(CameraClientManager) – 活跃客户端追踪/驱逐mCameraStates(mapstring, 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/.cppCamera2ClientBaseTClientBase : TClientBase, NotificationListenerAPI1 (Camera2Client) 和 API2 (CameraDeviceClient) 共享的模板基类。提供:connect()/disconnect()– 设备生命周期initialize(spCameraProviderManager)– 调用initializeImpl()创建 Camera3Device通知回调:notifyError(),notifyShutter(),notifyAutoFocus/Exposure/Whitebalance()notifyActive()/notifyIdle()– 空闲/活跃状态切换关键成员:mDevice(sp) – HAL3 设备包装。2.3 Camera2Client(API1 客户端)文件:api1/Camera2Client.h/.cppCamera2Client : Camera2ClientBaseCameraService::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/.cppCameraDeviceClientBase : CameraService::BasicClient, BnCameraDeviceUser CameraDeviceClient : Camera2ClientBaseCameraDeviceClientBase, 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) - 直接给 CameraDeviceClientCamera3Device metadata - FrameProcessorBase - CameraDeviceClient2.5 Camera3Device(HAL3 设备)文件:device3/Camera3Device.h/.cppCamera3Device : 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()将自身作为回调传入 ProviderProvider 通过此回调将结果 (notify/processCaptureResult/returnStreamBuffers) 回传给 Camera3DeviceCamera3Device 内部再将事件和数据分发给 CameraDeviceClient 和 FrameProcessorBase2.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_72.7 CameraProviderManager(HAL Provider 管理器)文件:common/CameraProviderManager.h/.cppCameraProviderManager : hidl::manager::V1_0::IServiceNotification, IServiceManager::LocalRegistrationCallback发现并管理所有 Camera HAL provider(当前标准 AIDL,兼容旧版 HIDL)。关键内部结构:结构体职责StatusListener纯虚回调接口 (由 CameraService 实现)。onDeviceStatusChanged(), onTorchStatusChanged(), onNewProviderRegistered()。ProviderInfo每 provider 状态: 名称、设备列表、vendor tags、手电筒支持。DeviceInfo每设备: ID、版本、特性、状态、资源开销。DeviceInfo3HALv3 特有,含特性修正 (单色、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/.cppStatusTracker : Thread通过聚合组件状态 (流、RequestThread、BufferManager) 追踪空闲/活跃状态。后台线程处理状态变更事件和合并的 fence。当所有组件都空闲且所有 fence 信号就绪时,通过notifyStatus()通知 Camera3Device。2.10 CameraFlashlight文件:CameraFlashlight.h/.cppFlashControlBase (抽象) | +--- 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] │ └── Camera2ClientBaseClient │ └── Camera2Client [API1] └── CameraDeviceClientBase (BnCameraDeviceUser) └── Camera2ClientBaseCameraDeviceClientBase └── CameraDeviceClient [API2]HAL Interface 继承链:HalInterface (Camera3Device 内部类) ├── AidlHalInterface └── HidlHalInterface RequestThread ├── AidlRequestThread └── HidlRequestThread组合关系(强生命周期 sp, unique_ptr)CameraService 拥有:spCameraProviderManager— Provider 管理器spCameraFlashlight— 闪光灯控制spUidPolicy,spSensorPrivacyPolicy— 策略管理CameraClientManager— 管理所有spBasicClientvectorspServiceListener— 服务监听器列表Camera2ClientBaseT 拥有:spCameraDeviceBase mDevice— 实际为 Camera3Device 子类shared_ptrCameraServiceProxyWrapperCameraDeviceClient (API2) 拥有:spFrameProcessorBase— 帧处理器mapSurfaceKey, spCompositeStream— 复合流映射unique_ptrMetadataQueue— FMQ 结果队列Camera3Device 拥有:spHalInterface mInterface— HAL 接口(Aidl/Hidl)spRequestThread— 请求提交线程spPreparerThread— Buffer 预分配线程spStatusTracker— 状态追踪spCamera3BufferManager— Buffer 管理spCamera3DeviceInjectionMethods— 注入方法StreamSet— 输出流集合(包含 spCamera3Stream)Camera3OutputStream 拥有:spSurface mConsumer— 消费者 SurfacespCamera3BufferManager— Buffer 管理(外部设置)spBufferProducerListener— 生产者监听AidlHalInterface 拥有:shared_ptrICameraDeviceSession— AIDL 会话shared_ptrAidlRequestMetadataQueue— 请求 FMQHidlHalInterface 拥有:spICameraDeviceSessionV3_2~V3_7 — 多版本 HIDL 会话shared_ptrRequestMetadataQueue— 请求 FMQ聚合关系(弱生命周期 wp, 原始指针)Camera3Device 持有弱引用:wpNotificationListener— 通知监听(CameraDeviceClient)RequestThread 持有弱引用:wpCamera3Device— 父设备wpNotificationListener— 通知监听FrameProcessorBase 持有弱引用:wpFrameProducer— 设备(Camera3Device)Camera3Stream 持有弱引用:wpCamera3StreamBufferFreedListener— Buffer 释放监听wpStatusTracker— 状态追踪AidlCameraDeviceCallbacks 持有弱引用:wpAidlCamera3Device— 父设备关联关系(非拥有)AidlCameraService → CameraService:CameraService* mCameraService(原始指针,不拥有)— AidlCameraService 包装 CameraService 的 AIDL 接口Camera3OutputUtils / Camera3OutputUtilsTemplated:自由函数命名空间,通过参数引用 CaptureOutputStates 等结构体操作 StreamSet、InFlightMap 等所有权链总览CameraService ├── spCameraProviderManager ├── spCameraFlashlight ├── CameraClientManager (管理 spBasicClient) └── vectorspServiceListener Camera2ClientBaseT ├── spCameraDeviceBase (实际 Camera3Device) └── shared_ptrCameraServiceProxyWrapper Camera3Device ├── spHalInterface (Aidl/Hidl) ├── spRequestThread ├── spPreparerThread ├── spStatusTracker ├── spCamera3BufferManager ├── StreamSet (spCamera3Stream) └── wpNotificationListener (CameraDeviceClient) Camera3OutputStream ├── spSurface mConsumer ├── spCamera3BufferManager └── wpCamera3StreamBufferFreedListener AidlHalInterface ├── shared_ptrICameraDeviceSession └── shared_ptrAidlRequestMetadataQueue FrameProcessorBase └── wpFrameProducer (Camera3Device)设计模式模式应用策略模式HalInterface抽象类,AidlHalInter

相关新闻

【Linux系统篇】从 fork 到 WNOHANG:进程创建与等待机制详解

【Linux系统篇】从 fork 到 WNOHANG:进程创建与等待机制详解

🔥个人主页:爱和冰阔乐 📚专栏传送门:《数据结构与算法》 、C 🐶学习方向:C方向学习爱好者 ⭐人生格言:得知坦然 ,失之淡然 🏠博主简介 文章目录前言一、进程创建1.1 f…

2026/10/1 18:33:10 阅读更多 →
本科毕业设计全流程问题解析与应对策略

本科毕业设计全流程问题解析与应对策略

1. 本科毕业设计常见问题深度解析毕业季来临,又到了大四学子们为毕业设计焦头烂额的时候。作为指导过多届毕业设计的"老司机",我整理了一份超详细的毕业设计问答指南,希望能帮助大家少走弯路。这份问答不是那种泛泛而谈的"正确…

2026/10/1 20:26:38 阅读更多 →
OpenCvSharp读取、显示和写入图像

OpenCvSharp读取、显示和写入图像

⒈目的通过本案例,掌握在winform框架下基于OpenCvSharp读取、显示和写入图像的方法。⒉软件Visual Studio 2022⒊界面设计控件包括:button。⒋安装NuGet程序包⑴OpenCvSharp4⑵OpenCvSharp4.runtime.win⑶OpenCvSharp4.Extensions⒌imread()读取图像cv.i…

2026/9/26 14:08:59 阅读更多 →

最新新闻

Madeira 跨架构运行环境:FEX-Emu + Wine + DXMT 技术栈解析

Madeira 跨架构运行环境:FEX-Emu + Wine + DXMT 技术栈解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 20:25:43 阅读更多 →
ESP32-P4NRW32X:乐鑫首颗工业级RISC-V MCU深度解析

ESP32-P4NRW32X:乐鑫首颗工业级RISC-V MCU深度解析

1. 这不是一块普通开发板:ESP32-P4NRW32X到底是什么?你刷到“ESP32-P4NRW32X”这个型号时,第一反应可能是——这串字符像一串加密代码,不像ESP32-S3或ESP32-C3那样有明确的命名逻辑。它既不是乐鑫官方公开文档里高频出现的主力型号…

2026/10/1 20:25:43 阅读更多 →
OpenClaw进阶:优化设定与对话,把每个token花在刀刃上

OpenClaw进阶:优化设定与对话,把每个token花在刀刃上

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 20:25:43 阅读更多 →
从人工同步到自动闭环:跨 Java/.NET 代码转换工具的工程化实践与 TaoToken 统一接入

从人工同步到自动闭环:跨 Java/.NET 代码转换工具的工程化实践与 TaoToken 统一接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 20:25:43 阅读更多 →
2026年AI编程工具终极对决:Cursor vs Windsurf vs Claude Code,谁才是真正的代码之王?TaoToken统一Key实测

2026年AI编程工具终极对决:Cursor vs Windsurf vs Claude Code,谁才是真正的代码之王?TaoToken统一Key实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 20:25:43 阅读更多 →
Trivy 0.70.0 Windows x64 安装包下载:扫描工具 ZIP 与数据库准备

Trivy 0.70.0 Windows x64 安装包下载:扫描工具 ZIP 与数据库准备

Trivy 0.70.0 Windows x64 下载入口 入口会先显示草料跳转提示页,确认目标是夸克网盘后点击“继续访问”。本文整理的是 0.70.0 固定旧版本,适合需要该版本的用户,不代表当前最新版。 下载前核对文件 文件名:trivy_0.70.0_wind…

2026/10/1 20:24:42 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →