聲明:
本文旨在學習APP啟動流程并著力優(yōu)化本公司項目,部分知識點非自創(chuàng),如各位大佬發(fā)現(xiàn)本文存在抄襲侵權之處琢感,請及時指出改正丢间,謝謝!
一驹针、背景
APP的啟動一般分為冷啟動和熱啟動烘挫。
1、冷啟動:當用戶啟動應用程序時柬甥,后臺沒有該應用程序的進程饮六,這時系統(tǒng)會重新給應用程序分配一個進程,這種方法就叫冷啟動苛蒲。
2卤橄、熱啟動:當用戶啟動應用程序時臂外,后臺已經(jīng)有了該程序的進程(通過home鍵退出)當再次點開APP馬上能夠恢復到上次使用的狀態(tài)窟扑,不需要再回到手機的首頁打開應用程序,這個方式就叫熱啟動寄月。
3辜膝、熱啟動通常不需要優(yōu)化,APP的啟動流程優(yōu)化一般指的是冷啟動優(yōu)化漾肮。
APP的冷啟動大致分為三個階段
1厂抖、APP的啟動加載(從點擊APP到執(zhí)行main()函數(shù))
2、APP的初始化(從main()函數(shù)執(zhí)行到didFinishLaunchingWithOptions方法執(zhí)行)
3克懊、APP的運行時生命周期(從didFinishLaunchingWithOptions函數(shù)執(zhí)行到首屏渲染結束)
啟動流程參考鏈接一
啟動流程參考鏈接二
冷啟動時長是App性能的重要指標忱辅,直接決定著用戶對App的第一印象。隨著越來越多版本的迭代開發(fā)谭溉,產(chǎn)品形態(tài)不斷完善墙懂,業(yè)務功能日趨復雜,在App冷啟動的時候需要完成更多更復雜的功能扮念,這給App的冷啟動性能帶來了挑戰(zhàn)损搬。因此,對冷啟動進行優(yōu)化工作柜与,提高用戶體驗巧勤,是一項重要的工作。
二弄匕、APP的啟動流程
1颅悉、啟動加載項(pre-main)
當我們點擊APP時,XNU內(nèi)核(提供基礎服務迁匠,像線程剩瓶,進程管理驹溃,進程間通信,文件管理)先將我們的App加載進內(nèi)存延曙,之后加載一個“中間件”:dyld這是(開源地址)豌鹤。之后dyld會負責分析App的Mach-O文件(Exectuable文件、Dylib:動態(tài)庫搂鲫、Bundle傍药、Image、Framework: 包含資源文件魂仍、頭文件等的dylib)以加載所需的dynamic libraries拐辽。之后利用Rebasing和Binding修正內(nèi)部和外部指針指向。最后加載runtime組件擦酌,runtime組件加載好后就會向需要初始化的object發(fā)送消息俱诸,開始初始化。 至此赊舶,main函數(shù)之前的步驟結束睁搭。之后App開始在AppDelegate里面初始化我們自定義的服務以及渲染首屏等。
優(yōu)化方式
dyld 3已經(jīng)做了大部分優(yōu)化(在dyld 2時代笼平,所有我們之前提到的啟動步驟都是發(fā)生在內(nèi)核分配給你的進程中的(in-process); 而在dyld 3中园骆,關于Mach-O文件的解析發(fā)生在App第一次安裝或者是之后的更新過程中。解析過后寓调,關于App啟動的信息會被存到磁盤锌唾,供App啟動時使用。這兩步大大提升了App加載的速度夺英,系統(tǒng)庫是有共享緩存的晌涕,所以加載速度會相對較快。)
main()之前的加載過程影響因素大概有下面幾種:
1痛悯、動態(tài)庫加載越多余黎,啟動越慢。
2载萌、ObjC類惧财,方法越多,啟動越慢扭仁。
3可缚、ObjC的+load越多,啟動越慢斋枢。
4经备、C的constructor函數(shù)越多斧蜕,啟動越慢。
5松捉、C++靜態(tài)對象越多,啟動越慢戈次。
針對以上幾點轩勘,可以做如下一些優(yōu)化工作。
1怯邪、代碼瘦身
把無用的方法和類刪除一下绊寻。
2、+load優(yōu)化
目前項目中存在一些+load方法悬秉,如果不是非必須加載可以刪掉或者換成+initialize方法(+load和+initialize的區(qū)別)澄步。
3、優(yōu)化耗時操作(借助Instrument工具的Time Profiler插件)
啟動時減少圖片資源的處理
減少動畫圖片組的數(shù)量和泌,替換大圖資源等村缸。
推遲執(zhí)行的一些耗時任務。
2武氓、初始化(main)
1.執(zhí)行main 的函數(shù)
2.執(zhí)行UIApplicationMain的方法
2.1 會創(chuàng)建UIApplication對象梯皿,并設置它的代理
2.2 會開啟一個事件循環(huán)(主運行循環(huán)即死循環(huán),保證程序不退出)
2.3 加載info.plist
2.4 通知應用程序代理县恕,應用程序啟動完畢东羹,執(zhí)行didFinishLaunchingWithOptions
(這個階段一般都是必做的事 優(yōu)化空間不大)。
3忠烛、APP的運行時生命周期(didFinishLaunchingWithOptions)
過程是從AppDelegate的didFinishLaunchingWithOptions方法到首頁離屏渲染結束属提。
梳理出來didFinishLaunchingWithOptions方法到第一個主界面導致延遲加載的原因并改進。例如網(wǎng)絡數(shù)據(jù)的加載况木,界面的加載垒拢,第三方SDK的初始化,新版本彈窗檢查火惊,廣告彈窗檢查等求类。