iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android 黑屏问题分析处理总结
  • 327
分享到

Android 黑屏问题分析处理总结

android 2023-08-16 15:08:08 327人浏览 安东尼
摘要

介绍 黑屏问题是显示相关的综合性问题,涉及Android应用层、框架层和底层SurfaceFlinger、屏显等多个领域。下面有一些基础的判断来定位黑屏问题的归属: (1) 屏幕没有亮屏、背光为0则需先从power、屏显角度分析 (2) 屏

介绍

黑屏问题是显示相关的综合性问题,涉及Android应用层、框架层和底层SurfaceFlinger、屏显等多个领域。下面有一些基础的判断来定位黑屏问题的归属:
(1) 屏幕没有亮屏、背光为0则需先从power、屏显角度分析
(2) 屏幕黑屏,但可以进行三指截屏、power键+音量下键截屏,并且截图正常显示(非黑图),则需先从屏显角度分析
(3) 视频类、相机类显示黑屏,需要先确认编解码、阅览显示问题
(4) 应用界面局部性黑块,某个控件黑,确认应用的view问题

常见分析手段

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

dumpsys SurfaceFlinger > SurfaceFlinger .txt

确认当前的dump SurfaceFlinger 数据对应黑屏现象的时间点
首先,确认HWC layers合成显示的图层是否为对应黑屏时应该显示的应用图层;接着,核查是否存在focused layer,该layer是否对应所需的显示图层;然后,核对位置、大小、旋转角度是否正常。
在这里插入图片描述
如果启动某个应用黑屏,而当前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:97987454113, windowType:1, ownerPID:2202, ownerUID:10117}, cornerRadiusCrop=[0.00, 0.00, 0.00, 0.00],  shadowRadius=0.000, 

另外我们还需要重点关注两个参数:color和flags,color的最后一个参数表示alpha,如果该参数为0,该图层也是不会显示的;flag参数在2进制状态的末位bit表示可见性,1表示不可见,0表示可见。也可以总结为flag是偶数表示图层可见,是奇数表示图层不可见。
通过使用irfanview查看对应的图层内容 https://www.irfanview.com/

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窗口相关流程

adb shell dumpsys activity activities > activities.txt

dumpsys activity activities可以确认当前启动的activity显示状态。该数据,从top遍历到bottom,从Task到里面的activity,把activity的信息,包含属于哪个应用、由谁启动、通过哪个Intent等。其中,确认该acitivity的窗口是否正常绘制,主要看信息mNumInterestingwindows=1 mNumDrawnWindows=1 allDrawn=true。
在这里插入图片描述在这里插入图片描述
mNumInterestingWindows表示需要绘图的窗口数目,mNumDrawnWindows表示已经完成绘图的窗口数目。这里都为1表示已经完成绘图。这里里面可以看到很多信息,例如:
Keyguard的显示状态
在这里插入图片描述InsetsState状态
在这里插入图片描述Display areas z order
在这里插入图片描述

adb shell dumpsys activity top > top_activity.txt

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

activity 生命周期,event.log

通过 event.log分析activity生命周期情况,确认应用的activity是否执行了onResume,focus是否切换到焦点窗口,甚至应用存在anr等情况。

分析步骤

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

确认问题现象

通过录屏来观察黑屏的过程,确认问题时间点
如果在录像过程中,有对黑屏现象截图,发现截图正常,但是屏幕是黑的,可以直接判断为屏显问题

dump关键log

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

找到问题窗口

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

分析dump信息

不分先后顺序

1、SurfaceFlinger

①看SurfaceFlinger中是否有对应的图层,即是否合成显示,如果没有可以先看dump的window,见第2步
②有图层则通过id找到对应的Layer和BufferStateLayer
在这里插入图片描述在这里插入图片描述我们可以看到Layer 后有一串16进制数,同这个可以在log文件里面找到对应raw文件,使用irfanview工具,看其图层内容,如果本身就是黑屏,大概率是应用问题,见第2步、第3步可以进一步确认
在这里插入图片描述

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

2、window

