最近看了戴銘大神的極客時間维雇,來做一些筆記
APP啟動分為冷啟動和熱啟動
- 冷啟動就是在app點擊啟動前淤刃,它的進程不在系統(tǒng)里,需要創(chuàng)建分配給他一個進程吱型。這就是一次完整的啟動過程
- 熱啟動逸贾,按下Home鍵app退之后臺,在app進程的還在系統(tǒng)的狀態(tài)津滞,用戶重新進入進去app的過程
APP啟動三個階段
- main()函數(shù)執(zhí)行之前
- main()函數(shù)之后
- 首屏渲染完成后
main函數(shù)執(zhí)行之前
- 加載可執(zhí)行文件(App 的.o 文件的集合)
- 加載動態(tài)鏈接庫铝侵,進行 rebase 指針調(diào)整和 bind 符
- 初始化,+load()方法触徐,創(chuàng)建c++靜態(tài)全局全局變量
這部分可以做的優(yōu)化工作有咪鲜,減少動態(tài)庫的加載,減少加載啟動后不會去使用的庫和方法撞鹉,把+load()方法執(zhí)行邏輯放到首屏渲染后或者放在+initialize()里面疟丙,控制c++的全局變量數(shù)量
main函數(shù)執(zhí)行之后
這個階段一般是從AppDelegate的applicationDidFinishLaunching的方法到首屏渲染颖侄,展示來歡迎界面這個階段。首頁的任務(wù)都是放生在這個階段隆敢,一般包括的任務(wù)有:
- 首屏初始化所需配置文件的讀寫操作
- 首頁列表大數(shù)據(jù)的讀取
- 首屏渲染的大量計算等
這部分可以做的優(yōu)化工作有
- 將main() 函數(shù)開始執(zhí)行后到首屏渲染完成前只處理首屏相關(guān)的業(yè)務(wù)发皿,其他非首屏業(yè)務(wù)的初始化,監(jiān)聽注冊拂蝎,配置文件文件讀取放到首屏渲染后去做
方法級別的啟動優(yōu)化的監(jiān)控思路
一般統(tǒng)計一個方法的執(zhí)行時間的手段有
- 定時定時抓取主線程上的方法調(diào)用堆棧穴墅,計算一段時間里各個方法的耗時,比如xcode的系統(tǒng)自帶Time Profile就是采用這種方案
- 對objc_msgSend的方法進行hook來監(jiān)控OC大部分方法的執(zhí)行耗時