18、Camera调试工具链:dumpsys、CameraTrace、Systrace、Perfetto实战
调试Camera系统,说白了就是跟时间赛跑。你想想看,一帧图像从Sensor出来,经过ISP、HAL、Framework,最后到应用显示,中间任何一个环节卡顿,用户就会骂“这破相机卡死了”。
我个人习惯,遇到Camera性能问题,先不急着翻代码。先拿工具“望闻问切”一把。今天我就把这四个最趁手的兵器——dumpsys、CameraTrace、Systrace、Perfetto,挨个给你讲透。
核心观点:调试工具不是越多越好,而是要知道什么场景用什么工具。dumpsys看状态,CameraTrace看流程,Systrace看线程,Perfetto看全局。
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