在如下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繪制的問題;
?
联系客服