如何減少 iOS App launch time
這篇文章就來紀錄一下今日的研究項目,主要的起因是前一篇使用 Xcode 建立一個 Framework有談到如何選擇要創建的是 static library 還是 dynamic framework,其中一個差異是 dyld ( dynamic loader ) 會在 pre main 的時候去載入 dynanmic frameworks,所以若是有越多的 dynamic frameworks 需要載入時,便會花上越多時間。而Apple也建議我們不要使用超過 6 個非系統的 dynamic frameworks。
再來搭配服用 weak self - 25: 難道公司發大財了!?App Launch Time 加速面面觀,一併做一個筆記整理。
App 啟動的三個階段
Pre-main: Loading (MachO + dylib) / Rebase & Binding / ObjC Setup / Initializer
如何查看 pre main time
透過在 Target 的 Environment Variables 加入 DYLD_PRINT_STATISTICS
並設為 1
便可以在 Debug console log 得到資訊。
減少 dynamic frameworks 數量來加速
這是蠻有效的一種方式,我分別對 找健身做了個兩次執行得到下面的結果:
我們可以看到將 CocoaPods 的所有 pods 都以 Static library 的方式產生時, pre-main 的時間是明顯降低的。
而 CocoaPods 要如何將 pods 生成為 statis library 的型態呢?
在 ABI Source Compatibility 之後
在 Xcode 9 beta 4 有了 ABI 穩定之後,我們才開始可以以 Swift 的方式來寫一個 static library,而 CocoaPods 1.5 之後也跟進了!
我們便可以將 use_framework!
換成 use_modular_headers!
,這樣所產生出來的 pods 便會以 static library 的方式連結。
Main
在 podcast 裡頭,Pofat 有提到 Swift 裡頭的 main 是利用 @UIApplication
的方式來辨別並由系統自己做掉了,若有自己做的打算的話,則可以移除掉該行並寫一個 main.swift
即可(附上 Pofat 的程式碼)
Post-main
這邊就如同 Podcast 裡頭提及的重點,盡量不要一開始就在 main thread 上做太多事!