各位戰士,歡迎來到第十六天的戰場。昨天,我們從理論上學習了 Jank 是如何因為 UI Thread 阻塞、錯過 VSYNC 號令而產生的。理論是我們的作戰地圖,但要打贏戰爭,我們必須親赴前線,學會使用偵測工具來識別敵軍。
今天,我們將解鎖每個 Android 開發者武器庫中最基礎、最直觀的兩款偵查利器。它們就藏在我們手機的「開發人員選項」中,能讓我們用肉眼就「看見」性能問題。
首先,確保你的偵查設備(測試手機)已經開啟了開發人員模式。如果尚未開啟,請依照以下步驟操作:
現在,我們的軍械庫大門已經敞開。
這是什麼?
「Overdraw」(過度繪製) 指的是,在同一幀畫面中,同一個像素被重複繪製了多次。想像一下,你先刷了一層白牆(Activity 背景),然後掛上一幅畫(CardView),畫上面還有字(TextView)。牆壁上被畫遮住的部分,就是一次「Overdraw」。
為何要關注?
輕微的 Overdraw 是正常的,但過度的 Overdraw 會浪費 GPU 的寶貴資源。GPU 不得不多次為同一個像素點著色,這會增加耗電,並在複雜的介面中拖慢渲染速度,成為 Jank 的幫兇。它是一個關於「渲染效率」的指標。
如何使用?
啟用後,你的手機螢幕會被各種顏色覆蓋,這些顏色就是敵情的標示:
如何殲滅 (修復)?
我們的目標是消滅紅色,並盡可能減少綠色。
RecyclerView
有自己的不透明背景色,那麼它所在的父佈局 ConstraintLayout
的背景色就是多餘的,可以設定為 @null
。ConstraintLayout
來避免深層的巢狀佈局。層級越少,Overdraw 的可能性就越低。canvas.clipRect()
來告訴系統只需要繪製可見區域,避免繪製被其他 View 完全遮擋的部分。這是什麼?
如果說 Overdraw 工具是看「效率」,那麼這個工具就是看「速度」。它會在你的螢幕上顯示一個即時的柱狀圖,告訴你每一幀畫面到底花了多少時間來渲染。它就是我們的「Jank 測謊機」。
如何使用?
啟用後,你操作 App 的任何介面,底部或中間都會出現滾動的彩色柱狀圖。
如何判讀?
圖中,不同顏色代表渲染管線的不同階段。現階段,我們只需要重點關注兩件事:
onMeasure
, onLayout
, onDraw
的時間。如果藍色部分特別高,幾乎可以肯定問題就出在我們的 View 佈局和繪製邏輯上。今天,我們學會了如何使用兩款最基礎的視覺化偵查工具,它們能幫助我們快速發現問題:
這兩款工具是我們 UI 流暢度戰爭中的「望遠鏡」和「聽診器」,能幫助我們快速進行初步診斷。它們告訴了我們「這裡有問題」。
但是,要弄清楚「問題到底是什麼」,我們需要更精密的儀器。明天,我們將學習使用 Android 性能分析的終極神器:systrace/Perfetto,它能為我們拍下 CPU 活動的詳細「X光片」,讓 Jank 的元兇無所遁形。
我們明天見!