找到有问题的窗口查看关键的参数
mDrawState确认窗口绘制状态
isOnScreen、isVisible当前窗口已经是可见,并显示到屏幕上
NO_SURFACE、DRAW_PENDING这两个状态表示应用端没有完成对应的surface申请和绘制,此类问题需要应用端查看;COMMIT_DRAW_PENDING、READY_TO_SHOW,表示应用端已经完成绘制并上报状态给WMS,则需要WMS查看显示控制流程。

窗口显示相关方法工作内容解释
addWindowApp向WMS请求添加窗口记录,会在WMS里新建WindowState(NO_SURFACE)
relayoutWindowApp向WMS申请surface用于绘制,执行后window拥有了surface(NO_SURFACE->DRAW_PENDING)
finishDrawingWindowApp在surface上完成绘制后,通知WMS(DRAW_PENDING->COMMIT_DRAW_PENDING)
commitFinishDrawingLockedWMS遍历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 top

对比正常的dump,查看View Hierarchy:层级树是否存在异常

4、生命周期

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

5、其他异常log

例如常见的ANR,OOM等

案例

抖音黑屏

视频播放输入输出数据正常
2.dump SurfaceFlinger 中没有抖音图层
3.dump SurfaceFlinger 中mDrawState为NO_SURFACE
4.应用生命周期有走到onresume流程,当前焦点窗口为空,与前面NO_SURFACE对的上
5.在日志中查看是否有异常log,发现有OOM(OutOfMemoryError)

来源地址:https://blog.csdn.net/yimelancholy/article/details/130543872

--结束END--

本文标题: Android 黑屏问题分析处理总结

