(轉載)性能優化之佈局優化


來源:http://www.trinea.cn/android/layout-performance/html

本文爲Android性能優化的第二篇——佈局優化,主要介紹使用抽象佈局標籤(include, viewstub, merge)、去除沒必要要的嵌套和View節點、減小沒必要要的infalte及其餘Layout方面可調優勢,順帶說起佈局調優相關工具(hierarchy viewer和lint)java

 

性能優化專題已完成五部分:android

性能優化總綱——性能問題及性能調優方式
性能優化第三篇——Java(Android)代碼優化
性能優化第二篇——佈局優化
性能優化第一篇——數據庫性能優化數據庫

性能優化實例 緩存

 

一、抽象佈局標籤 安全

(1) <include>標籤
include標籤經常使用於將佈局中的公共部分提取出來供其餘layout共用,以實現佈局模塊化,這在佈局編寫方便提供了大大的便利。
下面以在一個佈局main.xml中用include引入另外一個佈局foot.xml爲例。main.mxl代碼以下:性能優化

 

(2) <viewstub>標籤
viewstub標籤同include標籤同樣能夠用來引入一個外部佈局,不一樣的是,viewstub引入的佈局默認不會擴張,即既不會佔用顯示也不會佔用位置,從而在解析layout時節省cpu和內存。
viewstub經常使用來引入那些默認不會顯示,只在特殊狀況下顯示的佈局,如進度佈局、網絡失敗顯示的刷新佈局、信息出錯出現的提示佈局等。
下面以在一個佈局main.xml中加入網絡錯誤時的提示頁面network_error.xml爲例。main.mxl代碼以下:ide

在java中經過(ViewStub)findViewById(id)找到ViewStub,經過stub.inflate()展開ViewStub,而後獲得子View,以下:

在上面showNetError()中展開了ViewStub,同時咱們對networkErrorView進行了保存,這樣下次不用繼續inflate。這就是後面第三部分提到的減小沒必要要的infalte。

viewstub標籤大部分屬性同include標籤相似。

 上面展開ViewStub部分代碼

 

(3) <merge>標籤
在使用了include後可能致使佈局嵌套過多,多餘沒必要要的layout節點,從而致使解析變慢,沒必要要的節點和嵌套可經過hierarchy viewer(下面佈局調優工具中有具體介紹)或設置->開發者選項->顯示佈局邊界查看。

 

merge標籤可用於兩種典型狀況:
a.  佈局頂結點是FrameLayout且不須要設置background或padding等屬性,能夠用merge代替,由於Activity內容試圖的parent view就是個FrameLayout,因此能夠用merge消除只剩一個。
b.  某佈局做爲子佈局被其餘佈局include時,使用merge看成該佈局的頂節點,這樣在被引入時頂結點會自動被忽略,而將其子節點所有合併到主佈局中。

以(1) <include>標籤的示例爲例,用hierarchy viewer查看main.xml佈局以下圖:

android include
能夠發現多了一層不必的RelativeLayout,將foot.xml中RelativeLayout改成merge,以下:

運行後再次用hierarchy viewer查看main.xml佈局以下圖:

android include2

這樣就不會有多餘的RelativeLayout節點了。

 

二、去除沒必要要的嵌套和View節點
(1) 首次不須要使用的節點設置爲GONE或使用viewstub
(2) 使用RelativeLayout代替LinearLayout
大約在Android4.0以前,新建工程的默認main.xml中頂節點是LinearLayout,而在以後已經改成RelativeLayout,由於RelativeLayout性能更優,且能夠簡單實現LinearLayout嵌套才能實現的佈局。
4.0及以上Android版本可經過設置->開發者選項->顯示佈局邊界打開頁面佈局顯示,看看是否有沒必要要的節點和嵌套。4.0如下版本可經過hierarchy viewer查看。

 

三、減小沒必要要的infalte
(1) 對於inflate的佈局能夠直接緩存,用所有變量代替局部變量,避免下次需再次inflate
如上面ViewStub示例中的

 

(2) ListView提供了item緩存,adapter getView的標準寫法,以下:

關於ListView緩存原理可見Android ListView緩存機制

 

四、其餘點
(1) 用SurfaceView或TextureView代替普通View
SurfaceView或TextureView能夠經過將繪圖操做移動到另外一個單獨線程上提升性能。
普通View的繪製過程都是在主線程(UI線程)中完成,若是某些繪圖操做影響性能就很差優化了,這時咱們能夠考慮使用SurfaceView和TextureView,他們的繪圖操做發生在UI線程以外的另外一個線程上。
由於SurfaceView在常規視圖系統以外,因此沒法像常規試圖同樣移動、縮放或旋轉一個SurfaceView。TextureView是Android4.0引入的,除了與SurfaceView同樣在單獨線程繪製外,還能夠像常規視圖同樣被改變。

 

(2) 使用RenderJavascript
RenderScript是Adnroid3.0引進的用來在Android上寫高性能代碼的一種語言,語法給予C語言的C99標準,他的結構是獨立的,因此不須要爲不一樣的CPU或者GPU定製代碼代碼。

 

(3) 使用OpenGL繪圖
Android支持使用OpenGL API的高性能繪圖,這是Android可用的最高級的繪圖機制,在遊戲類對性能要求較高的應用中獲得普遍使用。
Android 4.3最大的改變,就是支持OpenGL ES 3.0。相比2.0,3.0有更多的緩衝區對象、增長了新的着色語言、增長多紋理支持等等,將爲Android遊戲帶來更出色的視覺體驗。

 

(4) 儘可能爲全部分辨率建立資源

減小沒必要要的硬件縮放,這會下降UI的繪製速度,可藉助Android asset studio

 

五、佈局調優工具
(1) hierarchy viewer
hierarchy viewer能夠方便的查看Activity的佈局,各個View的屬性、measure、layout、draw的時間,若是耗時較多會用紅色標記,不然顯示綠色。
hierarchy viewer.bat位於<sdk>/tools/目錄下。使用可見:Using Hierarchy Viewer , 示例圖以下:

android hierarechy viewer

 標註: hierarchy viewer目前在發佈的商業版上處於安全考慮已經不可用:

To preserve security, Hierarchy Viewer can only connect to devices running a developer version of the Android system

  可參考http://lxfgrace.iteye.com/blog/1821869方案,just try

 

(2) layoutopt
layoutopt是一個能夠提供layout及其層級優化提示的命令行,在sdk16之後已經被lint取代,在Windows->Show View->Other->Android->Lint Warnings查看lint優化提示,lint具體介紹可見Improving Your Code with lint

 

來源:http://www.trinea.cn/android/layout-performance/

相關文章
相關標籤/搜索