Android 性能優化篇

本篇從多個部分分析性能優化(更新中。。。):數據庫

  • 崩潰優化
  • 存儲優化
  • 內存優化
  • 卡頓優化
  • 啓動優化
  • IO 優化
  • 網絡優化
  • 耗電優化
  • UI 優化
  • 包體積優化

內存優化

常見的內存問題:內存泄漏 + OOM(內存溢出)
內存泄漏:對象使用完沒有釋放,也就是內存再也不使用了可是 GC 卻不回收。
OOM:內存佔用超過了 Android 系統給 app 分配的最大內存。緩存

其中,內存泄漏若是一直增大也會形成 OOM。性能優化

內存泄漏

會形成:卡頓
緣由有:網絡

  1. 代碼中出現了 GC Root。GC 不會回收被 GC Root 直接或者間接引用的對象。
  2. 集合類,使用後沒有釋放。
  3. 資源對象使用後未關閉
常見的 GC Root:
  • 運行中的線程
  • 靜態對象
  • native 對象指向的引用
運行中的線程

如線程、AsyncTask、Handler 持有了 Activity 引用,當 Activity 銷燬時,線程任務沒有處理完,繼續運行。那麼 Activity 對象就不會被回收。
解決辦法:app

  1. 給線程設置終止條件,當持有的 Activity 銷燬時,中止線程。
  2. 將線程聲明爲 static。
  3. Activity 銷燬時,handler 清空消息隊列,再也不處理未處理的消息了。
靜態對象

待完善...ide

集合類,使用後沒有釋放

集合使用完,清空。佈局

資源對象使用後未關閉
  • 廣播沒有註銷
  • 文件流未關閉
  • 數據庫遊標沒有關閉
  • Bitmap 沒有回收
  • 無線循環動畫沒有中止

OOM

除了內存泄漏會形成 OOM,部分低端設備內存小,Bitmap 也是一個常見緣由。儘量減小 Bitmap 的內存佔用。性能

解決辦法
  • 設備分級
  • Bitmap 優化
設備分級

對於低端設備,能夠關閉複雜的動畫、使用 565 格式圖片、使用更小的緩存。
設備分級策略:device-year-class 會根據手機的內存、CPU 核心數和頻率等信息決定設備屬於哪個年份。學習

Bitmap 優化
  • 使用完釋放
  • 根據分辨率,縮放圖片
  • 按需選擇合適的解碼方式
  • 對圖片進行緩存

對圖片進行緩存優化

三級緩存機制:內存緩存、本地緩存、網絡緩存。

使用 Glide 庫加載圖片,Glide 對處理圖片作了不少方面優化(LruCahce、DiskLruCache、生命週期集成、Bitmap 複用和主動回收等);


UI 優化

  • 下降 view.onDraw() 的複雜度
  • 避免過分繪製
  • 其餘優化方案

下降 view.onDraw() 的複雜度

  1. 不要建立新的局部變量,由於 onDraw() 可能會被頻繁調用,致使頻繁 GC,下降程序執行效率
  2. onDraw() 避免執行大量耗時操做,Google 官方性能標準 View 的最佳繪製頻率 = 60fps,每幀繪製 < 16ms

避免過分繪製

屏幕上某個像素,在同一幀的時間內,被繪製屢次。

  1. 下降嵌套層級,使用約束佈局。
  2. 移除控件中沒必要要的背景

其餘優化方案

使用 OpenGL 繪圖(這個學習成本高)。

相關文章
相關標籤/搜索