Android 效能優化
前幾年,Google 釋出了關於ofollow,noindex">Android 效能優化典範 的系列專題,幫助開發者建立更快更優秀的 Android App。課程專題不僅僅介紹了 Android 系統中有關效能問題的底層工作原理,同時也介紹瞭如何通過工具來找出效能問題以及提升效能的建議。
相關學習整理可以前往胡凱 大佬的部落格閱讀,感謝他的無私分享:
- Android 效能優化典範 - 第 1 季
- Android 效能優化典範 - 第 2 季
- Android 效能優化典範 - 第 3 季
- Android 效能優化典範 - 第 4 季
- Android 效能優化典範 - 第 5 季
- Android 效能優化典範 - 第 6 季
Android 的效能優化方法
佈局優化
- 刪除佈局中無用的元件和層級,有選擇地使用效能較低的 ViewGroup,如 RelativeLayout。
-
使用
<include>
標籤用於佈局檔案的重用,簡潔高效。 -
使用
<merge>
標籤和<include>
配合,可以減少佈局中的層級。 -
使用
<viewstub>
標籤,它具有按需載入的功能,當需要的時候才會將 ViewStub 中的佈局載入到記憶體,提高了程式的初始化效能。
繪製優化
-
View 的
onDraw
方法中不要建立新的區域性物件,因為onDraw
會被頻繁呼叫。 -
View 的
onDraw
方法中不要做耗時的任務,要求每幀繪製時間控制在 16 ms 以內。
記憶體洩漏優化
可能導致記憶體洩露的場景很多,例如靜態變數、單例模式、屬性動畫、AsyncTask 以及 Handler 等等,在使用的時候記得處理釋放。
響應速度優化和 ANR 日誌分析
- Android 規定:Activity 如果 5 秒內沒有響應螢幕觸控事件或者鍵盤輸入事件就會 ANR,而 BroadcastReceiver 如果 10 秒內沒有執行完操作也會出現 ANR。
-
當一個程序發生了 ANR 之後,系統會在
/data/anr
目錄下建立一個檔案traces.txt
,通過分析這個檔案就能定位ANR
的原因。
ListView 和 Bitmap 優化
-
ListView 優化:採用 ViewHolder 並避免在
getView
方法中執行耗時操作;根據列表的滑動狀態來控制任務的執行頻率;嘗試開啟硬體加速來使 ListView 的滑動更加流暢。 -
Bitmap 優化:主要是設定
BitmapFactory.Options
的inSampleSize
取樣率屬性來載入所需尺寸的圖片,詳情可參考Bitmap 的載入和 Cache
執行緒優化
採用執行緒池,避免程式中存在大量的 Thread,詳情可參考Android 的執行緒和執行緒池
一些優化建議
- 避免建立過多的物件
- 不要過多使用列舉,列舉佔用空間比整型大
-
常量儘量使用
static final
來修飾 -
使用一些 Android 特有的資料結構,比如
SparseArray
和Pair
等,它們都具有更好的效能 - 適當使用軟引用和弱引用
- 採用記憶體快取和磁碟快取
- 儘量採用靜態內部類,這樣可以避免潛在的由於內部類而導致的記憶體洩露
記憶體洩漏分析 MAT 工具
Eclipse Memory Analysis Tools (MAT) 是一個分析 Java堆資料的專業工具,用它可以定位記憶體洩漏的原因。