App 啟動動干了那些事情
- 一般情況下app 啟動分為冷啟動和熱啟動
** 冷啟動是指,App點擊啟動前诸尽,他的進程不在系統(tǒng)里面昧旨,需要創(chuàng)建一個進程分配他的啟動情況,這是一次完整的啟動過程弥喉。
** 熱啟動是指,App 在冷啟動用戶將app退到后臺玛迄,在app 的進程還在系統(tǒng)的情況下由境,用戶點擊log進入app的過程,這個過程做的事情非常少蓖议。
用戶能感知到啟動慢虏杰,其實都是發(fā)生在主線程上。而主線程慢的原因有很多勒虾,比如在主線程中進行了大量的讀寫操作纺阔、在渲染周期中執(zhí)行了大量的計算等。
究竟如何才能把app啟動的所有耗時都找出來呢从撼?解決這個問題州弟,你首先要弄清楚App在啟動前都做了那些事情能钧栖。
一般而言低零,App的啟動時間,是指涌入點擊App開始拯杠,到用戶看到第一個界面之間的時間掏婶。app 的啟動包括三個階段:
1 main()函數(shù)執(zhí)行前
2 main()函數(shù)執(zhí)行后
3 首屏渲染完成后
main() 函數(shù)執(zhí)行前
在main函數(shù)執(zhí)行前會做:
- 加載可執(zhí)行的文件
- 加載動態(tài)鏈接哭,進行rebase 指針調(diào)整和符號bind
- Objc 運行時處理潭陪,包括Objc 相關類的注冊雄妥、category注冊最蕾、selector 唯一性檢查等。
相應的老厌,這個階段對于啟動優(yōu)化來說瘟则,可以做的事情包括 - 減少動態(tài)庫的加載。每個庫本身有依賴關系枝秤,蘋果建議使用更少的動態(tài)庫醋拧,并且建議在使用動態(tài)庫的數(shù)量較多時,盡量將多個動態(tài)庫合并淀弹。數(shù)量上丹壕,蘋果可以支持6個非系統(tǒng)動態(tài)庫合成一個
- 減少加載啟動后不會去使用的的類和方法
- +(load)方法里的內(nèi)容可以放到首屏渲染后去完成,或是用+initalize()方法替換薇溃。因為一個load 方法會帶來4毫秒的耗時菌赖。
- 控制c++ 全局變量的數(shù)量
mian()函數(shù)后
main()函數(shù)執(zhí)行后的階段,是指從main 函數(shù)執(zhí)行開始沐序,到appDelegate 的didFinishLaunchingWithOptions方法里首頁離屏渲染的相關執(zhí)行方法執(zhí)行完成琉用。
首頁的業(yè)務代碼都是在這個階段,也就是首頁離屏渲染前執(zhí)行包括:
- 首頁初始化需要配置文件的讀寫操作
- 首頁列表大數(shù)據(jù)的讀取
- 首頁渲染的大量計算
很多時候薄啥,開發(fā)者會把各種初始化工作都放到這個階段執(zhí)行辕羽,導致渲染完成滯后。更加優(yōu)化的開發(fā)方式垄惧,應該是從功能上梳理那些是首屏渲染必要的初始化刁愿,那些是app 啟動必要的初始化功能,而那些是功能需要使用的時候才需要的到逊。