一淘捡、背景
隨著App越做越大藕各,市場(chǎng),測(cè)試焦除、產(chǎn)品激况、開(kāi)發(fā)包括自己在內(nèi),明顯感覺(jué)到App的啟動(dòng)太慢膘魄、黑屏或在歡迎頁(yè)停太久乌逐,于是下定決心優(yōu)化下App的啟動(dòng)速度,查了些資料创葡,看了些別人的做法浙踢,總結(jié)出以下可取做法,現(xiàn)在分享給大家:
二灿渴、啟動(dòng)分析
1洛波、啟動(dòng)分類:
冷啟動(dòng):后臺(tái)不存在該應(yīng)用的任務(wù)進(jìn)程或服務(wù)呐芥,用戶點(diǎn)擊Icon圖標(biāo)啟動(dòng)
暖啟動(dòng):工作介于冷熱啟動(dòng)之間。幾種可能被認(rèn)為是溫啟動(dòng)的狀態(tài):
a奋岁、用戶離開(kāi)了app思瘟,然后重新啟動(dòng)它。這時(shí)進(jìn)程還在繼續(xù)運(yùn)行闻伶,但是Activity被回收了滨攻,app需要重新創(chuàng)建activity。
b蓝翰、系統(tǒng)將你的app回收了光绕,然后用戶重新啟動(dòng)app。進(jìn)程和Activity都需要重新啟動(dòng)畜份,但它們可以從onCreate方法保存的bundle中恢復(fù)诞帐。
熱啟動(dòng):當(dāng)后臺(tái)存在該應(yīng)用的進(jìn)程或者服務(wù)時(shí),用戶點(diǎn)擊icon圖標(biāo)啟動(dòng)爆雹。如用戶按了home鍵回到桌面停蕉,或者返回鍵沒(méi)有殺進(jìn)程,或者app本身做了進(jìn)程重啟的機(jī)制
2钙态、啟動(dòng)組成時(shí)間:
Application啟動(dòng)經(jīng)過(guò)attachBaseContext->onCreate方法
Activity啟動(dòng)經(jīng)過(guò)onCreate->onStart->onResume方法
經(jīng)過(guò)以上流程后慧起,界面才顯示出來(lái),所以啟動(dòng)耗時(shí)原因就可以在上述步驟中找出
3册倒、分析啟動(dòng)耗時(shí)原因:
a蚓挤、測(cè)量啟動(dòng)時(shí)間:在Androd的Log系統(tǒng)時(shí)通過(guò)ActivityManager與Display這兩個(gè)關(guān)鍵字可以查看到啟動(dòng)Activity所需要的時(shí)間,如果要看到數(shù)據(jù)加載的時(shí)間驻子,則可以在代碼中自定義灿意,在數(shù)據(jù)加載完的回調(diào)方法中主動(dòng)調(diào)用reportFullyDrawn()方法,則上報(bào)給系統(tǒng)崇呵,系統(tǒng)會(huì)反饋一個(gè)總的加載時(shí)間
b缤剧、計(jì)算啟動(dòng)時(shí)間——ADB
adb shell am start -W com.xys.preferencetest/.MainActivity
c、計(jì)算啟動(dòng)時(shí)間——Screen Record
adb shell screenrecord--bugreport /sdcard/test.mp4
d演熟、method tracing
通過(guò)上述方法基本上可以定位到耗時(shí)原因鞭执,那下面就開(kāi)始解決問(wèn)題
4司顿、在2中我們已經(jīng)知道了啟動(dòng)app要經(jīng)歷哪些過(guò)程芒粹,那我們會(huì)在這些過(guò)程做哪些事情呢?
在Application中:attachBaseContext方法中一般是加載MultiDex.install(this)操作大溜,關(guān)于這部分目前沒(méi)辦法優(yōu)化化漆,特別是在5.0以下的機(jī)器上,但是我們可以規(guī)避這問(wèn)題钦奋,歡迎頁(yè)我們可以另開(kāi)一進(jìn)程執(zhí)行(在manifest中加android:process)或者對(duì)App進(jìn)行插件化座云,onCreate方法中一般會(huì)初始化一些第三方平臺(tái)的SDK以及一些全局變量的初始化疙赠,我們可以執(zhí)行Application中的方法registerActivityLifecycleCallbacks,這個(gè)方法會(huì)監(jiān)聽(tīng)所有Activity的創(chuàng)建和銷毀朦拖, 我們可以在這里完成一些初始化工作
在Activity中:使用DelayLoader實(shí)現(xiàn)圃阳,getWindow().getDecorView().post(new Runnable(){
@Override
public void run({
//loading...
})
})
另外使用Theme改變用戶感知。
參考資料:
https://segmentfault.com/a/1190000007406875
http://www.lightskystreet.com/2016/10/15/android-optimize-start/