Android显示异常问题处理指导手册4-Debugging Tools

系列文章请扫关注公众号!

Android Display Graphics系列文章-汇总

介绍的工具有:ScreenRecord、ScreenShot、BQ dump、HWC dump、MDP dump、MGD、Pvrtrace、Gapid。

1ScreenRecord

screenrecord 是Overlay的output,可以协助我们理清问题大致在哪个模块。

i. Android screenrecord

adb shell screenrecord /sdcard/1.mp4

adb pull /sdcard/1.mp4

adb shell screenrecord --bugreport /sdcard/1.mp4  //--bugreport参数后左上角会有timestamp

2ScreenShot

  因为screenshot 是GPU 绘制出来的结果,所以如果screenshot 出来有问题,说明GPU 画出来的已经有问题,那么就要往前查哪个环节出错。如果screenshot 没问题,比如有些case 截图保存不成功,那么可以查截图后面的flow,如save的flow等。

i.Android screenshot

adb shell /system/bin/screencap -p /sdcard/screenshot.png?show

adb pull /sdcard/screenshot.png?show

ii.MTK平台:

surfaceflinger 这边有set property 可以dump screenshot,

dump screenshot图片方法:

adb shell rm -rf /data/SF_dump

adb shell mkdir /data/SF_dump

adb shell chmod 777 /data/SF_dump //一定需要,否则dump不成功

adb shell setprop vendor.debug.sf.dump_ss 1 //frameworks/native/services/surfaceflinger/mediatek/SurfaceFlinger.cpp property_get("debug.sf.dump_ss", value, "0");

adb shell dumpsys SurfaceFlinger --mtk //注意是两个连续短线--

reproduce screenshot

adb pull /data/SF_dump d:\

3BQ dump

也叫Layerdump, 每个android 版本,BQ dump 的脚本都有少许差异。

BQ dump 脚本通常分两个,脚本all_bqdump_P.bat只抓一帧,适合问题必现的场景,all_cont_bqdump_P.bat可以连续抓10帧,适合一闪而过的issue。

两个批处理脚本文章最后查看!!!

抓取的步骤都是一样的:

在复现问题的时候双击.bat档案即可抓取,抓取完后会形成如下三个档案,

SF_dump:capture的图片,可以很清楚看出有没有图片异常。如果是camera或者video场景,会有.yv12或者其他格式的surfacetexture,这时候需要用特殊的工具解析,可使用7yuv.exe查看。

GuiExtSerivce.log:一般video或camera场景异常会用到,可暂不用关注。

SF_bqdump_all.log:同dumpsys SurfaceFlinger,记录当下每层layer的参数信息。参数含义可结合code去解读。

注意:在抓取的过程中,画面会停住不动,抓完后恢复。连续layerdump 会更卡顿,可能需要多次capture才能抓到现象。

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

》》》》》》》》》        文章详情,请关注公众号                 》》》》》》》》》》

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

8Gapid

Gapid是Google 原生的抓openGL trace的工具,如果MGD 和 pvrtrace都抓不到现象,可以用Gapid。但是他抓的内容没有MGD 和 pvrtrace多,不过可以参考。

Download 地址:https://github.com/google/gapid/releases

(1) 如何capture Gapid

i. adb root/remount/setenforce 0

ii. 安装Gapid后,运行Gapid,点击File->Capture Trace

iii. 设置 the Device, API, Application & Output Directory, 然后点击 "OK" 开始抓取trace,

  1. 选Device,选择抓Gapid的手机                           
  2. API 选 "OpenGLES",及设置Frames,Stop After 栏,Frames 设为 0,表示不限制抓的帧数。
  3. 选 Application, for example: com.autonavi.minimap

  1. 选择存trace 的路径

  1. 点击OK 后, 手机上会出现如下画面, 请等待, 不要做任何操作 , 等手机上要抓取得app 自动重启好后,再操作。

f) 等app 重启好,上述waiting for debugger 框消失后,开始操作app,抓取trace

iv. 设置 the Device, API, Application & Output Directory, 然后点击 "OK" 开始抓取trace

v. stop  trace.

(2) 如何分析Gapid

i. open Gapid trace,注意要连上手机,trace才能显示,连接不同GPU DDK 版本的手机,对应的frame现象可能不同。

ii. 一般录制Gapid 的同时会录屏,以免录制太久,很难找到异常的frame。根据录屏的大概画面和时间点,找到出错的frame。以微信朋友圈字体显示异常为例,结合录屏逐帧播放,找到出错的字体在frame 277.

iii. 点击Frame 277,会跳到对应的draw call位置,中间对应framebuffer。

iv. 每个draw 之前都有对应的图片,以及每个draw call 调用了哪些gl CMD 。

v. 去掉view->Show Filmstrip 勾勾,下载277对应的framebuffer, 并下载正确的framebuffer.

Framebuffer 277                                            Framebuffer 276

vi. 对照Framebuffer 277和Framebuffer 276发现“则”字变成了“事”,接着看对应Draw 277和Draw276 gl CMD 有什么不同。

仔细看每个Draw X 的gl cmd,发现都有glBindTexture 19,且对比发现,277 bind的texture上有一个“事”正常276 bind的texture是“则”。

Framebuffer 277                                       Framebuffer 276

找到对应bind的texture异常后,需要进一步往上查,根据前面的显示异常flow,上上一棒找Skia GL 后者HWUI的onwer

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

》》》》》》》》》        文章详情,请关注公众号                 》》》》》》》》》》

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

 系列文章请扫关注公众号!

Android Display Graphics系列文章-汇总

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值