Android應用優化方案

最愛媽媽本尊發表於2019-03-02

前言:

前面兩篇文章主要是講關於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來減小傳輸資料的大小.

相關文章