[DESCRIPTION]
在测试手机各项功能过程中,经常会遇到概率性复现“屏幕画花了,界面画错乱了等绘制异常问题”,而且概率还非常小;
这类问题请不要直接提交eService,而是先请测试人员及工程师保留住测试现场,然后根据此条FAQ的步骤进行排查;
 
通常贵司提交问题的时候所提供的资料太少,无法直接定位问题,与其提交了eService之后再又去花时间复现,不如在复现问题的当下,就先按照FAQ的步骤做一个初步排查和分析。
如果在排查过程中,分析问题遇到困难,再将已经排查的结果以及排查过程中每一步所生成的资料和复现问题的log一并提交到eService。
 
这样的话我们就能获得较全面的资料并接着之前的排查结果做进一步分析,不然的话,我们还是需要贵司安排测试人员再花时间去复现,然后按照步骤抓取我们需要的资料,这大大降低了双方的工作效率,所以这条FAQ就是为了减少双方的工作量。
 
下图是显示相关的流程图:
 
[SOLUTION]

在如下3个大的check步骤中,请分别按照每一步的操作来进行排查;如果贵司有定位到某一个问题点,请在提eService时,将问题排查过程写清楚,并提供相应的资料到eService附件中,以便MTK做进一步分析。

1.通过DDMS或GAT tool获取异常界面的屏幕截图

[Android 5.0版本之前]DDMS 截图方法如下:Device --> Screen capture,点击Screen capture,就能抓到当前刷到LCM 屏上的那帧数据,或者通过Eclipse中的DDMS工具的screen capture功能,点击操作面板上的“照相机”图标即可。

=>如果屏幕截图是ok的,那么问题点就在LCM driver或timing,具体问题要具体分析。

=>如果屏幕截图not ok,那么你需要进入第2步去获取并查看FrameBuffer中的数据。

[Android 5.0版本及以后]

Android L版本上抓取到的DDMS截图,不是ovl output,而是GPU composer之后的画面。

若要抓取ovl output,可以输入如下命令

adb shell

system/bin/lcdc_screen_cap  /data/fb.bin

2.获取FrameBuffer中的数据

对于android 4.1及以后的版本,通过如下方法抓取FrameBuffer中的数据:

先做如下操作,再dump framebuffer数据

先进入手机中Settings->Developer options->Disable HW overlays

再勾选Disable HW overlays

抓取framebuffer 数据: adb shell cat /dev/graphics/fb0  > /data/fb.bin 然后将fb.bin adb push出来,通过工具查看fb.bin

=>如果此步骤的屏幕截图是ok,那说明是LCM controller做overlay时出了问题。

需要把寄存器值打出来(保存在kernel log中),再抓kernel log做进一步分析

打印寄存器的值:

请在当前刷屏时,将LCM controller寄存器打印出来,寄存器打印命令如下:

adb shell

echo reg:lcd>sys/kernel/debug/mtkfb

这条命令会将LCM controller的寄存器打印到kernel log中

抓kernel log的方式:要么开启mobile log,要么单独用adb命令抓取kernel log;

用adb命令抓取kernel log的方法是:adb shell cat /proc/kmsg > kernel_log.txt

如果分析问题原因是出在这一步,遇到困难时,请将抓取的资料都提供到eService附件中。

=>如果此步骤的屏幕截图not ok,那么就需要进入第3步,抓取layerdump。

3、抓取layerdump

在异常界面下,手机连接usb,执行抓取layerdump,抓取的方法根据android的版本不同而不同,下面会分别列出不同版本的抓取方法:

android 4.0~4.4的版本,分别介绍在windows环境下和linux 环境下如何抓取layerdump

在Windows系统环境下,将如下内容copy到新建文本文件中,然后保存文件为SF_layerdump_all.bat

保持手机连接usb并且在异常界面下,在电脑端双击鼠标执行该脚本(请在Windows系统下执行),就会在脚本所在路径下生成一个文件SF_layerdump_all

将SF_layerdump_all和复现问题的mobile log一并提供到eService附件中。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SET raw=%1 SET layerdump=%2

IF "%raw%"=="" SET raw=0 IF "%layerdump%"=="" SET layerdump=-1

