[Android 效能最佳化系列]布局篇之減少你的介面層級
在接下來的一段時間裡,我會每天翻譯一部分關於效能提升的Android官方文檔給大家
效能最佳化之布局篇:
[Android 效能最佳化系列]布局篇之通過複用布局
題外話:
複雜的布局,既會提高我們的設計難度,也會降低我們的代碼效率,因此,不放多使用一下相對布局什麼的。
下面是本次的本文:
################
大家寫布局檔案的時候都會認為只要使用基本布局能夠到達高效的結果,其實這是錯的。你要知道你添加到你應用中的每一個控制項和布局檔案都需要經過初始化,排列位置和繪製三個過程。比如說,使用嵌套的線性布局可能導致你的布局層級變得十分冗餘。此外,如果在嵌套的線性布局中使用了 layout_weight 參數的話,那麼他的每一個子 view 都需要被重新測量兩次。特別是當他們被用在 ListView 和 GridView 中時,他們會被反覆的測量。
在本文中,你將學習到如何使用 Hierarchy Viewer 以及 Layoutopt 來檢測和最佳化你的布局。
檢查你的布局
在 Android SDK 裡有一個叫做 HierarchyViewer 的工具,它可以協助你在應用正在啟動並執行時候分析你的布局。使用這個工具,能夠協助你發現布局效能方面的瓶頸。
HierarchyViewer 可以讓你從當前串連到電腦上的裝置或者模擬器上選擇一個進程,然後展示他的布局樹。並且他能夠將每個控制項在measure,layout 和 draw 的時候所花費的時間都顯示出來,從而協助你發現問題
舉例說,圖1展示了一個用作 ListView item 的布局,這個布局的左側是一張圖片,右側是兩層文本,你應該清楚在 ListView 中這個布局將被多次初始化
Hierarchyviewer工具存放的位置在/tools 下,當它被開啟以後,在 HierarchyViewer 會顯示一個當前裝置列表,以及所有正在啟動並執行組件。點擊Load View Hierarchy 可以查看選中組件的布局層級。比如說,圖2就顯示了圖1中所說的布局
在圖2中,你可以看見這裡有三層布局,點擊每一個元素,會和圖3一樣顯示他顯示到介面過程中每一步所消耗的時間。這使得我們能夠清楚的瞭解在測量,布局以及渲染階段你所花費的時間,你也會清楚,你應該從哪兒下手去最佳化他。
中顯示的時間是,測量0.977ms ,布局 0.167ms,繪製2.717ms
修正你的布局
從上面的布局資訊中,我們可以發現,嵌套的線性布局降低了我們的布局效率,因此我們可以通過將布局扁平化來提升效能。一個線性布局也可以製作成類似於上面的布局,因此,我們可以將布局轉變為使用線性布局,這樣一來布局就變成兩層了,檢查布局之後會發現他是這樣子的
現在渲染一個 item 所花費的時間為 測量0.598ms,布局0.110ms,繪製2.146ms
或許看起來這個沒有多大提升,但是你要知道這個 Item會在 listView 中被多次使用,反覆繪製.
其實大多數繪製時間差異是因為我們線上性布局中使用了 layout_weight,他會降低對布局的測量速度,當然這隻是你應該謹慎使用布局權重的原因之一。
使用 Lint
通常你可以在你的布局檔案中通過使用 Lint 來尋找可能的布局最佳化。Lint 現在已經代替了 Layoutopt,而且更有效率,下面是 Lint 的一些規則
1.盡量使用複合圖片,一個線性布局中如果包含一個 ImageView 和一個 TextView,那麼你可以使用複合圖片來替換
2.去掉不需要的根節點,如果一個 FrameLayout 是整個布局的根節點,並且他沒有提供背景,留白之類的東西,那麼我們可以使用 merge 標籤來讓他變得更有效
3.減少布局中的枝葉,如果一個布局沒有子 View 或者背景,那麼他可以被移除掉(況且他本身就是不可見的)來讓布局更有效
4.減少父母層級,如果一個布局沒有兄弟,並且他不是 ScrollView 或者根 View,並且也沒有背景,那麼他就可以直接被移除掉,他的孩子可以直接被移到他父母的層級下
5.避免過深的布局層級,多次嵌套的布局檔案不利於效能。你可以考慮通過相對布局或者網格布局來提升效能,預設的最深布局深度是10。
Lint 工具目前已經被合并到了 Android 開發工具裡了,他能夠在你對項目代碼做出更改之後自動運行。你可以通過 Eclipse 工具列上的按鈕來開閉他
當使用 Eclipse 的時候,Lint 能夠自動修複一些問題,並提供一些建議,你還可以直接通過點擊代碼跳轉到對應的布局檔案中。如果你沒有使用 Eclipse 作為開發環境,那你也可以通過命令列使用Lint ,更多的協助資訊,你可以參看tools.android.com