Android應用效能調優的技術點
阿新 • • 發佈:2019-01-08
下面是收集的一些Android應用效能調優點:
使用執行緒時要做好執行緒控制;使用佇列、執行緒池
謹慎使用糟糕的AysncTask、Timer
警惕非同步任務引起的記憶體洩露
應該非同步任務分類,比如HTTP,圖片下載,檔案讀寫,每一類的非同步任務維護一個任務佇列,而不是每一個任務都開一個執行緒(Volley表示我一個可以搞定這些全部 _(:з」∠)_)
這些常用的任務應該做好優先順序處理(一般JSON資料優先於圖片等靜態資料的請求)
一般非同步任務應該開啟一個SingleAsyncTask,保證一時只有一個執行緒在工作
HTTP和圖片下載儘量使用同一套網路請求
使用MVP模式規範大型Activity類的行為,避免非同步任務造成的記憶體洩露
瞭解虛擬機器記憶體回收機制
頻繁GC也會造成卡頓,避免不必要的記憶體開銷
錯誤的引用姿♂勢造成的記憶體洩露(啊~要洩了~)
常見的Activity洩露(單例、Application、後臺執行緒、無限動畫、靜態引用)
Bitmap洩露(HoneyComb這個問題之前壓力好大)
儘量使用IntentService代替Service,前者會自動StopItself
排查記憶體洩露問題的方法(我一直以來都是簡單暴力的人肉dump檢查大法)
使用LeakCanary自動檢查Activity洩露問題
對記憶體負載要保持敏感(Sharp)
使用ViewStub避免不必要的LayoutInflate,使用GONE代替重複LayoutInflate同一個佈局
避免過度繪製,應該減少不必要的佈局背景;佈局層次太深會造成過度繪製以及Measure、Layout等方法時間複雜度的指數增長
使用過渡動畫,比如給圖片的呈現加一個輕量的淡入效果會讓視覺上變得流暢許多
避免過度的動畫,不要讓一個介面同時出現多出動畫,比如List滾動時Item項要停止播放動畫或者GIF
複雜動畫使用SurfaceView或TextureView
儘量提供多套解析度的圖片,使用向量圖
複用convertView,用ViewHolder代替頻繁findViewById
不要重複setListener,要使用v.getId來複用Listener,不然會建立一堆Listener導致頻繁GC
多佈局要採用MutilItemView,而不是使用一個大布局然後動態控制需要現實的部分
不要在getView方法做做耗時的操作
快速滾動列表的時候,可以停止載入列表項的圖片,停止列表項的動畫,不要在這時候改變列表項的佈局
儘量用RecyclerView(增量Notify和RecycledViewPool帶你飛)
儘量使用int,而不是float或者double
儘量採用基本型別,避免無必要的自動裝箱和拆箱,浪費時間和空間
選用合適的集合類(儘量以空間換時間)、選用Android家的SparseArray,SparseBooleanArray和LongSparseArray
避免建立額外的物件(StringBuilder)
使用SO庫完成一些比較獨立的功能(高斯模糊)
預處理(提前操作)一些比較耗時的初始化工作統一放到啟動圖處理
懶載入(延遲處理)規避Activity的敏感生命週期
Log工具類,要在編譯時刪掉除錯程式碼,而不是在執行時通過判斷條件規避
優先使用靜態方法、公有方法還是私有方法?速度區別很大哦
類內部直接對成員變數進行操作,不要使用getter/setter方法,呼叫方法耗額外的時間
給內部類訪問的外部類成員變數要宣告稱包內可訪問,而不是私有,不然編譯的時候還是會自動建立用於訪問外部類成員變數的方法
遍歷集合時,使用i++代替Iterator,後者需要額外的物件操作,應在迴圈體內避免這種情況
如果一個基本型別或者String的值不會改變,儘量用final static,編譯時會直接用變數的值替換變數,也就不需要在查詢變數的值了
資料庫優化:使用索引、使用非同步執行緒
網路優化 …… 一堆優秀的輪子
避免過度使用依賴注入框架,大量的反射
不過過度設計/抽象,多型看起來很有設計感,代價就是額外的程式碼、空間、時間
儘量不要開啟多程序,程序的開銷很大
使用zipalign工具優化APK
適當有損圖片壓縮、使用向量圖
刪除專案中冗餘的資源,之前寫過一些刪除沒有res資源的指令碼
動態載入模組化,專案拆分啊!
過度繪製顏色,嗯,不要一篇姨媽紅就好
LeakCanary,自動檢測Activity洩露,挺好用的
TraceView(Device Monitor),Systrace,分析哪些程式碼佔用的CPU時間太大,屢試不爽
Lint,檢查不合理的res資源
layoutopt(還是optlayout?),對當前佈局提出優化建議,已被lint替代,但是還能用
HierarchyViewer,檢視手機當前介面的佈局層次,佈局優化時常用(只用於模擬器,真機上用要ROOT,不想ROOT加得使用ViewServer)
StrictMode,UI操作、網路操作等容易出現效能問題的地方,如果出現異常情況StrictMode會報警
使用非同步
保持APP的高度響應,不要在UI執行緒做耗時操作,多使用非同步任務使用執行緒時要做好執行緒控制;使用佇列、執行緒池
謹慎使用糟糕的AysncTask、Timer
警惕非同步任務引起的記憶體洩露
應該非同步任務分類,比如HTTP,圖片下載,檔案讀寫,每一類的非同步任務維護一個任務佇列,而不是每一個任務都開一個執行緒(Volley表示我一個可以搞定這些全部 _(:з」∠)_)
這些常用的任務應該做好優先順序處理(一般JSON資料優先於圖片等靜態資料的請求)
一般非同步任務應該開啟一個SingleAsyncTask,保證一時只有一個執行緒在工作
HTTP和圖片下載儘量使用同一套網路請求
使用MVP模式規範大型Activity類的行為,避免非同步任務造成的記憶體洩露
避免記憶體洩露
頻繁GC也會造成卡頓,避免不必要的記憶體開銷
錯誤的引用姿♂勢造成的記憶體洩露(啊~要洩了~)
常見的Activity洩露(單例、Application、後臺執行緒、無限動畫、靜態引用)
Bitmap洩露(HoneyComb這個問題之前壓力好大)
儘量使用IntentService代替Service,前者會自動StopItself
排查記憶體洩露問題的方法(我一直以來都是簡單暴力的人肉dump檢查大法)
使用LeakCanary自動檢查Activity洩露問題
對記憶體負載要保持敏感(Sharp)
檢視優化
佈局優化、減少層次,Include Merge使用ViewStub避免不必要的LayoutInflate,使用GONE代替重複LayoutInflate同一個佈局
避免過度繪製,應該減少不必要的佈局背景;佈局層次太深會造成過度繪製以及Measure、Layout等方法時間複雜度的指數增長
使用過渡動畫,比如給圖片的呈現加一個輕量的淡入效果會讓視覺上變得流暢許多
避免過度的動畫,不要讓一個介面同時出現多出動畫,比如List滾動時Item項要停止播放動畫或者GIF
複雜動畫使用SurfaceView或TextureView
儘量提供多套解析度的圖片,使用向量圖
Adapter優化
不要重複setListener,要使用v.getId來複用Listener,不然會建立一堆Listener導致頻繁GC
多佈局要採用MutilItemView,而不是使用一個大布局然後動態控制需要現實的部分
不要在getView方法做做耗時的操作
快速滾動列表的時候,可以停止載入列表項的圖片,停止列表項的動畫,不要在這時候改變列表項的佈局
儘量用RecyclerView(增量Notify和RecycledViewPool帶你飛)
程式碼優化
演算法優化,減少時間複雜度,參考一些經典的優化演算法儘量使用int,而不是float或者double
儘量採用基本型別,避免無必要的自動裝箱和拆箱,浪費時間和空間
選用合適的集合類(儘量以空間換時間)、選用Android家的SparseArray,SparseBooleanArray和LongSparseArray
避免建立額外的物件(StringBuilder)
使用SO庫完成一些比較獨立的功能(高斯模糊)
預處理(提前操作)一些比較耗時的初始化工作統一放到啟動圖處理
懶載入(延遲處理)規避Activity的敏感生命週期
Log工具類,要在編譯時刪掉除錯程式碼,而不是在執行時通過判斷條件規避
優先使用靜態方法、公有方法還是私有方法?速度區別很大哦
類內部直接對成員變數進行操作,不要使用getter/setter方法,呼叫方法耗額外的時間
給內部類訪問的外部類成員變數要宣告稱包內可訪問,而不是私有,不然編譯的時候還是會自動建立用於訪問外部類成員變數的方法
遍歷集合時,使用i++代替Iterator,後者需要額外的物件操作,應在迴圈體內避免這種情況
如果一個基本型別或者String的值不會改變,儘量用final static,編譯時會直接用變數的值替換變數,也就不需要在查詢變數的值了
其他優化
網路優化 …… 一堆優秀的輪子
避免過度使用依賴注入框架,大量的反射
不過過度設計/抽象,多型看起來很有設計感,代價就是額外的程式碼、空間、時間
儘量不要開啟多程序,程序的開銷很大
APK瘦身
開啟混淆使用zipalign工具優化APK
適當有損圖片壓縮、使用向量圖
刪除專案中冗餘的資源,之前寫過一些刪除沒有res資源的指令碼
動態載入模組化,專案拆分啊!
效能問題的排查方法
GPU條形圖,沒事開來看看淘寶過度繪製顏色,嗯,不要一篇姨媽紅就好
LeakCanary,自動檢測Activity洩露,挺好用的
TraceView(Device Monitor),Systrace,分析哪些程式碼佔用的CPU時間太大,屢試不爽
Lint,檢查不合理的res資源
layoutopt(還是optlayout?),對當前佈局提出優化建議,已被lint替代,但是還能用
HierarchyViewer,檢視手機當前介面的佈局層次,佈局優化時常用(只用於模擬器,真機上用要ROOT,不想ROOT加得使用ViewServer)
StrictMode,UI操作、網路操作等容易出現效能問題的地方,如果出現異常情況StrictMode會報警