iOS App launch time 心得

如何減少 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 上做太多事!

comments powered by Disqus