news 2026/5/30 17:21:16

android 常规log、dump、winscope常见抓取方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
android 常规log、dump、winscope常见抓取方法

ProtoLog开关

在代码中我们经常看见ProtoLog打印的log,如下:

ProtoLog.i(WM_DEBUG_ANIM,"Animation start delayed for %s",mAnimatable);

这种log正常情况不会显示,因此我们需要打开开关,其格式为:
adb shell wm logging enable-text [代码中对应的TAG]
我们这段代码的TAG是WM_DEBUG_ANIM,因此通过命令adb shell wm logging enable-text WM_DEBUG_ANIM打开log开关

另一种情况

ProtoLog.v(WM_SHELL_TASK_ORG,"Task info changed taskId=%d",taskInfo.taskId);

wmshell的log比较特殊,其在SystemUI进程,如果我们直接运行adb shell wm logging enable-text WM_SHELL_TASK_ORG会报错,打印如下:

Loaded749log definitions from /system/etc/protolog.conf.json.gz No IProtoLogGroup named WM_SHELL_TASK_ORG Not handled, please use`adb shell dumpsys activityserviceSystemUIService WMShell`ifyou are lookingforProtoLoginWMShell

根据提示我们打开log
adb shell dumpsys activity service SystemUIService WMShell protolog enable WM_SHELL_TASK_ORG

logcat抓取log

# 抓取普通的andorid logadb shell logcat>log.txt# 仅抓取events logadb shell logcat-bevents>log.txt# 抓取所有类型logadb shell logcat-ball>log.txt# 根据关键字抓取log,-i可以忽略大小,-e可以添加多条关键字,如下:adb shell logcat-bevents|grep-ie"关键log1"-ie"关键log2">log.txt

events.log中对应代码查找

events log对应代码的规律是:
events log开头的字段,比如wm_xxx
则对应的代码可以通过 grep 抓取 writeWmxxx 找出是在哪里打印的该events log

例如:
应用走到onresume生命周期的log
wm_on_resume_called: [223605563,com.tencent.mm.ui.LauncherUI,RESUME_ACTIVITY,10]

EventLogTags.writeWmOnResumeCalled(mIdent,getComponentName().getClassName(),reason);

通知cancel的log
notification_canceled: [0|com.tencent.mm|40|null|10218,8,19980,19980,7720,-1,-1,NULL]

EventLogTags.writeNotificationCanceled(canceledKey,reason,r.getLifespanMs(now),r.getFreshnessMs(now),r.getExposureMs(now),rank,count,listenerName);

使用winscope

手机要处于root状态才能使用

  • 使用手机自带的winscope
    在手机设置里面,找到开发者选项->快捷设置开发者图块->打开 “ Winscope跟踪 ”
    打开后复现问题,最后再关闭这个开关,就表示抓取完成
    导出文件adb pull /data/misc/wmtrace
    把导出文件在源码路径的android-13.0.0_r6/prebuilts/misc/common/winscope/winscope.html打开即可

  • 使用脚本抓取winscope(推荐)
    附链接:
    winscope-t
    winscope-u
    winscope-v
    winscope-t和winscope-u均可离线使用,但是V的版本却不行,需要进行以下操作
    1.需要用npm安装http-server
    npm install -g http-server
    2.安装完成后运行http-server,进入下面任意一个ip即可

    下载后,连接手机,直接运行脚本中的./run.sh,或者python3 winscope_proxy.py

    START TRACE: 可以持续dump window和SurfaceFlinger信息,一般适用于闪黑场景,复现之前按下,复现后停止即可。
    DMUP STATE: 相当于就是抓取一次dumpsys windowdumpsys SurfaceFlinger

  • android 15之后离线抓取winscope方法

    # SurfaceFlinger# 开启adb shell perfetto--out/data/misc/perfetto-traces/winscope-proxy-trace.perfetto-trace--txt--config/data/misc/perfetto-configs/winscope-proxy-trace.conf--detach=WINSCOPE-PROXY-TRACING-SESSION# 停止adb shell perfetto--attach=WINSCOPE-PROXY-TRACING-SESSION--stop# 导出adb pull /data/misc/perfetto-traces/winscope-proxy-trace.perfetto-trace# 有些设备可能没有winscope-proxy-trace.conf这类conf文件,可以尝试使用Android 15之前的方法adb shellsurootservicecall Surface Flinger1025i321adb shellsurootservicecall Surface Flinger1025i320adb pull /data/misc/wmtrace/layers_trace.pb# window(window的抓取方法在Android15没有变化)# 开启adb shell cmd window tracing start# 停止adb shell cmd window tracing stop# 导出adb pull /data/misc/wmtrace/wm_trace.winscope

    手机里的 /data/misc/perfetto-configs/中不一定都是以winscope-proxy-trace.conf命名,比如:

    /data/misc/perfetto-configs# lswinscope-proxy.surfaceflinger.conf

    运行指令也可能报错

    adb shell perfetto--out/data/misc/perfetto-traces/winscope-proxy-trace.perfetto-trace--txt--config/data/misc/perfetto-configs/winscope-proxy.surfaceflinger.conf--detach=WINSCOPE-PROXY-TRACING-SESSION[191.423]perfetto_cmd.cc:794 TraceConfig's write_into_file must betruewhen using--detach

    这里提示需要write_into_file为true设置这个时候就需要我们修改脚本
    在原始脚本的脚本的基础上修改即可

    vi/data/misc/perfetto-configs/winscope-proxy.surfaceflinger.conf data_sources:{config{name:"android.surfaceflinger.layers"surfaceflinger_layers_config:{mode: MODE_ACTIVE trace_flags: TRACE_FLAG_INPUT trace_flags: TRACE_FLAG_COMPOSITION trace_flags: TRACE_FLAG_HWC trace_flags: TRACE_FLAG_BUFFERS}}}# 添加代码解决write_into_file:true

