1.简介
ProtoLog是从Android R开始引入的日志框架,使用此框架,我们可以对指定类别的日志进行动态的开启或暂停。目前,主要是wm相关的动态日志。
2.如何开启ProtoLog
~$ adb shell wm logging --help
Unknown command
Window manager logging options:
start: Start proto logging //开启proto logging
stop: Stop proto logging//暂停proto logging
enable [group...]: Enable proto logging for given groups//为给定groups启用proto日志记录
disable [group...]: Disable proto logging for given groups///为给定groups禁用proto日志记录
enable-text [group...]: Enable logcat logging for given groups//为给定groups启用 logcat 日志记录
disable-text [group...]: Disable logcat logging for given groups//为给定groups禁用 logcat 日志记录
通过adb shell wm logging --help可以看出,有三种方式启用/禁用proto log,下面分别对这三种方式进行举例说明:
2.1、start/stop
adb shell wm logging start可以收集所有的proto日志:
:~$ adb shell wm logging start//开始收集proto日志
Start logging to /data/misc/wmtrace/wm_log.pb.
:~$ adb shell wm logging stop//停止收集proto日志
Stop logging to /data/misc/wmtrace/wm_log.pb. Waiting for log to flush.
Log written to /data/misc/wmtrace/wm_log.pb.
可以看到当使用命令开始收集日志,操作设备后,停止收集,会在/data/misc/wmtrace/目录下生成一个wm_log.pb文件,
可以通过file:///home/mi/winscope.html来查看wm_log.pb文件:
将wm_log.pb文件上传到网址然后点击“submit”就可以查看log了
2.2、enable/disable group
为给定group启用proto log收集。首先来看如何确认group
可以通过两种方式来确认group:
第一种:源码方式
可以通过ProtoLogGroup.java里定义的group确认
frameworks/base/services/core/java/com/android/server/wm/ProtoLogGroup.java
public enum ProtoLogGroup implements IProtoLogGroup {
WM_ERROR(true, true, true, Consts.TAG_WM),
WM_DEBUG_ORIENTATION(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
Consts.TAG_WM),
WM_DEBUG_FOCUS_LIGHT(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
Consts.TAG_WM),
WM_DEBUG_BOOT(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
Consts.TAG_WM),
WM_DEBUG_RESIZE(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
Consts.TAG_WM),
......
对应的WM_ERROR、WM_DEBUG_ORIENTATION就是group
第二种:通过json文件确认
在设备中的/system/etc/目录下有个protolog.conf.json.gz文件,解压后得到
protolog.conf.json文件
{
"version": "1.0.0",
"messages": {
"-2146181682": {
"message": "Releasing screen wakelock, obscured by %s",
"level": "DEBUG",
"group": "WM_DEBUG_KEEP_SCREEN_ON",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
"-2127842445": {
"message": "Clearing startingData for token=%s",
"level": "VERBOSE",
"group": "WM_DEBUG_STARTING_WINDOW",
"at": "com\/android\/server\/wm\/ActivityRecord.java"
},
"-2109936758": {
"message": "removeAppToken make exiting: %s",
"level": "VERBOSE",
"group": "WM_DEBUG_ADD_REMOVE",
"at": "com\/android\/server\/wm\/ActivityRecord.java"
},
......
可以得到对应的group组值。
继续看enable/disable命令
~$ adb shell wm logging enable WM_DEBUG_ADD_REMOVE
:~$ adb shell wm logging start
Start logging to /data/misc/wmtrace/wm_log.pb.
:~$ adb shell wm logging stop
Stop logging to /data/misc/wmtrace/wm_log.pb. Waiting for log to flush.
Log written to /data/misc/wmtrace/wm_log.pb.
:~$ adb pull /data/misc/wmtrace/wm_log.pb
776 KB/s (75531 bytes in 0.094s)
使用enable命令启用proto log时,还需要通过start命令将log输出到wm_log.pd文件中。
2.3、enable/diable-text
使用此命令可以把proto log通过logcat输出,启用proto log
~$ adb shell wm logging enable-text WM_DEBUG_ADD_REMOVE
操作设备时,可以通过adb logcat 查看日志,具体的日志tag及关键字信息可以通过protolog.conf.json.gz文件查看,下面是一个启用WM_DEBUG_ADD_REMOVE组之后打印的日志实例:
//日志级别 日志tag 日志message
V WindowManager: No longer Stopped: ActivityRecord{xxxxxx}
V WindowManager: notifyAppResumed: wasStopped=true ActivityRecord{xxxxxx}
V WindowManager: No longer Stopped: ActivityRecord{xxxxxx}
D WindowManager: finishDrawingWindow: Window{xxxxxx} mDrawState=DRAW_PENDING
V WindowManager: removeIfPossible: Window{xxxxxx} callers=xxxxxx>
V WindowManager: postWindowRemoveCleanupLocked: Window{xxxxxx}
V WindowManager: removeAppToken: ActivityRecord{xxxxxx}} delayed=false Callers=xxxxxx
最后,通过disable-text命令禁用日志
:~$ adb shell wm logging disable-text WM_DEBUG_ADD_REMOVE