adb shell setprop debug.sf.layerdump.raw %raw% adb shell setprop debug.sf.layerdump %layerdump% adb shell dumpsys SurfaceFlinger > SF_layerdump_all.log adb shell mkdir /data/SF_dump adb shell mv /data/*.png /data/SF_dump adb shell mv /data/*.i420 /data/SF_dump adb shell mv /data/*.yv12 /data/SF_dump adb shell mv /data/*.RGBA /data/SF_dump adb shell mv /data/*.RGB565 /data/SF_dump rmdir /S /Q SF_layerdump_all md SF_layerdump_all move SF_layerdump_all.log  SF_layerdump_all adb pull /data/SF_dump SF_layerdump_all/ adb shell rm /data/SF_dump/*

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

注意:如果异常画面是动态的,不是那种静止不动的画面,那么可以尝试多执行几次layerdump,尽量争取能抓到发生问题时的画面的layerdump

如果不方便在Windows系统下抓取layerdump,那么就在linux系统的Terminal 下,按照如下步骤执行下面的指令:

在复现问题前,下如下这条命令,做设置并打开layerdump的开关:

adb shell setprop debug.sf.layerdump.raw 1

adb shell setprop debug.sf.layerdump -1

在即将开始复现问题前,先将下面的指令准备好,在复现问题的画面,敲回车执行这条命令,就是做layerdump的动作,

如果复现问题的画面是动态的,请多下几次这条命令,尽量把复现问题的画面dump下来

adb shell dumpsys SurfaceFlinger >SF_layerdump_all.log

执行了上面的第3条命令之后,会在手机的/data/SF_dump目录下生成一些xxx.png或*.i420,*.yv12,*.RGBA,*.RGB565等文件,请把data/SF_dump这个目录pull出来提供给我们,还有SF_layerdump_all.log文件也一并需要提供。

android 5.0及以后的版本,在windows环境下如何抓取layerdump

在Windows系统环境下

若异常画面是静态稳定的,将如下内容copy到新建文本文件中,然后保存文件为SF_bqdump_L.bat

@echo off

adb shell rm /data/SF_dump/* adb shell setprop debug.bq.dump "@surface"

adb shell "dumpsys SurfaceFlinger" > SF_bqdump_all.log

adb shell setprop debug.bq.dump ""

rmdir /S /Q SF_bqdump_all md SF_bqdump_all move SF_bqdump_all.log SF_bqdump_all adb pull /data/SF_dump SF_bqdump_all/ adb shell rm /data/SF_dump/*

echo "Please view dump files in folder 'SF_bqdump_all'" pause

若异常画面是一闪而过的,则需用如下脚本dump画面刷新过程的几十帧画面,下面是设置30帧:SF_cont_bqdump_L_30.bat

复现问题后,双击执行下面的脚本,接着按命令行提示“按电脑任意键继续”,然后等几秒钟,系统会自动dump复现过程的所有帧到指定目录

@echo off

adb shell rm /data/SF_dump/*

:: Modified this line to set surface count,default is 30 adb shell setprop debug.bq.dump "@surface#30"

adb shell "dumpsys SurfaceFlinger > /dev/null"

pause

adb shell setprop debug.bq.dump "@surface"

adb shell "dumpsys SurfaceFlinger" > SF_bqdump_all.log

adb shell setprop debug.bq.dump ""

rmdir /S /Q SF_bqdump_all md SF_bqdump_all move SF_bqdump_all.log SF_bqdump_all adb pull /data/SF_dump SF_bqdump_all/ adb shell rm /data/SF_dump/*

echo "Please view dump files in folder 'SF_bqdump_all'" pause

注意:抓取到layerdump后,请将layerdump的所生成的文件SF_layerdump_all(在Linux环境下就是手机的data/SF_dump目录和SF_layerdump_all.log文件)和复现问题的mobile log一并提交到eService上来。

抓到layerdump之后,根据layerdump的结果,再做下一步分析;

如果layerdump看到的目标画面not ok,则参考如下FAQ做进一步确认,看是app本身的问题还是UI framework绘制的问题;

[DESCRIPTION]
在遇到界面显示异常等问题的时候,需要排查界面异常是由哪个处理过程所引起的,画面显示的过程,大致上可以分为:
1、上层app定义view 大小、位置,和画面对应的layout;
2、View system处理view的这些属性,计算view tree的大小、位置、处理view的绘制逻辑;
3、native framework处理绘图指令,未开启硬件加速绘制时,是使用Skia图形库来执行绘图指令;如果开启了硬件加速,则是GPU来执行绘图指令
 
当前这个FAQ就是要提供方法来抓取View hierarchy,排查第1、2这两个步骤是否出现问题
[SOLUTION]
抓取方法是:
1、将手机用usb连接至电脑,确保手机软件版本是eng load,或者userdebug load,才可以抓View hierarchy,如果是user load,且没有打开对应的debug权限,则不可以抓;
 
2、打开Android sdk提供的Android Debug Monitor工具或Eclipse,进入DDMS这个视图界面;
 
3、打开Devices显示界面,在Devices的进程列表上方的那一排button中,找到最右边的button,将鼠标悬浮在button上方,显示的文字是"Dump View Hierarchy for UI Automator";
 
4、在复现了画面显示异常的界面,保持画面不动,点击第3步中的那个button开始dump,完了之后系统会自动打开所dump到的文件,文件名是dump_xxx.uix,xxx通常是一串数字;
 
5、将鼠标移到文件名上,会悬浮显示出此文件的存放 folder 名称及路径,folder 命名格式为: uiautomatorviewer_xxxxx,xxxxx也是一串数字,将此folder打包提供给我们分析即可;
 
如果是自己分析该文件,那么直接在已经打开了的文件中,查看异常位置处的view的状态和属性是否正确即可,将鼠标移动到view的位置时,view会被红色虚线框highligh出来,右边的属性列表中会显示出该view的各项属性。

MTK平台如何定位显示花屏和界面错乱等绘制异常的问题?的更多相关文章

  1. 痞子衡嵌入式:降低刷新率是定位LCD花屏显示问题的第一大法(i.MXRT1170, 1280x480 LVDS)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170上LCD花屏显示问题的分析解决经验. 痞子衡最近这段时间在参与一个基于i.MXRT1170的大项目(先保个密),需要 ...

  2. 使用Vitamio插件显示花屏

    Vitamio是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染. 使用vitamio进行播放器的开发非常便捷,使用vitamio的解码,自己编写播放器界 ...

  3. (原)在firefly_rk3288开发板上解决openGL在设置32位色深以后出现花屏的问题

    转载请注明出处:http://www.cnblogs.com/lihaiping/p/5567141.html 在做openGL测试的过程中,根据论坛上的帖子,在使用/bin/fbset -a -no ...

  4. LCD显示异常分析——开机闪现花屏【转】

    转自LCD显示异常分析--开机闪现花屏 最近在工作中,有同事遇到LCD开机瞬间会闪现雪花屏的问题,而这类问题都有个共同点,那就是都发生在带GRAM的屏上,同样的问题,在休眠唤醒时也会出现. 其实这类问 ...

  5. Android8.1 MTK平台 SystemUI源码分析之 网络信号栏显示刷新

    SystemUI系列文章 Android8.1 MTK平台 SystemUI源码分析之 Notification流程 Android8.1 MTK平台 SystemUI源码分析之 电池时钟刷新 And ...

  6. Android使用百度地图出现闪退及定位时显示蓝屏问题

     目录 1.Android使用百度地图出现闪退 2.Android使用百度地图定位出现蓝屏问题     1.Android使用百度地图出现闪退 一般情况下出现闪退是在AndroidManifest.x ...

  7. Android8.1 MTK平台 截屏功能分析

    前言 涉及到的源码有 frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java vend ...

  8. udp 视频包网络传输花屏

    视频数据传输在传输层可以选择TCP或者UDP,TCP面向连接,传输中断,发送端是知道的.TCP传输的好处是不丢包,坏处是网络不太好的情况下会越堵越严重.UDP非面向连接,发送端只管发送数据,接收端有没 ...

  9. 各种RTMP直播流播放权限_音视频_数据花屏_问题检测与分析工具EasyRTMPClient

    之前的一篇博客<网络摄像机IPCamera RTSP直播播放网络/权限/音视频数据/花屏问题检测与分析助手EasyRTSPClient>,我们介绍了RTSP流的检测和分析工具EasyRTS ...

随机推荐

  1. 451 Sort Characters By Frequency 根据字符出现频率排序

    给定一个字符串,请将字符串里的字符按照出现的频率降序排列.示例 1:输入:"tree"输出:"eert"解释:'e'出现两次,'r'和't'都只出现一次.因此' ...

  2. javaweb-JSP action中附件下载的写法

     附件下载(包括图片,exl,word)在前台必须给出一个iframe 或者类似于window的窗口,另外,Java文件下载不能通过ajax进行请求,必须添加src属性首选,前台的链接拼接html如下 ...

  3. suricata.yaml (一款高性能的网络IDS、IPS和网络安全监控引擎)默认配置文件(图文详解)

    不多说,直接上干货! 前期博客 基于CentOS6.5下Suricata(一款高性能的网络IDS.IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐) 或者 基于Ubuntu14.04下Suric ...

  4. laravel 学习

    解决办法:没有开启PHP.ini的fileinfo扩展

  5. fullpagejs实现的拥有header和foooter的全屏滚动demo/fullpage footer

    fullpagejs实现的拥有header和foooter的全屏滚动, 技术要点:给section元素加fp-auto-height类, <!DOCTYPE html> <html ...

  6. LoadRunner10自带的WEBTOURS,无法显示Flights页面问题解决办法

    [问题描述] 安装LoadRunner10之后,尝试打开自带的webTours页面学习.第一次可以打开,之后安装了一RFT.Oracle等软件,就出现页面无法显示问题.一直以为是Java的问题,尝试各 ...

  7. Java的知识储备及面试-几个方面

    1.Java本身语法基础 https://github.com/Snailclimb/JavaGuide/blob/master/Java%E7%9B%B8%E5%85%B3/Java%E5%9F%B ...

  8. OC语言Block 续

    OC语言 Block 转载:http://blog.csdn.net/weidfyr/article/details/48138167 1.Block对象中的变量行为 结论: 在block代码块内部可 ...

  9. 源代码管理SVN的使用

    SVN 全称是Subversion,集中式版本控制之王者 SVN 版本控制,需要自己搭建一个管理代码的服务器,提供开发人员,上传和下载 1.基本介绍 使用环境 要想利用SVN管理源代码,必须得有2套环 ...

  10. zookeeper启动

    Zookeeper启动总结1.实际项目用的是Linux,问题不大,本地开发学习用Windows,问题多多.2.Zookeeper3.5.1-alpha,和本地JDK1.7,有冲突,无法正常启动.3.Z ...