Android 常见dumpsys方法与黑屏问题分析处理总结

Android 常见dumpsys方法与黑屏问题分析处理总结黑屏问题是显示相关的综合性问题 涉及 Android 应用层 框架层和底层 SurfaceFling 屏显等多个领域

大家好,欢迎来到IT知识分享网。

黑屏问题介绍

常见分析手段

从显示系统入手,软件架构从上到下分层,黑屏问题主要分为应用领域、窗口领域、SF&屏显&底软领域黑屏;分析黑屏问题,首先确认黑屏的是哪个界面(layer),然后才确认造成该界面黑的原因;而分析手段主要是通过dump数据、Activity生命周期、systrace、截图的raw数据、窗口绘制状态、视频操作等。

SurfaceFlinger

adb shell dumpsys SurfaceFlinger > SurfaceFlinger.txt
确认当前的dump SurfaceFlinger 数据对应黑屏现象的时间点
首先,确认HWC layers合成显示的图层是否为对应黑屏时应该显示的应用图层;接着,核查是否存在焦点图层【focused】(有星号的表示有焦点图层),该图层是否对应所需的显示图层;然后,核对位置【Disp Frame (LTRB)】、大小【Source Crop (LTRB)】、旋转角度【 Frame Rate 】是否正常。
在这里插入图片描述
相关代码位置:/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp 中的dump相关方法,如:dumpHwcLayersMinidumpLocked、dumpAllLocked等。
如果启动某个应用黑屏,而当前SurfaceFlinger.txt的layer不存在该应用的layer,那需要进一步确认显示buffer的数据是否正常。




从上面的SurfaceFlinger.txt dump 数据可以看出,BufferStateLayer表示当前绘图窗口,ContainerLayer是其父容器,不会有绘图buffer,父子是从上到下层次树形成;BufferStateLayer的绘图buffer是activeBuffer,该处可以看出已经完成绘图,而未完成绘图状态:activeBuffer=[ 0x 0: 0,Unknown/None]

+ BufferStateLayer (com.example.mysystemdialog/com.example.mysystemdialog.MainActivity#117) uid=10117 Region TransparentRegion (this=0 count=0) Region VisibleRegion (this=0 count=1) [ 0, 0, 1440, 2960] Region SurfaceDamageRegion (this=0 count=0) layerStack= 0, z= 0, pos=(0,0), size=(1440,2960), crop=[ 0, 0, 0, 0], cornerRadius=0.000000, isProtected=0, isTrustedOverlay=0, isOpaque=0, invalidate=0, dataspace=Default, defaultPixelFormat=RGBA_8888, backgroundBlurRadius=0, color=(0.000,0.000,0.000,1.000), flags=0x00000100, tr=[0.00, 0.00][0.00, 0.00] parent=9f63fd7 com.example.mysystemdialog/com.example.mysystemdialog.MainActivity#116 zOrderRelativeOf=none activeBuffer=[0x0:0,Unknown/None], tr=[0.00, 0.00][0.00, 0.00] queued-frames=0 metadata={ 
   dequeueTime:, windowType:1, ownerPID:2202, ownerUID:10117}, cornerRadiusCrop=[0.00, 0.00, 0.00, 0.00], shadowRadius=0.000, 

window -a

adb shell dumpsys window -a > window .txt
前面dump sf.txt没有对应的layer显示,那么可以查看dump window的数据,确认对应应用的窗口显示状态。搜索Window #,找到对应的Window。
在这里插入图片描述
这里对应的Window为我自己的 应用界面,上面信息描述了该窗口的基本信息,重点需要关注mDrawState=HAS_DRAWN,mDrawState为窗口的绘制状态,HAS_DRAWN表示WMS已经完成该窗口的显示流程。其中,NO_SURFACE、DRAW_PENDING这两个状态表示应用端没有完成对应的surface申请和绘制,此类问题需要应用端查看;COMMIT_DRAW_PENDING、READY_TO_SHOW,表示应用端已经完成绘制并上报状态给WMS,则需要WMS查看显示控制流程。
isOnScreen=true、isVisible=true这两个变量也很重要,确认当前窗口已经是可见,并显示到屏幕上;其他的,如请求宽高、frame大小、位置也可以一一确认。
窗口流程见:WMS窗口相关流程




activity activities

activity containers

adb shell dumpsys activity containers > containers.txt

dumpsys activity activities可以确认当前窗口的层级结构的状态。

图片.png

activity top

adb shell dumpsys activity -v top > top_activity.txt
当启动应用黑屏,使用raw工具可以确认应用绘制送帧为黑色,也可以找到有问题的acitivity对比dump activity top的View Hierarchy:层级树,对比正常的是否加载。
在这里插入图片描述

