本文总结在CamX上性能分析的一些调试技巧。
加入知识星球与更多Camera同学交流
- 星球名称:深入浅出Android Camera
- 星球ID: 17296815
- 微信订阅号: 极客笔记圈
CamX如何打开systrace log
打开systrace,首先修改 camxoverridesettings.txt
执行如下命令
adb root
adb remount
adb shell "echo traceGroupsEnable=0xFFFFFFFF >> /vendor/etc/camera/camxoverridesettings.txt"
接着执行如下命令打开Ftrace:
adb shell "echo 1 > d/tracing/events/camera/enable"
adb shell "echo 1 > /sys/kernel/debug/tracing/options/record-tgid"
最后执行 kill -9 pid
杀掉provider进程让其重启生效上面的设置。
命令设置完后,再通过 systrace.py
抓取包含拍照的systrace,执行如下命令:
python systrace.py gfx input view wm am bionic power sched camera freq idle video -b 20480 -t 4 -o capture.html
-b
表示systrace的buffer大小-t
表示systrace抓几秒-o
表示systrace输出的文件名
需要使用python 2.7版本, 如果需要抓取更长的systrace,需要加大buffer。
通过Systrace分析拍照性能
抓到systrace后,我们可以从App、Cameraserver、HAL三者的角度来看拍照时长。
App角度看拍照性能
通常App拍照会通过ImageReader去接收拍照的结果,因此我们可以以ImageReader接收到Buffer作为结束点。开始点即是用户点击Shutter Button时。
- 开始点:deliverInputEvent。
- 结束点:ImageReader的上升沿。
CameraServer角度看拍照性能
在Camera3Device的 prepareHalRequests()
方法里面打印了拍照的开始systrace。在的 removeInFlightRequestIfReadyLocked
方法里面打印了拍照结束的systrace。
-
开始点:prepareHalRequests
-
结束点:removeInFlightRequestIfReadyLocked
在systrace中,首先找到cameraserver进程,然后再找still capture。
HAL角度看拍照性能
通过 RequestTrace
可以看到HAL处理该Request的耗时。
如果我们想更进一步了解该Request在每个Node处理的耗时,可以systrace源文件中搜索 ProcessRequest 177