常见dump命令

adb shell dumpsys SurfaceFlinger>./dump/SurfaceFlinger.txt adb shell dumpsys window-a>./dump/window.txt adb shell dumpsys activity activities>./dump/activities.txt adb shell dumpsys activitytop>./dump/top_activity.txt adb shell dumpsys activity containers>./dump/containers.txt adb shell dumpsys input>./dump/input.txt

查找dump命令的方法

代码路径:frameworks/base/core/java/android/content/Context.java
这个代码里面有很多serviceName

@StringDef(suffix={"_SERVICE"},value={POWER_SERVICE,//@hide: POWER_STATS_SERVICE,WINDOW_SERVICE,LAYOUT_INFLATER_SERVICE,ACCOUNT_SERVICE,ACTIVITY_SERVICE,ALARM_SERVICE,NOTIFICATION_SERVICE,ACCESSIBILITY_SERVICE,CAPTIONING_SERVICE,KEYGUARD_SERVICE,LOCATION_SERVICE,HEALTHCONNECT_SERVICE,//@hide: COUNTRY_DETECTOR,SEARCH_SERVICE,SENSOR_SERVICE,SENSOR_PRIVACY_SERVICE,STORAGE_SERVICE,STORAGE_STATS_SERVICE,WALLPAPER_SERVICE,VIBRATOR_MANAGER_SERVICE,VIBRATOR_SERVICE,//@hide: STATUS_BAR_SERVICE,CONNECTIVITY_SERVICE,PAC_PROXY_SERVICE,VCN_MANAGEMENT_SERVICE,//@hide: IP_MEMORY_STORE_SERVICE,IPSEC_SERVICE,VPN_MANAGEMENT_SERVICE,TEST_NETWORK_SERVICE,//@hide: UPDATE_LOCK_SERVICE,//@hide: NETWORKMANAGEMENT_SERVICE,NETWORK_STATS_SERVICE,//@hide: NETWORK_POLICY_SERVICE,WIFI_SERVICE,WIFI_AWARE_SERVICE,WIFI_P2P_SERVICE,WIFI_SCANNING_SERVICE,//@hide: LOWPAN_SERVICE,//@hide: WIFI_RTT_SERVICE,//@hide: ETHERNET_SERVICE,WIFI_RTT_RANGING_SERVICE,NSD_SERVICE,AUDIO_SERVICE,AUDIO_DEVICE_VOLUME_SERVICE,AUTH_SERVICE,FINGERPRINT_SERVICE,//@hide: FACE_SERVICE,BIOMETRIC_SERVICE,MEDIA_ROUTER_SERVICE,TELEPHONY_SERVICE,TELEPHONY_SUBSCRIPTION_SERVICE,CARRIER_CONFIG_SERVICE,EUICC_SERVICE,//@hide: MMS_SERVICE,TELECOM_SERVICE,CLIPBOARD_SERVICE,INPUT_METHOD_SERVICE,TEXT_SERVICES_MANAGER_SERVICE,TEXT_CLASSIFICATION_SERVICE,APPWIDGET_SERVICE,//@hide: VOICE_INTERACTION_MANAGER_SERVICE,//@hide: BACKUP_SERVICE,REBOOT_READINESS_SERVICE,ROLLBACK_SERVICE,DROPBOX_SERVICE,//@hide: DEVICE_IDLE_CONTROLLER,//@hide: POWER_WHITELIST_MANAGER,DEVICE_POLICY_SERVICE,UI_MODE_SERVICE,DOWNLOAD_SERVICE,NFC_SERVICE,BLUETOOTH_SERVICE,//@hide: SIP_SERVICE,USB_SERVICE,LAUNCHER_APPS_SERVICE,//@hide: SERIAL_SERVICE,//@hide: HDMI_CONTROL_SERVICE,INPUT_SERVICE,DISPLAY_SERVICE,//@hide COLOR_DISPLAY_SERVICE,USER_SERVICE,RESTRICTIONS_SERVICE,APP_OPS_SERVICE,ROLE_SERVICE,//@hide ROLE_CONTROLLER_SERVICE,CAMERA_SERVICE,//@hide: PLATFORM_COMPAT_SERVICE,//@hide: PLATFORM_COMPAT_NATIVE_SERVICE,PRINT_SERVICE,CONSUMER_IR_SERVICE,//@hide: TRUST_SERVICE,TV_INTERACTIVE_APP_SERVICE,TV_INPUT_SERVICE,//@hide: TV_TUNER_RESOURCE_MGR_SERVICE,//@hide: NETWORK_SCORE_SERVICE,USAGE_STATS_SERVICE,MEDIA_SESSION_SERVICE,MEDIA_COMMUNICATION_SERVICE,BATTERY_SERVICE,JOB_SCHEDULER_SERVICE,//@hide: PERSISTENT_DATA_BLOCK_SERVICE,//@hide: OEM_LOCK_SERVICE,MEDIA_PROJECTION_SERVICE,MIDI_SERVICE,RADIO_SERVICE,HARDWARE_PROPERTIES_SERVICE,//@hide: SOUND_TRIGGER_SERVICE,SHORTCUT_SERVICE,//@hide: CONTEXTHUB_SERVICE,SYSTEM_HEALTH_SERVICE,//@hide: INCIDENT_SERVICE,//@hide: INCIDENT_COMPANION_SERVICE,//@hide: STATS_COMPANION_SERVICE,COMPANION_DEVICE_SERVICE,VIRTUAL_DEVICE_SERVICE,CROSS_PROFILE_APPS_SERVICE,//@hide: SYSTEM_UPDATE_SERVICE,//@hide: TIME_DETECTOR_SERVICE,//@hide: TIME_ZONE_DETECTOR_SERVICE,PERMISSION_SERVICE,LIGHTS_SERVICE,LOCALE_SERVICE,//@hide: PEOPLE_SERVICE,//@hide: DEVICE_STATE_SERVICE,//@hide: SPEECH_RECOGNITION_SERVICE,UWB_SERVICE,MEDIA_METRICS_SERVICE,//@hide: ATTESTATION_VERIFICATION_SERVICE,//@hide: SAFETY_CENTER_SERVICE,DISPLAY_HASH_SERVICE,CREDENTIAL_SERVICE,DEVICE_LOCK_SERVICE,VIRTUALIZATION_SERVICE,GRAMMATICAL_INFLECTION_SERVICE,})

我们只需要根据这些常量找到对应的名称即可,比如输入法:

/** * Use with {@link #getSystemService(String)} to retrieve a * {@link android.view.inputmethod.InputMethodManager} for accessing input * methods. * * @see #getSystemService(String) */publicstaticfinalStringINPUT_METHOD_SERVICE="input_method";

我们可以看到,其实就是通过getSystemService方法中调用的字符常量,我们要dump输入法服务相关的命令就是adb shell dumpsys input_method

如果我们想知道这个dump的方法具体在哪,会有哪些打印,则只需通过对应Mananger找到对应的ManagerService即可。
比如,我们这里以输入法为例,那么其对应的就是InputMethodManagerService,在这个里面就有对应的dump方法:
代码路径:frameworks/base/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java

voiddump(@NonNullPrintWriterpw,@NonNullStringprefix){finalSimpleDateFormatdataFormat=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS",Locale.US);for(inti=0;i<mEntries.length;++i){finalEntryentry=mEntries[(i+mNextIndex)%mEntries.length];if(entry==null){continue;}pw.print(prefix);pw.println("SoftInputShowHideHistory #"+entry.mSequenceNumber+":");pw.print(prefix);pw.println(" time="+dataFormat.format(newDate(entry.mWallTime))+" (timestamp="+entry.mTimestamp+")");pw.print(prefix);pw.print(" reason="+InputMethodDebug.softInputDisplayReasonToString(entry.mReason));pw.println(" inFullscreenMode="+entry.mInFullscreenMode);pw.print(prefix);pw.println(" requestClient="+entry.mClientState);pw.print(prefix);pw.println(" focusedWindowName="+entry.mFocusedWindowName);pw.print(prefix);pw.println(" requestWindowName="+entry.mRequestWindowName);pw.print(prefix);pw.println(" imeControlTargetName="+entry.mImeControlTargetName);pw.print(prefix);pw.println(" imeTargetNameFromWm="+entry.mImeTargetNameFromWm);pw.print(prefix);pw.print(" editorInfo: ");pw.print(" inputType="+entry.mEditorInfo.inputType);pw.print(" privateImeOptions="+entry.mEditorInfo.privateImeOptions);pw.println(" fieldId (viewId)="+entry.mEditorInfo.fieldId);pw.print(prefix);pw.println(" focusedWindowSoftInputMode="+InputMethodDebug.softInputModeToString(entry.mFocusedWindowSoftInputMode));}}}

有些命令是带参数的,比如:adb shell dumpsys activity top
可以加上-h来查看所有的命令,如:adb shell dumpsys activity -h
打印结果如下:

Activitymanager dump options:[-a][-c][-pPACKAGE][-h][WHAT]...WHATmay be one of:a[ctivities]:activity stack state r[recents]:recent activities state b[roadcasts][PACKAGE_NAME][history[-s]]:broadcast state broadcast-stats[PACKAGE_NAME]:aggregated broadcast statistics i[ntents][PACKAGE_NAME]:pending intent state p[rocesses][PACKAGE_NAME]:process state o[om]:out of memory management perm[issions]:URIpermission grant state prov[iders][COMP_SPEC...]:content provider state provider[COMP_SPEC]:provider client-side state s[ervices][COMP_SPEC...]:service state allowed-associations:currentpackageassociationrestrictions as[sociations]:tracked app associations exit-info[PACKAGE_NAME]:historical process exit information lmk:stats on low memory killer lru:rawLRUprocess list binder-proxies:stats on binder objects andIPCssettings:currently applied config settings service[COMP_SPEC]:service client-side statepackage[PACKAGE_NAME]:all state relatedtogivenpackageall:dump all activities top:dump the top activity users:user stateWHATmay also be aCOMP_SPECtodumpactivities.COMP_SPECmay be a component name(com.foo/.myApp),a partial substring in a component name,a hex object identifier.-a:include all available server state.-c:include client state.-p:limit outputtogivenpackage.-d:limit outputtogivendisplay.--checkin:output checkin format,resetting data.--C:output checkin format,not resetting data.--proto:output dump in protocol buffer format.--dump-dumpable:dump just theDUMPABLE-related state of anactivity.Usethe--list-dumpables optiontolistthe supportedDUMPABLEs--list-dumpables:show the available dumpables in an activity
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 17:20:56

宝兰德BES中间件分离部署实战:用两个Linux账号搞定产品与应用隔离(附755权限避坑点)

宝兰德BES中间件分离部署实战&#xff1a;双账号隔离架构与精细化权限管理 在金融、电信等对安全性要求极高的行业场景中&#xff0c;中间件的部署架构直接关系到系统的稳定性和可维护性。传统的一体化部署方式往往将产品文件和应用运行环境混杂在同一账号下&#xff0c;这种架…

作者头像 李华
网站建设 2026/5/29 11:34:21

文档下载神器:kill-doc如何帮你轻松获取30+平台的免费文档资源

文档下载神器&#xff1a;kill-doc如何帮你轻松获取30平台的免费文档资源 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档&#xff0c;但是相关网站浏览体验不好各种广告&#xff0c;各种登录验证&#xff0c;需要很多步骤才能下载文档&#xff0c;该脚本就…

作者头像 李华
网站建设 2026/5/29 11:34:01

带标注的面部表情识别数据集,可识别生气,恐惧,中立,伤心四种情绪,识别率81.4%,9857张图,支持yolo,coco json,voc xml,文末有模型训练代码

​ 带标注的面部表情识别数据集&#xff0c;可识别生气&#xff0c;恐惧&#xff0c;中立&#xff0c;伤心四种情绪&#xff0c;识别率81.4%&#xff0c;9857张图&#xff0c;支持yolo&#xff0c;coco json&#xff0c;voc xml,文末有模型训练代码 模型训练指标参数&#xff…

作者头像 李华
网站建设 2026/5/29 11:33:15

全面盘点渗透测试 Kali Linux 常用工具,新手学习黑客技术入门必备教程,玩转 Kali 渗透看这一篇就够了

kali Linux工具帮你评估 Web 服务器的安全性&#xff0c;并帮助你执行黑客渗透测试。 注意&#xff1a;这里不是所提及的所有工具都是开源的。 1. Nmap Nmap&#xff08;网络映射器&#xff09;是一款用于网络发现和安全审计的网络安全工具. 核心功能: 主机发现,端口扫描,版…

作者头像 李华
网站建设 2026/5/29 11:33:11

一键检测微信单向好友:3步发现谁悄悄删除了你

一键检测微信单向好友&#xff1a;3步发现谁悄悄删除了你 【免费下载链接】WechatRealFriends 微信好友关系一键检测&#xff0c;基于微信ipad协议&#xff0c;看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFriends 微信好…

作者头像 李华