1. 程式人生 > >Android 常見的效能優化

Android 常見的效能優化

其實說白了, 效能優化主要就是圍繞如下四個方面去進行擴充套件和探索:

1, 快 --- 速度快

2, 穩 --- 穩定, 不動不動就 crash

3, 省 --- 省記憶體, 省電量,流量

4, 小 --- APK小

於是乎, 本文也圍繞如上 四個 方向, 從三個方面入手, 總結看過的書籍和部落格中所說到的效能優化的手段.

1, 佈局優化

  • 儘可能減少佈局巢狀, 佈局樹不要超過 10 層, 其系統已經嵌套了 3 層 (DecorView一層, DecorView 的 子 view 是一個 垂直的 LinearLayout 一層, 然後是擺放我們的 xml 檔案的 contentLayout 一層).
  • 使用 google 最新的 約束佈局, 效能比 相對佈局高 40%(官方描述), 有效減少佈局層級.
  • 使用 <include> 標籤實現佈局複用 ,注意: 如果被 include 的佈局指定了 id, 同時 include 標籤也指定了 id, 以 include 標籤為準.   
  • 配合 <merge> 使用, 用來去除重複的佈局巢狀.
  • 使用 viewStub 來進行延時載入, 其效率要比 gone 高, gone 僅僅是 view 不顯示也不佔用大小, 但是依然會得到初始化,  viewStub 就不會.

2, 繪製優化

  • 在設定中開啟過渡繪製顯示, 螢幕上面會顯示出不同的顏色, 無色沒有過渡繪製,   藍色-- 1,  綠色 -- 2,  淺紅色 -- 3, 深紅色 -- 4,  要儘量減少紅色區域, 使藍色區域最大化.
  • 不要在 onDraw 方法中建立區域性變數, 不要執行上千次迴圈, 不要耗時!!
  • 關於如何減少過渡繪製, 主要的思路是, 如果一個 view 設定了一些需要繪製的屬性, 比如 viewGroup 的背景, 但是卻又看不到時, 比如子 view 全屏顯示, 那麼就無需設定 viewGroup 的背景從而導致不必要的繪製.

3, 記憶體優化

  • 常量設定為 static.
  • 在必要的場景可以使用多程序開發.
  • 在 onTrimMemory 方法中獲取到程序 UI 隱藏時的資訊, 從而釋放掉一部分 UI 佔用的記憶體.
  • 記憶體洩露問題, 常見的有動畫播放, 匿名內部類, 通過靜態欄位持有 activity 的 context 等方面, 都會導致記憶體洩露.
  • 慎用 列舉 , 但是在必要的場景也可以使用, 比如一組相互關聯的常量. 對於其他情況, 可使用常量和自定義註解來替換列舉.
  • 對於 recyclerView 這類可能會展示較多 bitmap 的元件, 合理的使用快取機制, 或者使用較為成熟的圖片載入框架, 如 Glide.
  • 可以通過重寫 activity 的 onTrimMemory 方法來獲取當前程序的記憶體狀態, 我們可以根據系統傳入的狀態資料, 來判斷程序是否很有可能被殺死, 如果可能, 我們可以儘量釋放不是必須的記憶體佔用, 減少記憶體消耗, 從而提高不被殺死的機率.

3, 其他優化

  • 使用 ProGuard 來剔除不需要的程式碼.
  • 使用 zipAlign 來對 APK 進行 4 位元組對其, 能夠稍微減少 apk 體積.
  • 不要建立大量的 services, 如果 services 任務執行完成後要及時 destroy, 較好的手段是使用 intentServices.
  • 使用 Android 中特有的資料結構如 SparseArray, 其在某些場景下可以替換 HashMap, 其實現原理是關聯陣列, 取消了對基本資料型別的裝箱和拆箱的過程, 因此效率較高.
  • 使用過的 File , Cursor 等其他資源都要及時關閉.
  • 對於不必要設定成 private 的欄位可以直接 暴露, 避免多次不必要的函式呼叫開銷.

對於電量, 流量方面的優化, 有待後續研究....