Android閃屏問題的分析思路


http://www.devba.com/index.php/archives/6157.html  Android閃屏問題的分析思路

 

 

閃屏問題作為Android的一類常見問題,原因復雜多樣.我們在這里整理一下如何分析閃屏問題,找到具體導致閃屏問題的原因.

 

嚴格從技術來說,閃屏問題不能歸為一類問題,他是因為屏幕快速變化導致用戶看起來顯示不正常的問題(很多測試者甚至會將花屏問題當做閃屏問題,這里不做討論).它可能是多種完全不同的原因導致的,硬件問題,驅動問題,繪制問題,合成問題,窗口調度問題,activity問題,以及app本身的邏輯問題都有可能導致用戶看起來屏幕閃屏的感覺,其中百分之九十以上閃屏的問題是由后三種問題導致的.

 

特殊指出的是,由於閃屏問題基本都是邏輯錯誤而不是異常,基本難以單純從log中看到異常信息,因此要分析閃屏問題,可復現的問題最好,如果不能,起碼要保證有清晰完整的屏幕錄像(adb shell screenrecord錄下來的最好),否則問題無法分析.

下面我們來講下如何分析一個可復現的閃屏問題:

 

1 首先來確認下問題是否和屏幕硬件以及驅動有關

 

1.1 屏幕錄像,是不是屏幕問題?

這個問題很好確認,將手機連接電腦,輸入adb shell screenrecord /sdcard/tt.mp4,稍等片刻,開始復現問題,在問題復現完畢后,停止命令執行,去手機sdcard目錄下查看視頻文件.
如果視頻文件中問題不存在,說明這個問題和屏幕硬件驅動或者MDP合成有關系,我們需要繼續區分這到底是屏幕問題還是合成問題.

 

1.2 是不是合成問題?

如何區分這到底是屏幕問題還是合成問題呢?打開開發者選項,勾選禁用硬件疊加選項.
重新復現問題,如果問題依然復現,說明問題是LCD驅動或者硬件層面導致,這是需要LCD組進行check;
如果問題不再復現,說明這很大可能是一個MDP合成問題,需要平台廠商進行check.

 

1.3 underruan問題?

這里指出一種特別的閃屏問題,如果屏幕閃爍規則的半個屏幕的藍色或者黑色矩形,我們有理由懷疑是發生了underrun,這種閃屏問題是可以通過log來確認的,一般來說如果在log中看到顯示有關的硬件打印了underrun的log,說明此時發生了underrun.一般是由於平台某個硬件帶寬不足引起的,建議將問題交給平台來處理.

 

2 接下來我們需要看下是不是繪制或者硬件加速問題

 

2.1 是不是硬件加速問題?

其實,一般來說,如果閃屏只發生在某個特定的路徑下,一般基本沒有可能是繪制的問題或者GPU的問題(因為繪制錯誤只會導致花屏,不可能導致屏幕大小級別的閃屏,如果繪制或者GPU出問題導致閃屏,一般會出現整個系統所有app不分路徑的閃屏),盡管可能性很小,我們也可以測試排除一下.

關閉發生閃屏的程序的硬件加速,在app的AndroidManifest.xml文件中,加入application android:hardwareAccelerated="false" ,如果問題發生在兩個app切換時,關閉兩個app的硬件加速,重新編譯app,拷貝替換.

復現問題,如果問題繼續復現,說明這個問題和繪制沒有關系;如果問題不復現,需要繼續排查是GPU硬件問題還是硬件加速問題導致的閃屏.

 

2.2 是不是GPU問題?

一般來說,如果是GPU出現問題,會不分路徑的,在除了全屏視頻播放之外的所有路徑下都可能出現大范圍的閃屏,這種情況下log中一般搜索opengl的log,會發現在閃屏的應用打出了海量的opengl error的log,這種情況下,很有可能是發生了硬件損壞,建議交給硬件部門check.

 

3 繼續分析問題

如果經過前面的check,我們確定不是硬件的問題,不是驅動的問題,不是繪制的問題,也不是合成的問題.那基本上這個問題就是上層的問題,為了確定到底發生了什么問題,我們需要進一步的確認.

 

3.1 再一次的分析錄像

對於閃屏問題,adb shell screenrecord錄到的視頻是最有分析價值的,所以我們需要進一步分析.
分析之前請下載一款具有高級視頻調節功能的播放器,逐幀播放問題發生時的錄像.

因為閃屏問題,很多時候是切換的問題,那么我們也可以放慢動畫速度來觀察現象.打開開發者選項,將其中的窗口動畫比例,過渡動畫比例,以及動畫影像時間伸縮效果都設置為10x,這樣我們也可以清晰的看到切換的時候發生了什么問題.

此時剩下的問題一般就是activity或者窗口快速切換讓用戶產生了屏幕在閃的幻覺,這種問題大多都可以通過查看錄像慢放明顯的看到不該出現的activity(窗口)出現了,這種問題就是app本身在activity的切換邏輯上有問題,這樣我們就可以從app的角度進行分析(如果慢放動畫可以使得現象變慢的話,我們也可以在問題發生時,抓取SurfaceFlinger的dumpsys,以及通過ADT的Hierarchy view查看閃出來的是哪個activity).

一種比較少見的問題是,app使用了某種特殊的動畫效果,讓測試者或者用戶感覺是閃屏問題.這個時候,在開發者選項中的繪圖選項中,將三個動畫相關的設置都修改為動畫已關閉.如果問題消失,那么可以確定是app自身使用了某種特殊的看起來像是閃屏的動畫效果.

當然還存在另外一種情況,窗口數量是正常的,但是窗口之間在不正常的頻繁切換.

對於后一種情況,只靠查看視頻還不能完全確認,我們還需要查看log來進一步確認.

 

3.2 查看log中窗口的變更和繪制

窗口之間在不正常的頻繁切換,對待這種問題,一個最簡單有效的辦法是,在問題復現時,保持手指一指觸摸屏幕,然后抓取log,我們會看到觸摸的焦點窗口一直在高速變化,如下:

 

[cpp]

 

  1. 11-01 10:45:07.047: D/InputDispatcher(1106): Focus left window: Window{1784331e u0 ..}  
  2. 11-01 10:45:07.087: D/InputDispatcher(1106): Focus entered window: Window{1784331e u0 ...}  
  3. 11-01 10:45:07.207: D/InputDispatcher(1106): Focus left window: Window{1784331e u0 ...}  
  4. 11-01 10:45:07.237: D/InputDispatcher(1106): Focus entered window: Window{1784331e u0..}  
  5. 11-01 10:45:07.257: D/InputDispatcher(1106): Focus left window: Window{1784331e u0 ...}  
  6. 11-01 10:45:07.287: D/InputDispatcher(1106): Focus entered window: Window{1784331e u0 ..}  

 

這樣我們就可以斷定是app在進行不正常的window切換,我們就可以從app的角度檢查一下在問題發生時activity的切換邏輯了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM