性能優(yōu)化:
1. 卡頓優(yōu)化
-
繪制問(wèn)題
-
布局復(fù)雜導(dǎo)致 -》 使用
hierarchy viewer
分析削彬。減少嵌套層級(jí),使用ViewStub延遲繪制忧风,去掉不必要的背景- 使用include默色、merge標(biāo)簽
- 盡量不嵌套使用RelativeLayout
- 在復(fù)雜布局界面使用ConstraintLayout
- 使用ViewStub標(biāo)簽延遲初始化View
- 去掉多余的background,少使用復(fù)雜shape
主線程耗時(shí)問(wèn)題導(dǎo)致 -》使用profiler分析卡頓點(diǎn)狮腿,采用異步的方式優(yōu)化
-
布局加載優(yōu)化腿宰。性能瓶頸主要在
LayoutInflater.inflate()
過(guò)程- XmlPullParser涉及到IO操作,布局越復(fù)雜缘厢,IO耗時(shí)越長(zhǎng)
- createView涉及到反射吃度,當(dāng)調(diào)用次數(shù)很頻繁的時(shí)候會(huì)有性能問(wèn)題
解決方案:
- AsyncLayoutInflater
- X2C 使用APT+JavaPoet技術(shù)做到編譯期將XML轉(zhuǎn)化為動(dòng)態(tài)加載視圖的Java代碼
-
-
內(nèi)存問(wèn)題(問(wèn)題根源是GC的時(shí)候stop the world導(dǎo)致所有線程掛起,出現(xiàn)卡頓問(wèn)題)
- 減少內(nèi)存抖動(dòng)贴硫,避免短時(shí)間內(nèi)大量創(chuàng)建與回收對(duì)象(如有需要椿每,可以使用對(duì)象池的方式)
- 使用leak canary分析,避免內(nèi)存泄漏問(wèn)題
- 資源未關(guān)閉
- 注冊(cè)對(duì)象未釋放
- 內(nèi)部類(lèi)持有外部類(lèi)強(qiáng)引用導(dǎo)致泄漏
- handler問(wèn)題
- 單例問(wèn)題
- 靜態(tài)變量持有大數(shù)據(jù)對(duì)象
- ThreadLocal使用不當(dāng)引起泄漏
- 線程池問(wèn)題英遭,使用了Executors
- 內(nèi)存空間優(yōu)化
- 使用對(duì)象引用(強(qiáng)軟弱虛引用)
- 數(shù)據(jù)類(lèi)型優(yōu)化(ArrayMap拖刃、SparseArray、Lrucache)
- Bitmap優(yōu)化
- 解析數(shù)據(jù)后存入緩存贪绘,不再每一次都重新解析一遍(具體表現(xiàn)是首頁(yè)卡片列表的json解析完成之后兑牡,會(huì)使用一個(gè)map存入內(nèi)存中,后面刷新的時(shí)候不再重新解析税灌,直接使用內(nèi)存中的解析結(jié)果)
2. 啟動(dòng)優(yōu)化
- 啟動(dòng)時(shí)間測(cè)量:
- adb shell am start -W com.mymoney.sms/.ui.SplashActivity
- adb logcat | grep Displayed
- 添加startingwindow均函,啟動(dòng)的時(shí)候給Application設(shè)置一個(gè)背景
- application初始化的時(shí)候亿虽,進(jìn)行異步和延遲(IdleHandler)的改造
- 異步加載可能有一些SDK會(huì)依賴別的SDK,比如B的初始化依賴A先初始化苞也,這個(gè)時(shí)候我們可以自己實(shí)現(xiàn)一個(gè)有序隊(duì)列洛勉,或者使用條件阻塞(CountDownLatch)
- 更深入的優(yōu)化:
- 安裝包重排布:讓啟動(dòng)階段需要的文件盡量排布在同一個(gè)dex中,減少io的開(kāi)銷(xiāo)如迟,從而達(dá)到提高性能的目的收毫。主要包括類(lèi)重排列(redex)和資源重排列(支付寶資源重排列)
- 啟動(dòng)階段抑制GC:這個(gè)方案主要針對(duì)dalvik虛擬機(jī),art虛擬機(jī)對(duì)GC有做優(yōu)化殷勘,dalvik在查找無(wú)用對(duì)象的時(shí)候會(huì)掛起所有線程此再,art虛擬機(jī)這個(gè)過(guò)程是并發(fā)執(zhí)行的,所有這個(gè)優(yōu)化對(duì)art虛擬機(jī)收益不大玲销,參考:支付寶客戶端架構(gòu)解析:Android 客戶端啟動(dòng)速度優(yōu)化之「垃圾回收」
- 針對(duì)5.0以下設(shè)備MultiDex的優(yōu)化输拇,參考:面試官:今日頭條啟動(dòng)很快,你覺(jué)得可能是做了哪些優(yōu)化贤斜?