http://www.devba.com/index.php/archives/6157.html Android閃屏問題的分析思路php
閃屏問題做爲Android的一類常見問題,緣由複雜多樣.咱們在這裏整理一下如何分析閃屏問題,找到具體致使閃屏問題的緣由.html
嚴格從技術來講,閃屏問題不能歸爲一類問題,他是由於屏幕快速變化致使用戶看起來顯示不正常的問題(不少測試者甚至會將花屏問題當作閃屏問題,這裏不作討論).它多是多種徹底不一樣的緣由致使的,硬件問題,驅動問題,繪製問題,合成問題,窗口調度問題,activity問題,以及app自己的邏輯問題都有可能致使用戶看起來屏幕閃屏的感受,其中百分之九十以上閃屏的問題是由後三種問題致使的.android
特殊指出的是,因爲閃屏問題基本都是邏輯錯誤而不是異常,基本難以單純從log中看到異常信息,所以要分析閃屏問題,可復現的問題最好,若是不能,起碼要保證有清晰完整的屏幕錄像(adb shell screenrecord錄下來的最好),不然問題沒法分析.shell
下面咱們來說下如何分析一個可復現的閃屏問題:app
這個問題很好確認,將手機鏈接電腦,輸入adb shell screenrecord /sdcard/tt.mp4,稍等片刻,開始復現問題,在問題復現完畢後,中止命令執行,去手機sdcard目錄下查看視頻文件.
若是視頻文件中問題不存在,說明這個問題和屏幕硬件驅動或者MDP合成有關係,咱們須要繼續區分這究竟是屏幕問題仍是合成問題.ide
如何區分這究竟是屏幕問題仍是合成問題呢?打開開發者選項,勾選禁用硬件疊加選項.
從新復現問題,若是問題依然復現,說明問題是LCD驅動或者硬件層面致使,這是須要LCD組進行check;
若是問題再也不復現,說明這很大多是一個MDP合成問題,須要平臺廠商進行check.測試
這裏指出一種特別的閃屏問題,若是屏幕閃爍規則的半個屏幕的藍色或者黑色矩形,咱們有理由懷疑是發生了underrun,這種閃屏問題是能夠經過log來確認的,通常來講若是在log中看到顯示有關的硬件打印了underrun的log,說明此時發生了underrun.通常是因爲平臺某個硬件帶寬不足引發的,建議將問題交給平臺來處理.動畫
其實,通常來講,若是閃屏只發生在某個特定的路徑下,通常基本沒有多是繪製的問題或者GPU的問題(由於繪製錯誤只會致使花屏,不可能致使屏幕大小級別的閃屏,若是繪製或者GPU出問題致使閃屏,通常會出現整個系統全部app不分路徑的閃屏),儘管可能性很小,咱們也能夠測試排除一下.spa
關閉發生閃屏的程序的硬件加速,在app的AndroidManifest.xml文件中,加入application android:hardwareAccelerated="false" ,若是問題發生在兩個app切換時,關閉兩個app的硬件加速,從新編譯app,拷貝替換.視頻
復現問題,若是問題繼續復現,說明這個問題和繪製沒有關係;若是問題不復現,須要繼續排查是GPU硬件問題仍是硬件加速問題致使的閃屏.
通常來講,若是是GPU出現問題,會不分路徑的,在除了全屏視頻播放以外的全部路徑下均可能出現大範圍的閃屏,這種狀況下log中通常搜索opengl的log,會發如今閃屏的應用打出了海量的opengl error的log,這種狀況下,頗有多是發生了硬件損壞,建議交給硬件部門check.
若是通過前面的check,咱們肯定不是硬件的問題,不是驅動的問題,不是繪製的問題,也不是合成的問題.那基本上這個問題就是上層的問題,爲了肯定到底發生了什麼問題,咱們須要進一步的確認.
對於閃屏問題,adb shell screenrecord錄到的視頻是最有分析價值的,因此咱們須要進一步分析.
分析以前請下載一款具備高級視頻調節功能的播放器,逐幀播放問題發生時的錄像.
由於閃屏問題,不少時候是切換的問題,那麼咱們也能夠放慢動畫速度來觀察現象.打開開發者選項,將其中的窗口動畫比例,過渡動畫比例,以及動畫影像時間伸縮效果都設置爲10x,這樣咱們也能夠清晰的看到切換的時候發生了什麼問題.
此時剩下的問題通常就是activity或者窗口快速切換讓用戶產生了屏幕在閃的幻覺,這種問題大多均可以經過查看錄像慢放明顯的看到不應出現的activity(窗口)出現了,這種問題就是app自己在activity的切換邏輯上有問題,這樣咱們就能夠從app的角度進行分析(若是慢放動畫可使得現象變慢的話,咱們也能夠在問題發生時,抓取SurfaceFlinger的dumpsys,以及經過ADT的Hierarchy view查看閃出來的是哪一個activity).
一種比較少見的問題是,app使用了某種特殊的動畫效果,讓測試者或者用戶感受是閃屏問題.這個時候,在開發者選項中的繪圖選項中,將三個動畫相關的設置都修改成動畫已關閉.若是問題消失,那麼能夠肯定是app自身使用了某種特殊的看起來像是閃屏的動畫效果.
固然還存在另一種狀況,窗口數量是正常的,可是窗口之間在不正常的頻繁切換.
對於後一種狀況,只靠查看視頻還不能徹底確認,咱們還須要查看log來進一步確認.
窗口之間在不正常的頻繁切換,對待這種問題,一個最簡單有效的辦法是,在問題復現時,保持手指一指觸摸屏幕,而後抓取log,咱們會看到觸摸的焦點窗口一直在高速變化,以下:
這樣咱們就能夠判定是app在進行不正常的window切換,咱們就能夠從app的角度檢查一下在問題發生時activity的切換邏輯了.