Android性能優化方案詳情
前言:
上一個季度在百度工作挺忙碌,在最後期限完成瞭OKR
目標,因此有一段時間沒有寫文章。今天趁有機會想分享下在大型Android
項目工程內的一些性能優化方式。
1、指標
量化性能的指標有很多,但最重要的就是以下5種:
- 包大小
- 響應時間
- 內存
- CPU
- 耗電量
優化性能就是可以從以上5點入手。
2、包大小優化
顧名思義就是減少apk
包體積大小,apk
大小主要取決於res下的資源文件、.class
文件,
具體優化措施有:
壓縮圖片大小,再在項目中使用。
在AndroidStudio
內,可以將png等格式的圖片壓縮為.webp
格式,這可以進一步減少圖片大小。
盡可能地減少本地資源的使用,可從技術方案上考慮從服務端拉取圖片、lottie
、so庫等資源。
利用lottie
替換幀動畫的使用,減少幀動畫圖片資源的使用。
利用混淆刪除無用代碼,減少dex文件大小。
3、響應時間優化
對用戶來說,響應時間自然越短越好。響應時間越短,操作也就越順暢。
響應速度包括啟動速度——點擊APP按鈕到APP首頁完全打開的過程盡可能快、頁面響應速度——用戶執行點擊、滑動等操作後,頁面能快速響應。APP不能產生卡頓、更不能出現ANR。
具體優化措施有:
- 耗時操作應放入子線程進行處理,不能阻塞主線程。
- SDK等資源應采用懶加載方式,需要時才進行加載,不需要時可不必加載。
- 線上環境避免打印大量的日志。
- 使用
BitmapFactory.Option
的inBitmap
變量,來復用舊的Bitmap
,避免為新Bitmap
多次分配內存以及銷毀舊Bitmap
(如果該Bitmap使用頻率高的話)
優化view視圖渲染時間:
①若view
視圖比較復雜,可考慮使用ConstraintLayout
約束佈局,減少視圖渲染的層級。
②若view視圖比較簡單,優化考慮使用LinearLayout
水平佈局(因為LinearLayout的渲染時間比ConstraintLayout、RelativeLayout都要短)。
③避免過度渲染,如果有多個view
的背景重疊在一起,可以考慮去掉底層被覆蓋的view;主題theme可以設置為NoBackground模式。
④若view
視圖在需要時才被創建,使用ViewStub
控件。
recyclerview列表控件優化:
①item
的view
視圖優化,同第4點。
②增加recyclerview
的item
緩存數量,將網絡請求的數據緩存,避免二次請求網絡。
③在onBindViewHolder
避免執行耗時操作,因為onBindViewHolder
是在主線程執行,onBindViewHolder
加耗時操作會影響滑動流暢度。
④如果不需要recyclerview
的默認動畫,刪除。(如刷新時閃爍的動畫效果)
⑤recyclerview
刷新時盡量使用局部刷新,避免全局刷新。
查看view
是否過度渲染可在手機開發者模式開啟以下設置:
4、內存優化
減少內存的使用,主要是避免創建過多對象占用過多內存、避免內存抖動以及避免內存泄漏。
內存抖動即頻繁地創建和銷毀內存,在這個過程中,垃圾回收器也會頻繁工作,對內存性能造成影響。
內存泄漏即應該被GC回收的內存,由於還在被其他對象引用,導致無法被回收。內存泄漏是比較嚴重的問題,過多的內存泄漏會導致內存溢出,產生OOM的系統錯誤。
造成內存泄漏的原因主要有:
- 單例類引用
Context
造成內存泄漏。 - 非靜態內部類引用外部類造成內存泄漏。
handler
引用activity
造成內存泄漏。- 屬性動畫沒有取消,導致
view
一直被引用造成內存泄漏。 - 監聽器沒有取消、回調沒有反註冊。
內存優化的措施有:
- 使用線程池復用線程,因為線程本身會占用相對比較大的內存,復用就可以省下部分內存。
- 在
onDraw
方法內避免創建對象。因為onDraw
會被頻繁調用,導致其內部的對象也會被頻繁創建,占用過多內存。 - 盡量使用
StringBuilder
或StringBuffer
拼接字符串,減少String
的使用。(因為拼接字符串時,String
會創建新的對象,而StringBuilder
、StringBuffer
是在原字符串基礎上拼接) - 視圖資源不可見時進行清除,避免占用內存。如Bitmap執行
.recycle
方法進行清除、對圖片和lottie資源進行銷毀。
針對內存泄漏的問題進行優化:
①單例類應引用Application
的Context
,因為Application
的Context的生命周期是和APP一致的,不會造成單例類引用某個activity
的context以致該activity無法被回收的問題。
②將非靜態內部類改為靜態內部類,這樣就不會引用外部類。
③handler:a.handler
使用結束時調用removeCallbacksAndMessages
(null)清除隊列;b.靜態內部類+弱引用方式可避免內存泄漏。
static class SafeHandler extends Handler { WeakReference<MainActivity> activity; public SafeHandler(MainActivity mainActivity) { activity = new WeakReference<MainActivity>(mainActivity); } @Override public void handleMessage(Message msg) { } }
④屬性動畫、監聽器使用結束應及時取消,廣播或其他一些外部庫的回調應該及時反註冊。
5、CPU優化
CPU的作用是計算處理信息、運行程序,因此優化的方向就是減少CPU計算的工作,提升CPU的計算效率。
具體的優化措施有:
- 避免主線程執行耗時任務,耗時任務在子線程異步執行。
- 避免在
onDraw
方法裡執行大量耗時操作。 - 暫時不需要用到的信息進行懶加載、延遲初始化。
6、耗電量優化
優化的措施有:
- 避免頻繁進行網絡請求。
- 避免任務被頻繁執行,可以等任務形成一定數量時,再一起執行。
- 避免應用頻繁喚醒屏幕。(頻繁喚醒屏幕會導致系統無法進入休眠,耗電量大)
保證性能指標不下降一直是開發過程中的重中之重,如果由於開發新功能導致出現卡頓、機身發熱耗電量猛增、內存增大等性能問題,那樣反而會流失用戶,得不償失。因此關註性能也是RD們的一項隱形工作。希望這篇文章能對大傢有所幫助。
到此這篇關於Android性能優化方案詳情的文章就介紹到這瞭,更多相關Android性能優化方案內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Android內存泄漏導致原因深入探究
- 淺談Android性能優化之內存優化
- Android跟隨手指移動的控件demo實例
- Android入門教程之RecyclerView的具體使用詳解
- Java中的內存泄露問題和解決辦法