内容概要:
- APP啟動過程的内容
- APP冷啟動過程的優化【功能級别優化、方法級别優化】
- 總結
APP啟動過程的内容
app的啟動分為冷啟動和熱啟動。所謂的冷啟動,就是一次完整的啟動,即從系統配置設定一個程序給APP到APP啟動的到首屏的一個過程;熱啟動,就是指在APP使用過程中,使用者傳回到桌面之後,從桌面再傳回回來APP的一次啟動,即中途啟動的一個過程。
冷啟動:完整的一次啟動
熱啟動:使用過程中傳回背景,然後從背景進入APP的一次啟動
冷啟動的過程包括三個部分:
- main()執行前
- main()執行後
- 首屏渲染完成後
main()執行前執行哪些:
a. 加載可執行檔案
b. 加載動态連結庫
c. objc運作時的初始處理
d. 初始化(包括執行+load()方法,attribute((constructor))修飾的函數的調用、建立C++靜态全局變量等)
main()執行後執行哪些:(從main() 到didFinishLaunchingWithOptions方法)
a. 首屏初始化所需配置檔案的讀寫操作
b. 首屏清單大資料的讀取
c. 首屏渲染的大量計算等
首屏渲染完成後執行哪些:
非首屏其他業務服務子產品的初始化、監聽的注冊、配置資訊的讀取等
APP啟動過程的優化
【功能級别優化】
- main()執行前優化
a. 減少動态庫加載 b. 減少加載啟動後不會去使用的類或者方法 c. 減少C++全局變量的數量 d. +load()方法裡的内容可以放到首屏渲染完成後再執行,或用+initialize()方法替換。
- main()執行後(從main() 到didFinishLaunchingWithOptions方法)
隻處理首屏相關業務,其他非首屏業務的初始化、監聽注冊、配置檔案讀取等都放到首屏渲染完成後再做。
- 首屏渲染完成後
1. 其他業務基礎功能初始化 2. 其他服務初始化 3. 監聽注冊
【方法級别優化】
- 監控耗手段
a.定時抓取主線程上的方法調用堆棧,計算一段時間裡各個方法的耗時 b.對objc_msgSend進行hook,掌握所有方法的執行耗時。
-
檢查首屏有哪些耗時的方法,對其進行優化
耗時情況1:如加載、編輯、存儲圖檔、檔案等資源
耗時情況2:進行運作時方法替換操作會帶來時間消耗,如+load()執行有4毫秒的延遲。
總結
首先了解了啟動的概念。然後根據啟動的特性,我們劃分為三個階段。通過三個階段的分析,了解三個階段的特性。最後根據我們的業務需求,在功能上對其進行梳理,梳理出哪些是APP啟動時必要的初始化功能,哪些是首屏渲染必要的初始化功能,哪些是對應功能開始使用時才需要初始化的功能。将其對應滞後處理,完成啟動的優化。