優(yōu)化 App 冷啟動速度是提升用戶體驗的關(guān)鍵環(huán)節(jié)之一。以下是常用的優(yōu)化方法及其原理,結(jié)合 iOS 平臺特性進行說明:
一、冷啟動階段劃分(iOS)
冷啟動指 App 被系統(tǒng)完全殺死后重新啟動 的過程,主要分為三個階段:
- 系統(tǒng)準(zhǔn)備階段:加載可執(zhí)行文件(Mach-O)、動態(tài)庫鏈接(dyld)、ObjC 運行時初始化。
-
主線程初始化階段:
main()函數(shù)執(zhí)行 →UIApplicationMain()→ 首屏渲染完成。 - 首屏數(shù)據(jù)加載階段:網(wǎng)絡(luò)請求、本地數(shù)據(jù)讀取等。
二、優(yōu)化方法及原理
1. 減少動態(tài)庫依賴
-
方法:
- 合并動態(tài)庫(使用
cocoapods時設(shè)置use_frameworks! :linkage => :static)。 - 避免非必要動態(tài)庫(如將第三方 SDK 改為靜態(tài)庫)。
- 合并動態(tài)庫(使用
-
原理:
- 動態(tài)庫(
.dylib)需要dyld逐級加載,合并或靜態(tài)化可減少dyld加載耗時。
- 動態(tài)庫(
2. 優(yōu)化 ObjC 運行時初始化
-
方法:
- 減少
+load方法,改用+initialize。 - 使用
__attribute__((objc_runtime_name))縮短類名(減少字符串處理開銷)。
- 減少
-
原理:
-
dyld會遞歸調(diào)用所有+load方法,延遲非關(guān)鍵初始化可加速啟動。
-
3. 二進制重排(Page Fault 優(yōu)化)
-
方法:
- 通過
Clang插樁收集啟動階段函數(shù)調(diào)用順序(order_file)。 - 使用
LD_ORDER_FILE調(diào)整二進制布局,將啟動路徑代碼集中在連續(xù)內(nèi)存頁。
- 通過
-
原理:
- 減少缺頁中斷(Page Fault)次數(shù),利用局部性原理提升 CPU 緩存命中率。
4. 延遲非必要任務(wù)
-
方法:
- 將日志上報、統(tǒng)計等任務(wù)放到首屏渲染后執(zhí)行。
- 使用
DispatchQueue.main.asyncAfter或OperationQueue延遲低優(yōu)先級任務(wù)。
-
原理:
- 避免阻塞主線程的
RunLoop,優(yōu)先保證 UI 快速響應(yīng)。
- 避免阻塞主線程的
5. 預(yù)加載 & 緩存
-
方法:
- 預(yù)加載首屏數(shù)據(jù)(如
UserDefaults緩存、內(nèi)存緩存)。 - 使用
UIBackgroundFetch在后臺提前更新數(shù)據(jù)。
- 預(yù)加載首屏數(shù)據(jù)(如
-
原理:
- 減少主線程等待 I/O 或網(wǎng)絡(luò)請求的時間。
6. 優(yōu)化首屏渲染
-
方法:
- 使用
LaunchScreen.storyboard代替靜態(tài)啟動圖(避免白屏)。 - 簡化首屏
ViewController的viewDidLoad邏輯(如異步布局)。
- 使用
-
原理:
- 啟動圖結(jié)束后若首屏未就緒,用戶仍會感知卡頓。
7. 代碼瘦身
-
方法:
- 刪除未使用的類/方法(通過
AppCode或fui工具掃描)。 - 剝離符號(
STRIP_INSTALLED_PRODUCT = YES)。
- 刪除未使用的類/方法(通過
-
原理:
- 減少可執(zhí)行文件體積,降低
mmap加載耗時。
- 減少可執(zhí)行文件體積,降低
8. 多線程初始化
-
方法:
- 將 SDK 初始化任務(wù)分配到子線程(如
AVFoundation、Firebase)。 - 注意線程安全(避免鎖競爭)。
- 將 SDK 初始化任務(wù)分配到子線程(如
-
原理:
- 利用多核 CPU 并行處理任務(wù)。
三、iOS 專項優(yōu)化工具
-
測量工具:
- Xcode Organizer:查看啟動時間歷史數(shù)據(jù)。
-
Instruments 的
App Launch模板:分析各階段耗時。 -
DYLD_PRINT_STATISTICS:輸出
dyld加載詳情(需設(shè)置環(huán)境變量)。
-
線上監(jiān)控:
- 通過
os_signpost打點上報啟動各階段耗時。 - 關(guān)鍵指標(biāo):
TTI(Time To Interactive)。
- 通過
四、優(yōu)化效果對比
| 優(yōu)化手段 | 預(yù)期提升幅度 | 實施成本 |
|---|---|---|
| 二進制重排 | 10%~30% | 中 |
| 動態(tài)庫合并 | 5%~15% | 低 |
| 延遲非必要任務(wù) | 5%~20% | 低 |
| 首屏數(shù)據(jù)預(yù)加載 | 10%~40% | 中 |
五、實戰(zhàn)建議
-
優(yōu)先級策略:
- 先優(yōu)化
main()函數(shù)之前的耗時(占冷啟動 30%~50%)。 - 再優(yōu)化首屏渲染和數(shù)據(jù)加載。
- 先優(yōu)化
-
AB 測試:
- 對比優(yōu)化前后版本的用戶留存率(尤其關(guān)注新用戶)。
-
規(guī)避陷阱:
- 避免過度并行化導(dǎo)致線程爆炸(建議使用
GCD的QoS分級)。
- 避免過度并行化導(dǎo)致線程爆炸(建議使用
通過綜合應(yīng)用上述方法,可顯著提升冷啟動速度(通??蛇_ 30%~50% 優(yōu)化效果)。