18、Camera调试工具链:dumpsys、CameraTrace、Systrace、Perfetto实战

调试Camera系统,说白了就是跟时间赛跑。你想想看,一帧图像从Sensor出来,经过ISP、HAL、Framework,最后到应用显示,中间任何一个环节卡顿,用户就会骂“这破相机卡死了”。

我个人习惯,遇到Camera性能问题,先不急着翻代码。先拿工具“望闻问切”一把。今天我就把这四个最趁手的兵器——dumpsys、CameraTrace、Systrace、Perfetto,挨个给你讲透。

核心观点:调试工具不是越多越好,而是要知道什么场景用什么工具。dumpsys看状态,CameraTrace看流程,Systrace看线程,Perfetto看全局。

Camera 调试工具链全景 Camera 问题 dumpsys 状态快照 CameraTrace HAL流程追踪 Systrace 线程级分析 Perfetto 全链路追踪 适用:参数配置、 状态检查 适用:HAL层 调用流程 适用:线程调度 卡顿分析 适用:全系统 性能瓶颈

18.1 dumpsys:Camera系统的“体检报告”

dumpsys是Android系统自带的诊断工具。你直接在adb shell里敲一行命令,就能看到CameraService内部几乎所有的状态信息。

我在项目中遇到过,某款车型的环视摄像头启动特别慢。第一反应就是先dumpsys一把,看看CameraService到底在等什么。

adb shell dumpsys media.camera

这条命令会输出什么?我挑几个重点字段给你看:

字段 含义 调试价值
Number of cameras 系统检测到的摄像头数量 确认硬件是否被正确枚举
Camera ID 每个摄像头的唯一标识 多路输入时确认ID映射关系
Session状态 当前打开的CameraSession 排查资源泄漏、重复打开
Stream配置 当前配置的流格式、分辨率 确认HDR/非HDR流是否正确
Pending requests 排队中的请求数 判断HAL处理是否过载

小技巧:如果你只想看某个特定Camera的信息,可以加参数:adb shell dumpsys media.camera -i 0(0是Camera ID)。这样输出会精简很多。

嗯,这里要注意。dumpsys拿到的只是某个时间点的快照。如果你怀疑问题跟时间有关,比如“启动后第3秒才出图”,那dumpsys就帮不上忙了。这时候得请出下一把兵器。

18.2 CameraTrace:HAL层的“X光机”

CameraTrace是Android 10之后引入的专用追踪工具。它专门用来抓Camera HAL层的函数调用时序。

说白了,它就是给Camera HAL打了一堆埋点。你只要打开开关,所有关键函数的进入、退出、耗时都会被记录下来。

# 开启CameraTrace
adb shell setprop persist.vendor.camera.trace.enable 1
# 重启CameraService生效
adb shell stop media.camera
adb shell start media.camera

# 复现问题后,抓取trace
adb shell dumpsys media.camera -t
# trace文件会生成在 /data/vendor/camera/trace/ 目录下

我曾经调试过一个HDR合成超时的问题。用CameraTrace一看,发现ISP的HDR融合函数跑了80ms,而预期是30ms。顺着这个线索往下查,发现是某个参数配置导致ISP内部做了两次重采样。

警告:CameraTrace开启后会引入额外的性能开销(大约5%-10%)。不要在用户车上长期开启,只在你复现问题时临时打开。抓完trace立刻关掉。

18.3 Systrace:线程级别的“显微镜”

Systrace是Android系统级性能分析工具。它能看到每个线程在做什么,什么时候在跑,什么时候在等。

我个人的经验是,Camera相关的性能问题,十有八九跟线程调度有关。比如:

  • HAL的请求处理线程被优先级更低的线程抢占
  • BufferQueue的消费者线程被阻塞在Binder调用上
  • HDR合成线程等待GPU资源
# 抓取Camera相关的Systrace
python systrace.py -t 10 -o camera_trace.html \
  camera hal input video view

抓出来的HTML文件,用Chrome打开。你会看到一条条彩色的线程时间轴。重点关注:

  • 黄色块:表示线程在运行
  • 蓝色块:表示线程在可运行但没拿到CPU
  • 灰色块:表示线程在睡眠/等待

如果某个Camera线程长时间显示蓝色,说明CPU资源不够,或者优先级被压了。我曾经在某个项目上,就是通过Systrace发现Camera的线程被一个后台OTA升级进程抢了CPU,导致预览掉帧。

18.4 Perfetto:全链路“CT扫描”

Perfetto是Systrace的升级版。它不仅能看CPU、线程,还能看内存、GPU、I/O、电源等所有子系统。

为什么我推荐Perfetto?因为它能帮你把问题定位到“最后一公里”。比如:

  • Camera预览卡顿,到底是CPU瓶颈还是GPU瓶颈?
  • HDR合成慢,是算法本身慢,还是内存带宽不够?
  • 多路输入时,哪一路占用了最多的系统资源?
# 使用Perfetto抓取Camera trace
adb shell perfetto \
  -c /data/misc/perfetto-config/camera.cfg \
  -o /data/misc/perfetto-traces/camera_trace.perfetto-trace

# 配置文件示例 (camera.cfg)
buffers: {
  size_kb: 65536
  fill_policy: RING_BUFFER
}
data_sources: {
  config {
    name: "linux.ftrace"
    ftrace_config {
      ftrace_events: "camera/*"
      ftrace_events: "sched/sched_switch"
      ftrace_events: "power/cpu_frequency"
    }
  }
}
duration_ms: 10000

抓完的trace文件,拖到 ui.perfetto.dev 上打开。你会看到一个比Systrace精细得多的界面。

实战经验:我调试过一个HDR多帧合成的场景。用Perfetto一看,发现CPU在合成阶段负载只有40%,但GPU负载飙到了95%。这说明算法是GPU密集型的,瓶颈在GPU而不是CPU。后来我们优化了shader,把合成时间从45ms降到了22ms。

18.5 四把兵器的选择策略

你可能会问:这么多工具,我到底该用哪个?我总结了一个简单的选择逻辑:

问题现象 首选工具 备选工具
Camera打不开/闪退 dumpsys logcat
预览卡顿/掉帧 Systrace Perfetto
HDR合成慢 CameraTrace Perfetto
多路输入资源冲突 Perfetto Systrace + dumpsys
功耗异常 Perfetto dumpsys batterystats

我的习惯:遇到新问题,先dumpsys看状态,再CameraTrace看HAL流程,如果还定位不了,上Systrace看线程调度。最后,如果问题涉及多个子系统交互,直接上Perfetto。这个顺序能帮你最快缩小排查范围。

好了,这四种工具你都了解了。下次遇到Camera问题,别急着改代码。先拿工具“照一照”,往往能事半功倍。


公众号:蓝海资料掘金营,微信deep3321