Android CameraService提供的强大Tag Monitor机制,太好用了!

Android CameraService提供的强大Tag Monitor机制,太好用了!

在Camera Debug过程中,我们经常会遇到如下问题:

  1. Camera App在某一帧设置的参数值是什么?
  2. Camera HAL在某一帧返回的参数值是什么?

本文会从Camera Native Framework的角度,使用watch命令带大家轻松解决上面的问题

watch 命令

启动Tag Monitor

打开Camera前或后执行如下命令,开始monitor 某个/某些Tags

adb shell cmd media.camera watch start -m <tags> [-c <clients>]

其中,

  • -m 指定要monitor的Tags,tag之间通过逗号分隔
  • -c 可选,指定要monitor那个/哪些Client(也就是Camera App)的Tag,Client之间用都好分隔,如果不指定或指定为all,则monitor所有已经打开的clients

举例:

adb shell cmd media.camera watch start \
-m android.control.effectMode,android.control.aeMode \
-c com.google.android.GoogleCamera,com.android.chrome

注:

  • Tag也可以带预定义的名称,默认有一个名称: 3a,会monitor如下Tags(大家可以根据需求修改源码添加更多的预定义名称)

Dump Tag Monitor结果

执行如下命令可以dump monitor的结果,close的Camera的tag monitor也能dump到

adb shell cmd media.camera watch dump

举例,我们Monitor FD模式的Tag:

adb shell cmd media.camera watch start -m android.statistics.faceDetectMode

操作Camera后,执行watch dump,会输出如下信息

其中,

  • Cached @ 06-13 09:21:06 表示Cache的时间点
  • 0:com.android.messaging ,0表示CameraID为0, com.android.messaging 是打开Camera 0的Camera App
  • f0:67654301839288ns,f0表示framenumber 0,67654301839288是存储这个event的时间点
  • output stream ids,表示这个Metadata带有哪些Stream ID的buffer
  • REQ表示CaptureRequest
  • RES表示CaptureResult

实时Dump Tag Monitor结果

有时候我们需要实时知道Tag 值的变化,Google也想到了,watch支持在线实时dump tag,执行:

adb  shell cmd media.camera watch live [-n refresh_interval_ms]

其中,refresh_interval_ms是刷新间隔,如果不设置默认值是1000ms(Tag值有变化输出才会更新),敲回车后会退出实时dump

清除Tag Monito缓存的Dump

如果Dump的内容太多不便于查看,也可以执行如下命令清楚掉缓存的Dump

adb shell cmd  media.camera watch clear

停止Tag Monitor的Dump

Monitor后,记得要停止watch

adb shell cmd media.camera watch stop

dumpsys方式使用Tag Monitor

如果你觉得使用watch命令要敲太多命令,可以使用dumpsys来使用Tag Monitor

adb shell dumpsys media.camera -m 3a | grep -A50 Monitored

其中,

  • -m 表示monitor哪个/哪些Tag
  • 结果会呈现在dumpsys media.camera的Monitored后面

借助linux的watch命令,dumpsys 也可以实时打印Dump结果,比如:

watch -n  1 -c 'adb shell dumpsys media.camera -m 3a | grep -A50 Monitored'  

其中,

  • -n 1: 这个选项告诉watch每1秒(1秒的时间间隔)执行一次命令。如果没有这个选项,默认时间间隔是2秒。
  • -c: 这个选项表示在每次执行命令前清除屏幕,使得每次watch执行命令时,你都能看到最新的输出,而不是累积的输出。