在Android優(yōu)化從以下四個方面優(yōu)化:
1.穩(wěn)定(內(nèi)存溢出、崩潰)
2.流暢(卡頓)
3.耗損(耗電、流量、網(wǎng)絡)
4.安裝包(APK瘦身)
一、內(nèi)存優(yōu)化
避免內(nèi)存泄漏
內(nèi)存泄漏就是長的生命周期對象持有短的生命周期對象!
長的生命周期:耗時操作
短的生命周期:Activity、Fragment
少量的內(nèi)存泄漏會導致卡頓,內(nèi)存泄漏嚴重會導致OOM
內(nèi)存抖動
短時間內(nèi)內(nèi)存泄漏嚴重,頻繁觸發(fā)GC(GC觸發(fā)的時候會阻塞主線程,會導致界面卡頓,如果GC來不及回收就導致OOM)
GC的觸發(fā)是不定時的,由Java虛擬機控制,但是內(nèi)存不足的時候一定會觸發(fā)
1.1 解決內(nèi)存泄漏
避免常見的內(nèi)存泄漏
Handle導致的內(nèi)存泄漏:
1、發(fā)送延時消息時,當Activity銷毀,Handle沒有移除任務,會造成內(nèi)存泄漏
2、匿名內(nèi)部類導致的內(nèi)存泄漏
解決方案:
使用弱引用WeakReference<OnReceiveMessageListener>包裹對象
將匿名內(nèi)部類用Static修飾,變成靜態(tài)內(nèi)部類
線程導致的內(nèi)存泄漏:
開啟了一個線程做耗時操作,當Activity銷毀的時候,想成任務沒有結(jié)束,就造成了線程的內(nèi)存泄漏
解決方案:
1.在onDestory方法中將線程close掉
2.將線程改為靜態(tài)內(nèi)部類
三方控件未注銷:
1、EventBus注冊卻沒有注銷造成的內(nèi)存泄漏
在onDestory中取消注冊
2、RxJava進行耗時操作,如果沒有解綁會出現(xiàn)內(nèi)存泄漏
在onDestory中使用Disposable對象移除任務
MVP存在內(nèi)存泄漏:
因為context對象使用不當造成的內(nèi)存泄漏
錯誤的使用單例:
在單例中經(jīng)常使用到上下文對象,通常傳的都是Activity的上下文對象
但當Activity銷毀就會出現(xiàn)內(nèi)存泄漏
把Activity的上下文對象換成Application上下文對象
1.2 內(nèi)存泄漏檢測工具:
- LeakCanary工具 :
LeakCanary是一個內(nèi)存監(jiān)測工具,該工具是Square公司出品的,
可以很明確的看出內(nèi)存泄漏的地方
在Gradle里引用:
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.5'
- Memory Monitor 工具:
Memory Monitor是Android Studio自帶的一個內(nèi)存監(jiān)視工具,它可以很好地幫助我們進行內(nèi)存實時分析。通過點擊Android Studio右下角的Memory Monitor標簽,打開工具可以看見較淺藍色代表free的內(nèi)存,而深色的部分代表使用的內(nèi)存從內(nèi)存變換的走勢圖變換,可以判斷關于內(nèi)存的使用狀態(tài),例如當內(nèi)存持續(xù)增高時,可能發(fā)生內(nèi)存泄漏;當內(nèi)存突然減少時,可能發(fā)生GC等
當發(fā)生內(nèi)存泄漏的時候無法準確的判斷內(nèi)存泄漏的地方
二、布局優(yōu)化:
- 布局復用,使用
<include>標簽重用layout; - 提高顯示速度,使用
<ViewStub>延遲View加載; - 減少層級,使用
<merge>標簽替換父級布局; - 注意使用wrap_content,會增加measure計算成本;
- 刪除控件中無用屬性;
三、啟動優(yōu)化:
應用一般都有閃屏頁,優(yōu)化閃屏頁的 UI 布局,可以通過 Profile GPU Rendering 檢測丟幀情況。
也可以通過啟動加載邏輯優(yōu)化。可以采用分布加載、異步加載、延期加載策略來提高應用啟動速度。
數(shù)據(jù)準備。數(shù)據(jù)初始化分析,加載數(shù)據(jù)可以考慮用線程初始化等策略。