系列文章请扫关注公众号!
Android Display Graphics系列文章-汇总
介绍的工具有:ScreenRecord、ScreenShot、BQ dump、HWC dump、MDP dump、MGD、Pvrtrace、Gapid。
1、ScreenRecord
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
2、ScreenShot
因为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:\
3、BQ 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才能抓到现象。
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
》》》》》》》》》 文章详情,请关注公众号 》》》》》》》》》》
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
8、Gapid
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,
- 选Device,选择抓Gapid的手机
- API 选 "OpenGLES",及设置Frames,Stop After 栏,Frames 设为 0,表示不限制抓的帧数。
- 选 Application, for example: com.autonavi.minimap
- 选择存trace 的路径
- 点击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系列文章-汇总