編輯:關於Android編程
在接下來的一段時間裡,我會每天翻譯一部分關於性能提升的Android官方文檔給大家
性能優化之布局篇:
[Android 性能優化系列]布局篇之通過
題外話:
復雜的布局,既會提高我們的設計難度,也會降低我們的代碼效率,因此,不放多使用一下相對布局什麼的。
下面是本次的正文:
################
大家寫布局文件的時候都會認為只要使用基本布局能夠到達高效的結果,其實這是錯的。你要知道你添加到你應用中的每一個控件和布局文件都需要經過初始化,排列位置和繪制三個過程。比如說,使用嵌套的線性布局可能導致你的布局層級變得十分冗余。此外,如果在嵌套的線性布局中使用了 layout_weight 參數的話,那麼他的每一個子 view 都需要被重新測量兩次。特別是當他們被用在 ListView 和 GridView 中時,他們會被反復的測量。
在本文中,你將學習到如何使用 Hierarchy Viewer 以及 Layoutopt 來檢測和優化你的布局。
檢查你的布局
在 Android SDK 裡有一個叫做 HierarchyViewer 的工具,它可以幫助你在應用正在運行的時候分析你的布局。使用這個工具,能夠幫助你發現布局性能方面的瓶頸。
HierarchyViewer 可以讓你從當前連接到電腦上的設備或者模擬器上選擇一個進程,然後展示他的布局樹。並且他能夠將每個控件在measure,layout 和 draw 的時候所花費的時間都顯示出來,從而幫助你發現問題
舉例說,圖1展示了一個用作 ListView item 的布局,這個布局的左側是一張圖片,右側是兩層文本,你應該清楚在 ListView 中這個布局將被多次初始化
Hierarchyviewer工具存放的位置在
在圖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
系統啟動過程圖: Framework層所有的Service都是運行在SystemServer進程中;SystemServer進程是由Zygote進程創建。 S
前不久看到鴻洋大大的圓形菜單,就想開始模仿,因為實在是太酷了,然後自己根據別人(zw哥)給我講的一些思路、一些分析,就開始改造自己的圓形菜單了。文章結構:1.功能介紹以及
寫在前面一家移動互聯網公司,說到底,要盈利總是需要付費用戶的,自己開發支付系統顯然是不明智的,國內已經有多家成熟的移動支付提供商,騰訊就是其中之一。梳理了下微信支付的接入
11. Android的數據存儲形式在Android中的數據存儲形式主要有以下幾種:SharedPreferrencesSharedPreferrences主要用於存儲一