前言:
前面兩篇文章主要是講關於activity、fragment生命週期方面的總結,這篇文章主要是總結在android應用開發過程的優化方案,還有一些常用的優化工具。優化的方向包括:啟動速度、介面流暢性、記憶體使用情況、apk體積、耗電量、流量等方面。
app啟動速度
1、通過style 設定一個預設的啟動圖來過度,從互動體驗上來提高啟動速度
2、分析application和首屏的業務邏輯非同步初始化第三方元件,防止阻塞主執行緒(或者延遲初始化(用的時候再初始化))
3、閃屏的2秒停頓可以利用起來,把一些耗時操作延遲到這裡來初始化
4、同工具DDMS中的TraceView來檢測耗時的點在哪裡,做針對的處理
5、mainActivity的onCreate流程,特別是UI的佈局與渲染操作,如果佈局過於複雜很可能導致嚴重的啟動效能問題;(可以考慮先把mainActivity需要的資料請求回來),根據首頁的結構可以考慮懶載入。
Android APP啟動優化:
wuxiaolong.me/2017/03/13/…
App啟動速度優化之耗時檢測處理:
www.jianshu.com/p/a0e242d57…
使用 TraceView 找到卡頓的元凶:
blog.csdn.net/u011240877/…
上面的幾篇文章基本上描述了應用的啟動流程,如何優化白屏,檢測耗時以及一些SDK的懶載入等等…
介面流暢性
1、談到UI流暢度,一般就是不要在主程式去做耗時的操作,提升UI的繪製速度(減少View的佈局層級,避免過渡繪製等)
2、merge、include、ViewStub標籤的合理使用減少佈局層級
3、自定義view的ondraw裡面不要做耗時的任務
Android UI效能優化實戰 :blog.csdn.net/lmj62356579…
效能優化之佈局優化:
www.trinea.cn/android/lay…
當然了對於UI卡頓,不可避免的要引入檢測的方案:
方式1:一般有監聽Looper的日誌
方式2、利用Choreographer
當然也相應的有一些開源工具:
github.com/markzhai/An… [方式1]
github.com/wasabeef/Ta… [方式2]
github.com/friendlyrob… [方式2]
記憶體優化
記憶體優化那麼主要就是去消除應用中的記憶體洩露、避免記憶體抖動。
1、安卓studio的記憶體分析工具 + mat可以很好的檢測記憶體抖動和記憶體洩露
2、常見的記憶體洩露情況:
● 單例:生命週期很長,會引用生命週期比較短的變數,導致無法釋放。例如activity洩露
● 靜態變數:同樣也是應為生命週期比較長
● 非靜態內部類建立靜態例項造成的記憶體洩漏
● handler記憶體洩露 (解決辦法:Handler 宣告為靜態的,則其存活期跟 Activity
的生命週期就無關了。同時通過軟引用的方式引入 Activity)
● 匿名內部類(匿名內部類會引用外部類,導致無法釋放,比如各種回撥)
● 資源使用完未關閉(BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap)
● 複用問題(bitmap釋放)
Android 記憶體優化總結&實踐:
mp.weixin.qq.com/s/2MsEAR9pQ…
Android記憶體優化之OOM:
hukai.me/android-per…
Android應用記憶體洩露分析、改善經驗總結:
zhuanlan.zhihu.com/p/20831913
apk體積優化
程式碼瘦身
● 移除無用程式碼、功能;
● 移除無用的庫、避免功能雷同的庫;
● 啟用Proguard;
● 縮減方法數;
●第三方開源庫的瘦身,僅保留自己需要的部分
資源瘦身
● 移除無用的資原始檔;
● Drawable目錄只保留一份資源;
● 對圖片進行壓縮;
● PNG轉換JPG;
● 使用向量圖;
● 使用WebP;
● 資源混淆;
● 資源線上化;
● 能不用圖片的就不用圖片實現,用程式碼實現
So瘦身
● 在允許的情況下,針對使用者機型分佈保留特定架構的So;
耗電量
電量是移動裝置非常寶貴的資源,作為一名開發者,有必要為使用者著想,減少電量的消耗.調查顯示通常只有30%左右的電量是被程式核心的功能所消耗,比如介面渲染,剩下的70%則是被上報資料,位置更新,後臺通知所消耗.
如何檢測?
1、手機選項中通過檢視APP的電量消耗的統計資料
2、使用Battery Historian Tool來檢視詳細的電量消耗
如何優化
●減少喚醒螢幕的次數與持續的時間,正確的使用WakeLock.
●延遲非必須的操作到充電狀態時,比如日誌上報完全可以在夜間充電時完成,這點可以結合JobScheduler使用
●使用感測器採集資料時,一旦不需要記得取消註冊.
●減少網路通訊,合併通訊.
●合理使用定位功能,減少位置更新頻率以及根據實際情況使用不同精度的定位需求
網路優化
現在App幾乎都需要聯網操作,做好網路優化一方面可以提高體驗,另一方面可以減少流量和電量的損耗.另外,無論是對使用者還是網路服務提供者,網路同樣是一種資源,任何開發者都不應該假設網路資源是無限制的
如何檢測
●使用Android Studio裡的Network Traffic Tools來檢視網路請求
●使用Android Studio中的Monitor,安卓studio3.0新的效能分析工具更方便
●使用Fidder或者Charles等抓包工具分析網路資料包
如何優化
●有必要的時候務必做好快取,無論是圖片還是普通的資料,使用LruCache和DiskLruCache構建自己的快取系統,並根據實際場景設計快取策略
●避免過度的網路同步,合併相關的網路請求
●根據實際場景確定請求策略,避免使用固定的間隔頻率來進行網路操作.比如連線WiFi並充電的情況下請求頻率可以高,第一次網路請求失敗後可以使用雙倍的時間間隔來進行下一次
●減少資料傳輸量,對傳輸的資料做壓縮.如果傳輸的是圖片,需要選擇合適的圖片格式以及根據顯示大小請求合適規格的圖片.對於普通資料,可以考慮使用ProtocalBuffers來減小傳輸資料的大小.