1. App啟動(dòng)過(guò)程
解析Info.plist
- 加載相關(guān)信息,例如如閃屏
- 沙箱建立、權(quán)限檢查-
Mach-O加載
- 如果是胖二進(jìn)制文件,尋找合適當(dāng)前CPU類(lèi)別的部分
- 加載所有依賴(lài)的Mach-O文件(遞歸調(diào)用Mach-O加載的方法)
- 定位內(nèi)部、外部指針引用,例如字符串疲酌、函數(shù)等
- 執(zhí)行聲明為attribute((constructor))的C函數(shù)
- 加載類(lèi)擴(kuò)展(Category)中的方法
- C++靜態(tài)對(duì)象加載蜡峰、調(diào)用ObjC的 +load 函數(shù)
-
程序執(zhí)行
- 調(diào)用main()
- 調(diào)用UIApplicationMain()
- 調(diào)用applicationWillFinishLaunching
2. 如何測(cè)量啟動(dòng)過(guò)程耗時(shí)
冷啟動(dòng)比熱啟動(dòng)重要
當(dāng)用戶(hù)按下home鍵的時(shí)候,iOS的App并不會(huì)馬上被kill掉朗恳,還會(huì)繼續(xù)存活若干時(shí)間湿颅。理想情況下,用戶(hù)點(diǎn)擊App的圖標(biāo)再次回來(lái)的時(shí)候粥诫,App幾乎不需要做什么油航,就可以還原到退出前的狀態(tài),繼續(xù)為用戶(hù)服務(wù)怀浆。這種持續(xù)存活的情況下啟動(dòng)App谊囚,我們稱(chēng)為熱啟動(dòng),相對(duì)而言冷啟動(dòng)就是App被kill掉以后一切從頭開(kāi)始啟動(dòng)的過(guò)程执赡。我們這里只討論App冷啟動(dòng)的情況镰踏。
main()函數(shù)之前
在不越獄的情況下,以往很難精確的測(cè)量在main()函數(shù)之前的啟動(dòng)耗時(shí)沙合,因而我們也往往容易忽略掉這部分?jǐn)?shù)據(jù)奠伪。小型App確實(shí)不需要太過(guò)關(guān)注這部分。但如果是大型App(自定義的動(dòng)態(tài)庫(kù)超過(guò)50個(gè)首懈、或編譯結(jié)果二進(jìn)制文件超過(guò)30MB)绊率,這部分耗時(shí)將會(huì)變得突出。所幸究履,蘋(píng)果已經(jīng)在Xcode中加入這部分的支持滤否。
main()函數(shù)之后
從main()函數(shù)開(kāi)始至applicationWillFinishLaunching結(jié)束,我們統(tǒng)一稱(chēng)為main()函數(shù)之后的部分最仑。
3. 影響啟動(dòng)性能的因素
App啟動(dòng)過(guò)程中每一個(gè)步驟都會(huì)影響啟動(dòng)性能顽聂,但是有些部分所消耗的時(shí)間少之又少肥惭,另外有些部分根本無(wú)法避免,考慮到投入產(chǎn)出比紊搪,我們只列出我們可以?xún)?yōu)化的部分:
main()函數(shù)之前耗時(shí)的影響因素
- 動(dòng)態(tài)庫(kù)加載越多蜜葱,啟動(dòng)越慢。
- ObjC類(lèi)越多耀石,啟動(dòng)越慢
- C的constructor函數(shù)越多牵囤,啟動(dòng)越慢
- C++靜態(tài)對(duì)象越多,啟動(dòng)越慢
- ObjC的+load越多滞伟,啟動(dòng)越慢
main()函數(shù)之后耗時(shí)的影響因素
- 執(zhí)行main()函數(shù)的耗時(shí)
- 執(zhí)行applicationWillFinishLaunching的耗時(shí)
- rootViewController及其childViewController的加載揭鳞、view及其subviews的加載
這些操作地方都是耗時(shí)影響主線(xiàn)程的問(wèn)題,需要異步后臺(tái)線(xiàn)程梆奈,處理然后主線(xiàn)程更新野崇,展位圖作占位。