本文链接: https://www.lsjlt.com/news/371548.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android 黑屏问题分析处理总结
    介绍 黑屏问题是显示相关的综合性问题,涉及Android应用层、框架层和底层SurfaceFlinger、屏显等多个领域。下面有一些基础的判断来定位黑屏问题的归属: (1) 屏幕没有亮屏、背光为0则需先从power、屏显角度分析 (2) 屏...
    99+
    2023-08-16
    android
  • 总结分析无法访问PHP的问题
    在搭建服务器时,你可能会发现无法访问PHP的问题。这是一个非常常见的问题,在解决它之前,我们需要先了解一些概念。PHP是一种被广泛应用的脚本语言,它可以让你在服务器端编写程序来动态生成网页内容。为了让访问者能够看到你编写的PHP代码,你需要...
    99+
    2023-05-14
  • Android AccessibilityService 事件分发原理分析总结
    目录AccessibilityService 监听事件的调用逻辑onAccessibilityEventonInterceptAccessibilityService 事件的外部来源...
    99+
    2024-04-02
  • Unity开发VR项目问题总结分析
    目录一、StreamVR问题:1.运行项目时不显示手柄控制器:2.按键动作检测出现重复问题:3.Error during OpenVR Init: Init_InterfaceNot...
    99+
    2024-04-02
  • Android数据结构全面总结分析
    前言 这次算一个总结,我们平时都会用到各种各样的数据结构,但是可能从未看过它们内部是如何去实现的。只有了解了它们内部大概的一个实现原理,才能在不同的场景中能选出最适合这个场景的数据结...
    99+
    2022-12-08
    Android 数据结构 Android 数据结构总结分析
  • Android实现截屏方式整理(总结)
    本文介绍了Android 实现截屏方式整理,分享给大家。希望对大家有帮助可能的需求: 截自己的屏 截所有的屏 带导航栏截屏 不带导航栏截屏 截屏并编辑选取一部分 自动截取某个空间或者布局 截取长图 在后台去截...
    99+
    2023-05-30
    android 截屏 roi
  • 总结logminer使用及各种问题处理
    版本有点老,但还是很有用[@more@]总结logminer使用及各种问题处理 在前人的工作基础上,结合自己使用过程中出现的问题及解决方法给个一个新版的<<理解和使用Oracle 8i分析工具LogMiner>>:理...
    99+
    2023-06-04
  • Android anr问题分析
    前言 本文主要介绍anr问题一手分析、分类判断,归类后提case给平台处理。 不是针对应用开发的anr分析和优化处理。 anr问题分类 anr问题主要分为 1、input 无焦点anr Reason:...
    99+
    2023-09-01
    android
  • Android应用启动时白屏或者黑屏处理办法
    老生常谈的问题了,随便记录一下吧。 通过设置主题来防止白屏或者黑屏 一般情况下,启动页面通常是全屏的,而且会用一张图片来展示用户打开应用程序后第一眼看到的界面。在手机中点击应用程序的图标到应用程序显示完MainActivit...
    99+
    2023-09-12
    android 性能优化 Powered by 金山文档
  • Python异常处理与反射相关问题总结
    一、异常处理 在程序开发中如果遇到一些 不可预知的错误 或 你懒得做一些判断 时,可以选择用异常处理来做。 import requests while True: u...
    99+
    2024-04-02
  • JDBC连接mysql乱码异常问题处理总结
    前段时间学习JDBC,要连接mysql获取数据。按照老师的样例数据,要存一些名字之类的信息,用的都是英文名,我当时就不太想用英文,就把我室友的名字存了进去,嘿嘿,结果,出问题了。 连接数据库语句:static final Stri...
    99+
    2023-05-30
    jdbc mysql 乱码
  • WMS问题处理的示例分析
    这篇文章主要介绍了WMS问题处理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。采购订单没有生成上传订单号pkg_inpurchas...
    99+
    2024-04-02
  • Android  ActionBarActivity设置全屏无标题实现方法总结
    Android  ActionBarActivity设置全屏无标题实现方法总结前言:新建的Activity继承自ActionBarActivity,设置全屏无标题本来很简单的事,但是没想到app竟然无缘无故的挂,要么就是白屏一片,...
    99+
    2023-05-31
    android actionbaractivity bs
  • 分析总结20道Vue高频面试题
    目录引言vue生命周期vue父子组件生命周期v-if和v-showv-for和v-if优先级说一下computed和watchvue-routervue2和vue3区别vue插件使用...
    99+
    2022-11-13
    Vue高频面试题 Vue面试
  • 阿里云服务器黑屏问的处理方法
    阿里云服务器黑屏是一种常见的服务器问题,可能由于各种原因导致,如软件故障、硬件故障、网络问题等。本文将详细介绍如何处理阿里云服务器黑屏问题。 一、确定问题 1. 登录阿里云控制台,查看服务器状态,确认是否出现黑屏现象。 2. 检查阿里云服...
    99+
    2023-10-29
    阿里 黑屏 服务器
  • 如何处理电脑蓝屏问题
    小编给大家分享一下如何处理电脑蓝屏问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!电脑较常见的蓝屏原因以及避免的方法与解决办法(1)内存条接触不良或内存损坏导致...
    99+
    2023-06-28
  • Android 应用中如何处理播放器的横屏切换问题
    本篇文章给大家分享的是有关Android 应用中如何处理播放器的横屏切换问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1 在播放中如何处理播放器的横屏切换 和 播放器上的文...
    99+
    2023-05-31
    android roi
  • 基于MongoDB的实时数据处理与分析经验总结
    随着大数据时代的到来,数据的处理和分析变得越来越重要。在数据处理和分析领域,MongoDB作为一种流行的NoSQL数据库,被广泛应用于实时数据处理和分析中。本文将从实际经验出发,总结基于MongoDB的实时数据处理与分析的一些经验。一、数据...
    99+
    2023-11-02
    数据分析 MongoDB 实时数据处理
  • 高分屏下canvas模糊问题的示例分析
    这篇文章将为大家详细讲解有关高分屏下canvas模糊问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言最近在做项目的时候发现,在公司电脑上没问题,在自己电脑上确有问题。做的是canvas的项...
    99+
    2023-06-09
  • MYSQL5.6 5.7处理数据分布不均的问题分析
    本篇内容主要讲解“MYSQL5.6 5.7处理数据分布不均的问题分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MYSQL5.6 5.7处理数据分布不均的问题...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作