1.啟動時間的計算
一個app的啟動時間可以劃分為兩部分:main執行之前的時間+mian執行之后的時間(main函數到第一個界面渲染完的時間)。
完整的啟動時間的劃分:
t1:main函數執行之前 ? ? ? 冷啟動
t2:main函數執行到applicationDidFinishLaunching執行完成
t3:app完成所有本地數據的加載并顯示在界面上
t4:app發送網絡請求并將數據顯示在界面上
t1+t2決定了用戶需要多長時間能看到主視圖
t1+t2+t3決定了用戶需要多長時間能看到有用的信息
t1+t2+t3+t4決定了用戶用多長時間能看到所有想要的信息
我們這里主要討論的是t1和t2的優化!
2.為什么要優化t1
冷啟動就是在app被kill掉以后,從頭開始啟動消耗的時間,對于一些小型的app來說,優化冷啟動時間是沒有必要的,冷啟動時間的優化對于大的app(動態庫很多,類很多)來說是非常重要的。main函數執行之前消耗的時間與下面幾個因素有關:
動態庫的數量,動態庫加載的越多啟動越慢。
objc類的數量,數量越多啟動越慢。
構造函數數量,數量越多,啟動越慢。
靜態對象越多加載越慢。
load越多,啟動越慢。
cocoapods 里引用的第三方框架數量
3.冷啟動的過程和優化
冷啟動時間的長度是可以在Xcode里打印出來的,設置環境變量DYLD_PRINT_STATISTICS為yes,勾選“Dynamic Library Loads”,這樣在程序運行的時候就可以看到冷啟動時間。
冷啟動大體可以分為以下幾個過程:Load dylibs => Rebase/Binding => ObjC => Initializers
翻譯成漢語就是:動態庫的加載->指針重定位->ObjC類的初始化->其他的初始化
針對這幾個過程能做的優化其實是有限的,主要還是要根據系統自身的特點,去制定優化的目標,如果說系統對程序啟動時間要求很高,要求很快就啟動起來,那可以適當的減少動態庫的數量,減少類的數量。
掃描不再使用的類,動態庫,函數,把他們刪除。
系統級的動態庫的加載是不需要優化的,因為他們已經高度優化了。重點是開發者自己繼承到程序的動態庫,對此Apple建議減少在App里開發者的動態庫集成或者有可能地將其多個動態庫最終集成一個動態庫后進行導入, 盡量保證將App現有的非系統級的動態庫個數保證在6個以內。
盡量不要使用load方法,用initializer方法去代替,因為所有類和分類的load方法都在main函數執行之前執行,增加了t1部分的時長。那些需要在整個程序執行過程中只做一次的操作都放到dispatch_once方法里去做。
4.t2部分的優化
t2部分的時間是main函數開始執行到applicationDidFinishLaunching方法執行結束,執行完之后用戶就可以看到第一個主界面了。
這部分的優化核心在于優化applicationDidFinishLaunchingWithOptions方法,這個方法里一般做什么事呢,一般都是一些第三發sdk的配置,rootViewController的設置。
??:在applicationDidFinishLaunchingWithOptions這個方法里,方法的執行順序很重要,因為在這個方法里面要先執行控制器的viewDidLoad方法,這個方法才能執行完,執行完了才能去渲染界面。所以如果viewDidLoad方法里做了很多的事,那么app的啟動到渲染第一個界面的時間間隔非常長。
對于這個方法的優化思路:把要處理的時間分類,那些必須在app一打開就初始化的內容放到applicationDidFinishLaunchingWithOptions方法里初始化。
參考:將初始化分為三個類型:
日志、統計等必須在 APP 一起動就最先配置的事件
項目配置、環境配置、用戶信息的初始化 、推送、IM等事件
其他 SDK 和配置事件
對于第一類,由于這類事件的特殊性,所以必須第一時間啟動,仍然把它留在 didFinishLaunchingWithOptions 里啟動。第二類事件,這些功能在用戶進入 APP 主體的之前是必須要加載完的,所以我們可以把它放在第二批,也就是用戶已經看到廣告頁面,再進行廣告倒計時的時候再啟動。第三類事件,由于不是必須的,所以我們可以放在第一個界面渲染完成以后的 viewDidAppear 方法里,這里完全不會影響到啟動時間。
5.對于第一個界面渲染的優化
渲染第一個界面的時候,先顯示一個空殼的界面,用戶不會覺得界面卡住了,然后把請求數據,加載數據,解析等操作放到viewDidAppear方法來做,因為如果都放到viewDidLoad方法里那就會一直執行didFinishLaunchingWithOptions方法不會去渲染第一個界面,用戶可能覺得應用卡住了。
這一部分參考了網上很多優秀的文章,記錄一下
參考文章:
優化 App 的啟動時間? ?這個是楊蕭玉講的,講了很多的底層知識不太好理解
[iOS]一次立竿見影的啟動時間優化? 這個里講的t2的優化很詳細
iOS App 啟動性能優化? 這個都講了,又具體又全面
WWDC 之優化 App 啟動速度? 這個主要講t1的優化,比較泛泛
Optimize App Startup Time? 自己發現的一個iOS獨立開發者的博客,很開心??