前言
欢迎大家我分享和推荐好用的代码段~~
声明
欢迎转载,但请保留文章原始出处:
CSDN:http://www.csdn.net
雨季o莫忧离:http://blog.csdn.net/luckkof
正文
UI相关问题(画错了,画花了,没画, 黑屏, 白屏,花屏等),透过普通的mobile log是很难定位到问题的.需要借助layer dump / window log / view system log来辅助分析.
注意: 因为log量很大, 所以为了快速定位问题范围, 要详细描述log对应的操作过程, 并在附上log时一并说明发生显示问题的时间点.
[SOLUTION]
抓取Layer dump的方法如下:
Android 2.3版本:
请先帮忙确认,alps\frameworks\base\services\surfaceflinger\tests\layerdump下有没有Android.mk和layerdump.cpp两个文件。
如果没有这两支文件,请帮忙告知我司,我司同仁会先把这两支文件发给您,然后请您帮忙再按照以下的做法抓取layerdump相关的信息。
I) 在目前贵司可以复现显示问题的工程根目录下,执行以下命令:./makeMtk -t xxx mm frameworks/base/services/surfaceflinger/tests/layerdump (其中xxx表示工程名)。命令执行完成后,將會在 out/target/product/xxx/system/bin/ 下生成一个名为test-layerdump的可執行檔。
II) 把test-layerdump用命令push到手机的system/bin下:adb push test-layerdump system/bin
III) 在复现问题的画面,执行以下命令:
adb shell chmod 777 system/bin/test-layerdump
adb shell test-layerdump
adb shell dumpsys SurfaceFlinger > SF_layerdump_all.log
IV) 将生成的 /data/*.png 和 /data/*.uyvy 這些圖檔,以及生成的SF_layerdump_all.log信息打包发给我司。
请注意,从/data下导出每个layer png图片,需要使用命令:adb pull 命令,例如:导出/data/5.png图片,是用的命令是: adb pull data/5.png D:/ , 这个命令表示把/data/5.png导出到D盘下.
Android 2.3之后的版本:
I) 请帮忙创建一个名为:SF_layerdump_all.bat.txt 的txt档案,内容如下:
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/*
II) 创建好并保存txt后,重命名为SF_layerdump_all.bat,把这个bat放到电脑的windows桌面上。
III) 手机连接usb,在可以复现这个显示问题的画面(也就是当一个竖屏应用显示成横屏时),双击执行SF_layerdump_all.bat,然后把生成的文件夹打包发给我们(文件包里有一些Png图片,对应每个layer的snap shot,还有一个log文件)。
对于一闪而过的画面显示问题,很难抓到问题现场的Layer dump,可以尝试通过adb命令:adb shell dumpsys SurfaceFlinger > desktop/sf.txt 可以现在console上输入这串命令,当一闪而过的问题画面出现时,回车执行,多尝试几次,看能否抓到问题画面的layer dump.
注意:要使用eng build来抓取layer dump!
抓取window log的方法如下:
1) 修改代码并编译
打开WindowManagerService.java中的DEBUG_XXX 为true,重新编译services.jar模块,相应的log是在mobile log的main log里.
2) 不修改代码,动态打开debug开关 (重新开机后需要再次设置)
- 通过命令行打开下面的debug的开关,如下操作:
adb shell dumpsys window -d enable 0 1 2 3 4 5 6 8 9 10 11 12 13 14 16 17 19 21 22 23 24 26 29 30 32 33 34
adb shell dumpsys window -d disable 18
- 复现问题并抓取mobile log
抓取View system log的方法如下:
打开ViewRootImpl.java中的DEBUG_XXX为true,并重新编译framework.jar模块,相应的log是在mobile log的main log里.