1. 程式人生 > >Android記憶體優化大全(全)

Android記憶體優化大全(全)

如上圖大家可以看到,hierarchyviewer可以非常清楚的看到當前檢視的層級結構,並且可以檢視檢視的執行效率(檢視上的小圓點,綠色表示流暢,黃色和紅色次之),所以我們可以很方便的檢視哪些view可能會影響我們的效能從而去進一步優化它。

hierarchyviewer還提供另外一種列表式的檢視方式,可以檢視詳細的螢幕畫面,具體到畫素級別的問題都可以通過它發現。

ViewStub標籤

此標籤可以使UI在特殊情況下,直觀效果類似於設定View的不可見性,但是其更大的意義在於被這個標籤所包裹的Views在預設狀態下不會佔用任何記憶體空間。

include標籤

可以通過這個標籤直接載入外部的xml到當前結構中,是複用UI資源的常用標籤。

merge標籤

它在優化UI結構時起到很重要的作用。目的是通過刪減多餘或者額外的層級,從而優化整個Android Layout的結構。

注意:靈活運用以上3個標籤可以有效減少檢視層級,具體使用大家可以上網搜搜)

佈局用Java程式碼比寫在XML中快

一般情況下對於Android程式佈局往往使用XML檔案來編寫,這樣可以提高開發效率,但是考慮到程式碼的安全性以及執行效率,可以通過Java程式碼執行建立,雖然Android編譯過的XML是二進位制的,但是載入XML解析器的效率對於資源佔用還是比較大的,Java處理效率比XML快得多,但是對於一個複雜介面的編寫,可能需要一些套嵌考慮,如果你思維靈活的話,使用Java程式碼來佈局你的Android應用程式是一個更好的方法。

重用系統資源:

1. 利用系統定義的id

比如我們有一個定義ListView的xml檔案,一般的,我們會寫類似下面的程式碼片段。

  1. <ListView
  2.     android:id="@+id/mylist"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"/>

這裡我們定義了一個ListView,定義它的id是"@+id/mylist"。實際上,如果沒有特別的需求,就可以利用系統定義的id,類似下面的樣子。

  1. <ListView
  2.     android:id="@android:id/list"
  3.     android:layout_width
    ="fill_parent"
  4.     android:layout_height="fill_parent"/>
在xml檔案中引用系統的id,只需要加上“@android:”字首即可。如果是在Java程式碼中使用系統資源,和使用自己的資源基本上是一樣的。不同的是,需要使用android.R類來使用系統的資源,而不是使用應用程式指定的R類。這裡如果要獲取ListView可以使用android.R.id.list來獲取。

2. 利用系統的圖片資源

這樣做的好處,一個是美工不需要重複的做一份已有的圖片了,可以節約不少工時;另一個是能保證我們的應用程式的風格與系統一致。

3. 利用系統的字串資源

如果使用系統的字串,預設就已經支援多語言環境了。如上述程式碼,直接使用了@android:string/yes和@android:string/no,在簡體中文環境下會顯示“確定”和“取消”,在英文環境下會顯示“OK”和“Cancel”。

4. 利用系統的Style

 假設佈局檔案中有一個TextView,用來顯示視窗的標題,使用中等大小字型。可以使用下面的程式碼片段來定義TextView的Style。

  1. <TextView
  2.         android:id="@+id/title"
  3.         android:layout_width="wrap_content"
  4.         android:layout_height="wrap_content"
  5.         android:textAppearance="?android:attr/textAppearanceMedium"/>
其中android:textAppearance="?android:attr/textAppearanceMedium"就是使用系統的style。需要注意的是,使用系統的style,需要在想要使用的資源前面加“?android:”作為字首,而不是“@android:”。

5. 利用系統的顏色定義

除了上述的各種系統資源以外,還可以使用系統定義好的顏色。在專案中最常用的,就是透明色的使用。

  1. android:background ="@android:color/transparent"

除了上面介紹的以外還有很多其他Android系統本身自帶的資源,它們在應用中都可以直接使用。具體的,可以進入android-sdk的相應資料夾中去檢視。例如:可以進入$android-sdk$\platforms\android-8\data\res,裡面的系統資源就一覽無餘了。

開發者需要花一些時間去熟悉這些資源,特別是圖片資源和各種Style資源,這樣在開發過程中,能重用的儘量重用,而且有時候使用系統提供的效果可能會更好。


其他小tips:

1. 解析度適配-ldpi,-mdpi, -hdpi配置不同精度資源,系統會根據裝置自適應,包括drawable, layout,style等不同資源。

2.儘量使用dp(density independent pixel)開發,不用px(pixel)。

3.多用wrap_content, match_parent

4.永遠不要使用AbsoluteLayout

5.使用9patch(通過~/tools/draw9patch.bat啟動應用程式),png格式

6.將Acitivity中的Window的背景圖設定為空。getWindow().setBackgroundDrawable(null);android的預設背景是不是為空。

7.View中設定快取屬性.setDrawingCache為true。


Desgin Review(設計檢查):

Desgin Review主要側重檢查一下程式的設計是否合理,包括框架的設計,介面的設計,邏輯的設計(其實這些東西開發之前就應該想好了)

框架設計:

是否定義了自己的Activity和fragment等常用控制元件的基類去避免進行重複的工作

是否有完善的異常處理機制,即使真的出現OOM也不會直接崩潰導致直接退出程式

介面設計:

1.在檢視中載入你所需要的,而不是你所擁有。因為使用者不可能同時看到所有東西。最典型的例子就是ListView中的滑動載入。

2.如果資料特別大,此時應該暗示使用者去點選載入,而不是直接載入。

3.合理運用分屏,轉屏等,它是個雙刃劍,因為它即可以使程式更加美觀功能更加完善,但也相應增加了資源開銷。

邏輯設計:

避免子類直接去控制父類中內容,可以使用監聽等方式去解決

關於這三點由於我工作經驗比較少,加上一時半會也想不出來多少,如果大家有建議希望可以留言,之後我給加進去。

寫在最後:

到此ANDROID記憶體優化上、中、下三篇全部寫完了。

最初寫這篇文章的原因是因為我拿到一個國外大牛演講的PPT,我看過之後感覺寫的非常好,於是想按照ppt的思路將其總結一下。結果到寫的時候發現困難重重,因為記憶體本來就是很理論的東西,很多都是靠經驗的。而我的經驗幾乎可以忽略,寫的東西完全是網上各路文章的大彙總(所以大家千萬不要叫我大神,我只是大神的搬運工。。。)

雖然如此我覺得我總結和蒐集的還算比較全面的,當然也有很多遺落也可能有很多錯誤,這個就希望大家一起幫著完善一下。

最後我把這個PPT的原件附上,裡面很多高階的東西我沒看懂(比如那個5R中其實是沒有Review的,原文是Reorder,由於這部分我看不懂而且找不到很好的資料只能自己換了一個Review),各路大神有興趣可以看看,如果可以的話寫出來分享一下。

最後小嘮叨一下,我最近參加了devstore網站的一個小比賽,所以blog先停更一個月,十一之後接著寫。

在這段時間裡我正好也可以休息一下想想以後寫點什麼東西。像記憶體這種偏理論的東西我還是不要碰了,以後可能會多翻譯一些國外大神的文章和自己做的一些小Demo吧。

不知不覺Blog也寫了快半年了,越來越覺得Blog這種分享精神的重要性,因為只有分享才能收穫