在Android優(yōu)化從以下四個方面優(yōu)化:
1.穩(wěn)定(內(nèi)存溢出涩僻、崩潰)
2.流暢(卡頓)
3.耗損(耗電、流量乾戏、網(wǎng)絡(luò))
4.安裝包(APK瘦身)
一今野、內(nèi)存優(yōu)化
避免內(nèi)存泄漏
內(nèi)存泄漏就是長的生命周期對象持有短的生命周期對象!
長的生命周期:耗時操作
短的生命周期:Activity刑桑、Fragment
少量的內(nèi)存泄漏會導(dǎo)致卡頓,內(nèi)存泄漏嚴(yán)重會導(dǎo)致OOM
內(nèi)存抖動
短時間內(nèi)內(nèi)存泄漏嚴(yán)重,頻繁觸發(fā)GC(GC觸發(fā)的時候會阻塞主線程戚啥,會導(dǎo)致界面卡頓,如果GC來不及回收就導(dǎo)致OOM)
GC的觸發(fā)是不定時的锉试,由Java虛擬機控制猫十,但是內(nèi)存不足的時候一定會觸發(fā)
1.1 解決內(nèi)存泄漏
避免常見的內(nèi)存泄漏
Handle導(dǎo)致的內(nèi)存泄漏:
1、發(fā)送延時消息時呆盖,當(dāng)Activity銷毀拖云,Handle沒有移除任務(wù),會造成內(nèi)存泄漏
2应又、匿名內(nèi)部類導(dǎo)致的內(nèi)存泄漏
解決方案:
使用弱引用WeakReference<OnReceiveMessageListener>包裹對象
將匿名內(nèi)部類用Static修飾宙项,變成靜態(tài)內(nèi)部類
線程導(dǎo)致的內(nèi)存泄漏:
開啟了一個線程做耗時操作,當(dāng)Activity銷毀的時候丁频,想成任務(wù)沒有結(jié)束杉允,就造成了線程的內(nèi)存泄漏
解決方案:
1.在onDestory方法中將線程close掉
2.將線程改為靜態(tài)內(nèi)部類
三方控件未注銷:
1、EventBus注冊卻沒有注銷造成的內(nèi)存泄漏
在onDestory中取消注冊
2席里、RxJava進行耗時操作叔磷,如果沒有解綁會出現(xiàn)內(nèi)存泄漏
在onDestory中使用Disposable對象移除任務(wù)
MVP存在內(nèi)存泄漏:
因為context對象使用不當(dāng)造成的內(nèi)存泄漏
錯誤的使用單例:
在單例中經(jīng)常使用到上下文對象,通常傳的都是Activity的上下文對象
但當(dāng)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標(biāo)簽秕狰,打開工具可以看見較淺藍色代表free的內(nèi)存,而深色的部分代表使用的內(nèi)存從內(nèi)存變換的走勢圖變換躁染,可以判斷關(guān)于內(nèi)存的使用狀態(tài)鸣哀,例如當(dāng)內(nèi)存持續(xù)增高時,可能發(fā)生內(nèi)存泄漏吞彤;當(dāng)內(nèi)存突然減少時我衬,可能發(fā)生GC等
當(dāng)發(fā)生內(nèi)存泄漏的時候無法準(zhǔn)確的判斷內(nèi)存泄漏的地方
二、布局優(yōu)化:
- 布局復(fù)用饰恕,使用
<include>
標(biāo)簽重用layout挠羔; - 提高顯示速度,使用
<ViewStub>
延遲View加載埋嵌; - 減少層級破加,使用
<merge>
標(biāo)簽替換父級布局; - 注意使用wrap_content雹嗦,會增加measure計算成本范舀;
- 刪除控件中無用屬性合是;
三、啟動優(yōu)化:
應(yīng)用一般都有閃屏頁尿背,優(yōu)化閃屏頁的 UI 布局端仰,可以通過 Profile GPU Rendering 檢測丟幀情況。
也可以通過啟動加載邏輯優(yōu)化田藐±笊眨可以采用分布加載、異步加載汽久、延期加載策略來提高應(yīng)用啟動速度鹤竭。
數(shù)據(jù)準(zhǔn)備。數(shù)據(jù)初始化分析景醇,加載數(shù)據(jù)可以考慮用線程初始化等策略臀稚。