UI相關問題(畫錯了,畫花了,沒畫, 黑屏, 白屏,花屏等),透過普通的mobile log是很難定位到問題的.需要藉助layer dump / window log / view system log來輔助分析.
注意: 因為log量很大, 所以為了快速定位問題範圍, 要詳細描述log對應的操作過程, 並在附上log時一併說明發生顯示問題的時間點.
[SOLUTION]
抓取Layer dump的方法如下:
Android 2.3版本:
請先幫忙確認,alpsrameworksaseservicessurfaceflinger estslayerdump下有沒有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開關 (重新開機後需要再次設定)
- 先到工模裡開啟mobile log
- 通過命令列開啟下面的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 注意:window log的內容比較多,為了方便定位問題,請一定要記錄問題發生的準確時間點,並在附上window log時作出說明。
抓取View system log的方法如下:
開啟ViewRootImpl.java中的DEBUG_XXX為true,並重新編譯framework.jar模組,相應的log是在mobile log的main log裡.