閃屏情況處理

surfaceflinger 原理
surfaceflinger負責圖層的疊加,在各個圖層疊加數據完成後,通過fb_post將顯示數據刷新到framebuffer中去。
layer1——–|
surfaceflinger 【layer(1+2+…+n)】 —>fb_post ——>framebuffer—>LCD顯示
layer 2——-|
… ————|
layer-n —– |
4.4之前dump 圖層方法:
surfaceflinger中繪製圖像,會把每一層的圖像進行疊加,處理後的圖像會顯示在屏幕上。如果是某一層的圖像出錯導致,就必須把surfaceflinger每一層的圖像單獨dump出來。

具體方法:

在surfaceflinger目錄下創建文件dump.cpp,此文件負責繪製。再在Layer.cpp中的onDraw函數中加入如下代碼:


#if defined(LAYER_DUMP_BMP)
    {
        FILE* fp;
        if(fp = fopen("/data/dump_bmp/d_test", "r"))
        {
            char filename[256];
            extern void dump_bmp(const char* filename, const sp<GraphicBuffer>& buffer);
            sprintf(filename, "/data/dump_bmp/fm%04d_lay%04d_F%04d.bmp", frame_count, layer_count,mActiveBuffer->format);
            dump_bmp(filename, mActiveBuffer);
            fclose(fp);
        }
        else
        {
            //LOGD("layer dump file d_test open fail");
        }
    }
#endif/*LAYER_DUMP_BMP*/

並在SurfaceFlinger.cpp中加入控制幀數和層數的變量。

即可調用繪製圖層的命令。

(附件裏附上相應的修改dump_bmp,Layer,SurfaceFlinger)

手機連上USB後,輸入如下命令:

adb root
adb shell

mkdir /data/dump_bmp
touch /data/dump_bmp/d_test

這時系統就會開始dump圖片
想要停止dump就刪除d_test這個文件
rm /data/dump_bmp/d_test

所有的圖片都在/data/dump_bmp/中

這樣就可以得到每一幀每一層的圖像,對比相應層的圖像,即可獲知是否由於某一層的繪製出了問題。

5.0 之後surfaceflinger dump 顯示
在5.0後,dump_bmp.cpp默認沒有加到surfaceflinger中去,但是android4.4 之後已經集成了screenrecord命令來錄製合成好之後的顯示數據。
screenrecord使用
錄製命令
adb shell screenrecord /sdcard/test.mp4
視頻保存目錄可以自己指定,如上面的/sdcard/test.mp4,
命令執行後會一直錄製180s,按下ctrl+c可以提前結束錄製
設定視頻分辨率
對於高分辨率的手機,錄製的視頻很大,我們分享又不需要這麼大的
我們可以設置錄製的視頻分辨率
adb shell screenrecord –size 848x480 /sdcard/test.mp4
設定視頻比特率
默認比特率是4M/s,爲了分享方便,我們可以調低比特率爲2M
adb shell screenrecord –bit-rate 2000000 /sdcard/test.mp4
獲取視頻文件
使用adb pull 即可把手機SD卡中視頻獲取到本地
adb pull /sdcard/test.mp4 .
通過screenrecord來定位問題
通過使用screenrecord可以初步定位顯示問題中,是上層繪製的問題,還是底層LCD顯示的問題。如果record的數據正常,說明LCD顯示有問題,如果record的數據不正常,說明上層繪製有問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章