基本思路
每個(gè)項(xiàng)目QC過(guò)程都會(huì)遇到一定數(shù)量的顯示異常問(wèn)題,這種問(wèn)題常常較難排查原因,因?yàn)闋可娴哪K比較多,想要理清是哪一模塊出問(wèn)題,需要對(duì)整個(gè)display
flow 有所了解。根據(jù)經(jīng)驗(yàn),敝司整理出簡(jiǎn)單的排查flow,可以根據(jù)異常的現(xiàn)象,對(duì)號(hào)入座,初步篩查出哪個(gè)模塊的問(wèn)題,在進(jìn)行深入分析。
首先可找對(duì)比機(jī)平臺(tái)是否復(fù)現(xiàn),如果對(duì)比平臺(tái)復(fù)現(xiàn),請(qǐng)客戶自行找app vendor 解決。
? ? ? 如果對(duì)比機(jī)不復(fù)現(xiàn),可以先勾選Setting -> Developer options -> Disable HW overlays后看問(wèn)題是否復(fù)現(xiàn)。
? ? (1)如果不復(fù)現(xiàn),表示推給GPU疊圖后,顯示正常,就需要找HWC owner進(jìn)一步check 原因,這時(shí)候往往需要HWC log。HWC log 會(huì)打印在ged.log中,cat log 后提供給MTK進(jìn)行分析。
adb shell cat /d/ged/gedlog > ged.log
? ? (2)如果還復(fù)現(xiàn),表示無(wú)論GPU 或者HWC 疊圖,都可以復(fù)現(xiàn)問(wèn)題,需要往前看哪一步異常。通常會(huì)先做BQ dump,BQ dump
是dump 所有給surfaceflinger 前BufferQueue中的數(shù)據(jù),具體哪些flow
經(jīng)過(guò)bufferqueue,后面一章的data flow有show 出,可以參考。
? ? ? 1) dump的圖片異常,如是普通UI,請(qǐng)先check SF_bqdump_all.log 中該圖層對(duì)應(yīng)layer的mConnectedApi訊息,1表示GPU 繪制,2表示用CPU繪制,其余兩種很少碰見(jiàn)。
NATIVE_WINDOW_API_EGL = 1,
NATIVE_WINDOW_API_CPU = 2,
NATIVE_WINDOW_API_MEDIA = 3,
NATIVE_WINDOW_API_CAMERA = 4,
如果mConnectedApi=2,直接找skia onwer分析CPU為何畫錯(cuò);
如果mConnectedApi=1,由于某些app是適配某一種GPU去開(kāi)發(fā)的,所以可以先rename GPU的name看是否正常。如在高通不復(fù)現(xiàn),mali GPU 復(fù)現(xiàn),可以rename成高通的,如下是rename成高通308的CMD,
adb shell setprop debug.gpu.fake_gpu_vendor 'Qualcomm'
adb shell setprop debug.gpu.fake_gpu_renderer 'Adreno (TM) 308'
如果rename成對(duì)比平臺(tái)GPU依然復(fù)現(xiàn),鑒于P版本render
pipeline 改版,由O版本默認(rèn)的HWUI改成skiaGL,所以可以切換成和O版本一樣看問(wèn)題是否復(fù)現(xiàn)。如不復(fù)現(xiàn),找skiaGL owner
check,如復(fù)現(xiàn)就找GPU owner check,GPU
onwer通常會(huì)抓MGD或者pvrtrace或者Gapid去看怎么畫錯(cuò)的,具體如何抓取和如何初步分析,后面第三章會(huì)具體介紹。
切Opengl:adb shell "setprop debug.hwui.renderer opengl"
切回去: adb shell "setprop debug.hwui.renderer ''"
如果是camera 或者video 場(chǎng)景的畫面異常,
有一層layer通常是surfacetexture,這是一個(gè)raw
data,需要用特殊的工具解析出圖片是否正常。如異常,直接找camera或者video owner check。如正常,還要看另外一層layer
surfaceview是否正常,這層layer是surfacetexture 經(jīng)過(guò)GPU
render后的結(jié)果,通常使用glSurfaceview實(shí)現(xiàn)。如果surfaceview正常,就走dump
圖片正常的flow,如果異常,可以先找GPU owner,不過(guò)也有例外,即不是GPU的問(wèn)題,要具體問(wèn)題具體對(duì)待。
2) dump的圖片正常,可以錄screenrecord看錄出來(lái)的視頻是正常,如正常,極有可能是display driver的問(wèn)題,如不正常,找HWC owner check HWC flow。
下面是具體的flow,如果比較熟悉或經(jīng)驗(yàn)比較豐富,也可不按照該步驟check,直接分析即可。

Classic Multimedia Data Path
? ? ? 結(jié)合第一章顯示異常的Guildline,在了解常見(jiàn)場(chǎng)景的data path,這對(duì)于分析問(wèn)題很有幫助。下面介紹幾種常見(jiàn)場(chǎng)景的data flow。由于app寫法不一,這里介紹的是最常見(jiàn)的,如遇復(fù)雜場(chǎng)景,可以通過(guò)抓取systrace了解其flow。
1,?普通UI的data flow
普通UI 的flow 很簡(jiǎn)單,一般情況下硬件加速都默認(rèn)開(kāi)啟,所以大部分UI都是通過(guò)GPU 繪制后給surfaceflinger 疊圖。如果關(guān)掉硬件加速,會(huì)推給CPU skia 繪制,遇到這種問(wèn)題,根據(jù)第一章Guildline下即可知道哪個(gè)模塊有問(wèn)題。

2,?Video播放的data flow
Video 播放的data flow 分為兩種類型,surfacetexture和surfaceview ,兩者的異同點(diǎn)網(wǎng)上有很多,可以自行搜尋了解。
除了做BQ Dump,也可以dump decode output
直接看給surfacefliger或者GPU的surfacetexture是否正常,如果有過(guò)MDP,也可以看MDP input 和 output
是否正常。Dump的方法不同平臺(tái)和android 版本不同,可咨詢相應(yīng)的onwer。
i. surfaceview

ii.?surfacetexure

3,?Camera data flow
? ? ?Camera 場(chǎng)景同video,preview data
分surfacetexture和surfaceview。如video場(chǎng)景一樣,如果不抓BQ dump,可抓camera output
看camera送出來(lái)的數(shù)據(jù)是否正常。注意:camera output 是已經(jīng)過(guò)了MDP以后的數(shù)據(jù)。
i. surfaceview

ii.?surfacetexure

4, Recording
i. Camera Recording
? ? ?這里以camera preview出surfacetexture為例介紹camera 錄屏的data flow,如果是surfaceview,給sf的一路換成3中surfaceview的data flow即可。
? ? ?因?yàn)槭卿浧?,所以這里codec為encode。一般錄出來(lái)的視頻不帶特效,所以camera data直接送給encode 編碼,但是不少三方app 錄出來(lái)的視頻都加了特效,所以會(huì)在過(guò)GPU 給encode。

ii.?Common Recording

i