activity 生命周期,event.log

使用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
    下载后,连接手机,直接运行脚本中的./run.sh,或者python3 winscope_proxy.py
    在这里插入图片描述
    START TRACE: 可以持续dump window和SurfaceFlinger信息,一般适用于闪黑场景,复现之前按下,复现后停止即可。
    DMUP STATE: 相当于就是抓取一次 dumpsys windowdumpsys SurfaceFlinger




其他方法

android trace和backtrace文件的抓取与查看方法

分析步骤

分析方法有很多根据个人习惯分析即可

确认问题现象

dump关键log

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 activity -v top > ./dump/top_activity.txt adb shell dumpsys activity containers > ./dump/containers.txt adb shell dumpsys input > ./dump/input.txt 

找到问题窗口

可以通过dump的SurfaceFlinger 、window 找到问题窗口

分析dump信息

同样不分先后顺序,按个人习惯即可。

1、SurfaceFlinger

+ Layer (SurfaceView[com.miHoYo.hkrpg/com.mihoyo.combosdk.ComboSDKActivity](BLAST)#7353) uid=10231 Region TransparentRegion (this=0 count=0) Region VisibleRegion (this=0 count=1) [ 0, 0, 3200, 1440] Region SurfaceDamageRegion (this=0 count=0) layerStack= 0, z= 0, pos=(0,0), size=( 0, 0), crop=[ 0, 0, -1, -1], cornerRadius=0.000000, smoothness=0.000000, isProtected=0, isTrustedOverlay=0, isOpaque=1, invalidate=0, dataspace=BT709 sRGB Full range, defaultPixelFormat=RGBA_8888, backgroundBlurRadius=0, color=(-1.000,-1.000,-1.000,1.000), flags=0x00000502, tr=[0.00, 0.00][0.00, 0.00] parent=SurfaceView[com.miHoYo.hkrpg/com.mihoyo.combosdk.ComboSDKActivity]#7352 zOrderRelativeOf=none activeBuffer=[1440x3200:,RGBA_8888], tr=[0.00, 0.00][0.00, 0.00] queued-frames=0 metadata={dequeueTime:729, callingUID:10231}, cornerRadiusCrop=[0.00, 0.00, 0.00, 0.00], shadowRadius=0.000, 

Display表示哪块屏幕active,我们看activie的hwc layers,带SurfaceView的图层表示应用显示的内容,常见的视频、游戏等应用都有这个图层,该图层的是否显示主要是看其BufferStateLayer中的activeBuffer、flag
activeBuffer=[ 0x 0: 0,Unknown/None]表示未完成绘图状态,我们这里是activeBuffer=[1440×3200:,RGBA_8888]表示有数据显示
flag为偶数表示图层可见,是奇数表示图层不可见,例如这里的flags=0x00000502表示可见

2、window

窗口显示相关方法 工作内容解释
addWindow App向WMS请求添加窗口记录,会在WMS里新建WindowState(NO_SURFACE)
relayoutWindow App向WMS申请surface用于绘制,执行后window拥有了surface(NO_SURFACE->DRAW_PENDING)
finishDrawingWindow App在surface上完成绘制后,通知WMS(DRAW_PENDING->COMMIT_DRAW_PENDING)
commitFinishDrawingLocked WMS遍历window,对于完成绘制的window(COMMIT_DRAW_PENDING->READY_TO_SHOW)
performShowLocked 判断系统是否允许窗口显示isReadyForDisplay(READY_TO_SHOW->HAS_DRAWN)
showSurfaceRobustlyLocked 对HAS_DRAWN状态的窗口,用SurfaceControl通知SurfaceFlinger显示出来

如果dump上没有显示绘制状态则可以在日志中搜索:*windowmanager.mDrawState

3、activity

4、生命周期

在event.log中搜索wm_和input_focus查看应用生命周期是否已经走到了onresume,窗口焦点是否正常(Focus entering到了焦点)

5、其他异常log

例如常见的ANR,OOM等

案例

抖音黑屏

查找dump命令的方法

代码路径:frameworks/base/core/java/android/content/Context.java
这个代码里面有很多serviceName,比如输入法:
在这里插入图片描述
我们可以看到,其实就是通过getSystemService方法中调用的字符常量,我们要dump输入法服务相关的命令就是adb shell dumpsys input_method


void dump(@NonNull PrintWriter pw, @NonNull String prefix) { 
    final SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US); for (int i = 0; i < mEntries.length; ++i) { 
    final Entry entry = 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(new Date(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)); } } } 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/118635.html

(0)
上一篇 2025-11-11 18:26
下一篇 2025-11-11 18:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信