4. 输出结构总览

当执行 adb shell dumpsys camera 后,输出的信息量巨大,通常包含数千行日志。为了高效定位问题,必须理解其顶层模块划分。整个输出按照 Android Camera 架构的层次关系,依次呈现从全局状态到具体硬件抽象层的详细信息。

下图展示了 dumpsys camera 输出的核心模块及其在 Camera 架构中的位置关系:

dumpsys camera 输出模块架构总览 dumpsys camera 输出模块架构总览 Global Info(全局信息) 进程状态、内存使用、Binder 线程池、服务启动时间 CameraService(相机服务) 客户端连接、权限检查、闪光灯状态、API 版本、监听器列表 CameraDevice 实例、Stream 配置、Capture Session 状态 Flashlight(闪光灯) 闪光灯强度、可用状态、Torch 模式 CameraProvider(相机提供者) HAL 版本、Camera ID 列表、设备能力、物理相机 HAL 层实现(Camera HAL) 设备回调、Stream 管道、Buffer 管理、Metadata 更新 调试要点 从上到下逐层排查:先看 Global Info 确认服务存活,再看 CameraService 确认客户端状态,最后深入 Provider 和 HAL 层定位硬件问题。

4.1 模块划分总览

根据输出顺序和逻辑层级,dumpsys camera 主要包含以下五大模块:

模块名称 输出标识 核心内容 调试价值
Global Info 文件头部 进程 PID、Uid、Binder 对象、内存信息 判断服务是否存活、是否存在内存泄漏
CameraService CameraService:: 客户端列表、权限、闪光灯、API1/API2 状态 确认上层调用是否正确、权限是否授予
Flashlight Flashlight: Torch 模式、亮度等级、可用性 排查闪光灯无法打开或亮度异常
CameraProvider CameraProvider@ HAL 版本、Camera ID、能力列表、物理相机 确认 HAL 是否加载、设备能力是否匹配
HAL 实现 CameraDevice@ Stream 配置、Session 参数、Metadata、Buffer 状态 定位底层硬件配置错误、Stream 超时
调试技巧: 在输出中搜索 CameraService:: 或 CameraProvider@ 可以快速跳转到对应模块。如果输出异常短小,通常意味着 CameraService 进程刚重启或 HAL 服务未就绪。

4.2 Global Info(全局信息)

输出最顶部的全局信息段,用于确认 CameraService 进程的运行环境。典型输出如下:

Current CameraService state:
  CameraService PID: 1234
  Uid: 1000
  Binder: 0x7a8b9c0d
  Memory: 45.2 MB (native), 12.8 MB (heap)
  Service started: 2025-03-15 09:12:34
  Number of active clients: 2
  Number of pending requests: 0

关键字段解读:

  • PID / Uid:确认 CameraService 运行在系统进程(通常 Uid=1000)中,如果 PID 频繁变化,说明服务存在崩溃重启。
  • Memory:native 内存和 heap 内存。如果 native 内存持续增长且不释放,可能存在 Buffer 泄漏。
  • Number of active clients:当前连接的客户端数量。异常高值可能表示客户端未正确释放。

4.3 CameraService(相机服务)

这是 dumpsys camera 输出中信息量最大的部分,包含所有与上层框架交互的状态。典型结构如下:

CameraService 模块内部结构 CameraService 模块内部结构 CameraService Client List 客户端连接 & 权限 Flashlight Torch 状态 & 强度 CameraDevice 设备实例 & Session Listeners 回调 & 事件监听 CameraService 调试关注点 1. Client List 中是否有异常客户端(如未释放的 Camera) 2. CameraDevice 的 Stream 配置是否与预期一致

CameraService 段中常见的调试线索:

  • Client List:列出所有已连接的客户端包名和 Uid。如果某个应用反复连接/断开,可能造成服务端资源泄漏。
  • CameraDevice:每个打开的相机设备会显示其 mId、mClient、mStreams 和 mSession 状态。Stream 数量异常或 Session 状态为 ERROR 是常见问题。
  • Listeners:注册的回调监听器列表,用于通知应用相机状态变化(如闪光灯、对焦状态)。

4.4 Flashlight(闪光灯)

闪光灯模块独立于 CameraDevice 管理,即使相机未打开,也可以通过 Torch 模式控制闪光灯。典型输出:

Flashlight:
  Torch mode: ON
  Brightness: 255
  Available: true
  Flashlight status: 0 (OK)

调试要点:

  • Torch mode:ON 或 OFF。如果应用无法打开闪光灯,先检查此状态。
  • Brightness:亮度值范围通常为 0-255。异常值可能导致闪光灯过暗或过亮。
  • Available:如果为 false,说明闪光灯硬件不可用,可能是 HAL 层未正确初始化或硬件故障。
常见陷阱: 某些设备在相机预览期间,Flashlight 模块会显示 Torch mode: UNAVAILABLE,这是因为相机 HAL 在预览时独占闪光灯资源。此时应检查 CameraDevice 的闪光灯模式设置,而非 Flashlight 模块。

4.5 CameraProvider(相机提供者)

CameraProvider 是连接 CameraService 与底层 HAL 的桥梁。在 Treble 架构下,它运行在独立的 HAL 进程中。输出示例:

CameraProvider@2.4:
  HAL version: 3.4
  Number of cameras: 3
  Camera ID 0: BACK, facing: back, orientation: 90
  Camera ID 1: FRONT, facing: front, orientation: 270
  Camera ID 2: EXTERNAL, facing: external, orientation: 0
  Physical cameras for ID 0: [0, 3]

关键信息:

  • HAL version:确认 HAL 版本是否与框架匹配(如 HAL3 对应 API2)。
  • Camera ID 列表:列出所有可用相机及其朝向、旋转角度。如果缺少某个 ID,说明 HAL 未正确枚举设备。
  • Physical cameras:多摄设备中,逻辑相机包含的物理相机 ID。用于排查多摄协同问题。

4.6 HAL 层实现(CameraDevice)

每个 CameraProvider 下的 CameraDevice 会输出详细的 HAL 状态,这是调试底层问题的核心区域。典型结构:

HAL 层 CameraDevice 输出结构 HAL 层 CameraDevice 输出结构 CameraDevice@1.0 Stream Configuration 分辨率、格式、Usage Capture Session Session 状态、Request ID Metadata AE/AWB/AF 参数、3A 状态 Buffer Management Buffer 队列、丢帧计数 HAL 层调试核心指标 1. Stream 配置是否与 Surface 要求匹配(分辨率、Format) 2. Buffer 丢帧计数是否持续增长(可能表示 HAL 处理超时)

HAL 层输出中,Stream Configuration 和 Buffer Management 是最常出问题的区域。例如:

Stream 0: width=1920, height=1080, format=0x21 (YUV_420_888), usage=0x900
Stream 1: width=640, height=480, format=0x22 (IMPLEMENTATION_DEFINED), usage=0xb00
Frames dropped: 12 (total), 3 (since last request)

如果 Frames dropped 持续增加,通常意味着 HAL 无法及时填充 Buffer,可能原因包括 ISP 过载、带宽不足或 Sensor 配置错误。

总结: 掌握 dumpsys camera 的模块划分是高效调试的第一步。从 Global Info 确认服务健康,到 CameraService 检查上层状态,再到 CameraProvider 和 HAL 层定位硬件问题,形成了一条清晰的排查链路。后续章节将深入每个模块的详细字段解读。