一、概述
Hierarchy Viewer
是我們平時開發中常用的工具,通過它我們可以得到某個介面中的佈局層次,今天我們來介紹一下如何使用這個工具來優化佈局。
Hierarchy
工具位於SDK/tools
目錄下,直
接執行之後我們會得到下面這個介面:
Load View Hierarchy
Inspect Screenshot
因為主要是討論如何用它來分析效能問題,所以我們主要介紹第一個功能。
二、Hierarchy
分析
2.1 整體佈局分析
在Hierarchy Viewer
的根介面,它列出了當前手機或者模擬器中可見的Window
,假如我們要分析某個Activity
,那麼點選它,再點選Load View Hierarchy
後,就會得到下面這個介面:
Tree View
這裡面將Activity
的所有View
呈現成為一個樹形結構,它提供了以下幾種操作方式:- 通過拖動條來放大或縮小可視範圍。
- 通過輸入類名或者
View
的id
來迅速定位到需要分析的View
- 通過上方的
Save as PNG
或者Capture Layers
儲存當前的樹形結構。
Tree Overview
這相當於是Tree View
的縮小版,可以通過它快速檢視或者定位。Properties View
當我們選取了一個View
的時候,它會列出對應View
的屬性。Layout View
當我們選取了一個View
之後,會在這個區域內,顯示出不同顏色的矩形框,其中紅色就是我們選取的View
的範圍,而淡紅色則是該View
對應的父容器的範圍,其它的白色矩形框既不是該View
的父容器,也不是該View
的子控制元件。
需要注意,當Window
的佈局變化時,是不會主動重新整理的,如果我們想要檢視最新的佈局情況,那麼就要點選上方的Load View Hierarchy
來重新整理,而如果我們想要去檢視別的Window
佈局,那麼就需要點選下方操作欄最左邊的按鈕,重新進入選擇Window
的視窗。
2.2 單個佈局元素分析
對於Tree View
中的每個節點,我們可以獲得以下資訊:
View
的類名View
所儲存的地址View
的id
屬性值View
繪製的相對耗時分析,它會根據measure/layout/draw
這三個階段,分為三個小點展示,而小點的顏色就代表了它在這個階段相對於View
樹中的其他View
在同一階段的耗時對比結果:- 綠色:在前
50%
- 黃色:在後
50%
- 紅色:耗時最長
View
處於它的父容器的index
。
如果我們選擇了一個View
,那麼會有更加詳細的資訊:
View
和它的子View
在當前在螢幕上的結果。View
的子View
個數。View
各繪製階段耗時,單位為ms
,包括了它自己和它的子View
的耗時。
2.3 如何除錯
上面我們看到Hierarchy View
可以得到繪製階段的耗時,這些耗時是在上一次繪製的時候計算出的,我們也可以通過這個工具主動地觸發重繪,以得到最新的結果,操作步驟為:
- 選取一個
View
- 點選視窗上方的
invalidate
把這個View
標記為需要重繪,那麼在下次請求繪製的時候就會重繪它。 - 點選視窗上方的
request layout
,來發起一次請求,這樣它和它的子View
以及需要重繪的View
都會重新執行三個過程。
2.4 如何優化
Hierarchy View
對於我們平時開發中的作用主要是以下幾點:
- 檢視整個佈局的深度,是否可以去掉一些不必要的層級,以儘量使
View
樹保持扁平。 - 檢視
measure、layout、draw
當中那些紅色或者黃色的節點,但是由於這些節點的顏色是包含了它和它的子View
的時間,因此我們分析的時候,需要根據具體情況看究竟是由於ViewGroup
的子View
過多,還是View
過於複雜引起的這一問題。
三、小結
今天主要介紹了Hierarchy Viewer
和分析效能有關的用法,如果對於Inspect Screenshot
有興趣的同學可以檢視下面官方文件的其它部分:
http://android.xsoftlab.net/tools/debugging/debugging-ui.html
更多文章,歡迎訪問我的 Android 知識梳理系列:
- Android 知識梳理目錄:www.jianshu.com/p/fd82d1899…
- 個人主頁:lizejun.cn
- 個人知識總結目錄:lizejun.cn/categories/