APP啟動時間優化

小頭魚發表於2019-04-16

APP一般分為熱啟動和冷啟動

  • 冷啟動是指APP點選啟動前,它的程式不在系統裡,需要系統建立新的程式分配給它啟動,這是一次完成的啟動過程。
  • 熱啟動是指APP在冷啟動之後使用者將APP退出,掛在後臺,此時它的程式還是存在在系統的程式裡,使用者在此啟動需要的時間比較少,可以做的事情不多。

這裡只做冷啟動的優化。

首先我們要知道App在啟動時都幹了些什麼事,才能有針對的進行優化。 App的啟動可以歸納為三個階段:

  1. main()函式執行前
  2. main()函式執行後
  3. 首屏渲染完成

main()函式執行前

在main()函式執行前,系統主要會做以下幾件事:

  • 載入可執行檔案(APP的.o檔案集合)
  • 載入動態連結庫,進行rebase指標調整和bind符號繫結
  • Objc執行時的初始處理,包括objc相關類的註冊,category註冊,selector唯一性檢查等
  • 初始化,包括了+load()方法的執行,attribute((constructor)) 修飾的函式的呼叫,建立C++靜態全域性變數

相應的這個階段對於啟動速度優化可以做的事情:

  • 減少動態庫的載入
  • 減少載入啟動後不會使用的類或者方法
  • +load()方法裡的內容可以放在首屏渲染完成後在去處理,或者使用+initialize()方法替換
  • 控制C++全域性變數的數量

main()函授執行後

main()執行後的階段是指,從main()執行開始到appDelegate的didFinishLaunchingWithOptions方法裡首屏渲染相關方法執行完成。

  • 首屏初始化所需配置檔案的讀寫操作
  • 首屏列表大資料的讀取
  • 首屏渲染的大量計算

這裡更加優化的開發方式是確定哪些是首屏渲染必要的初始化功能,哪些是APP啟動必要的初始化功能,而那些只是需要在對應的功能開始是才需要初始化的。整理出來之後,分別放到對應的階段進行初始化

首屏渲染完成後

這個階段就是從渲染完成時開始,到didFinishLaunchingWithOptions 方法作用域結束時結束。 這個階段使用者已經可以看到App的首頁資訊了,所以優化級別放在最後,但是耗時操作還是要優先處理,以免影響使用者體驗。

功能級別的啟動優化

從main()函式執行後這個階段下手,優化的思路是main()函式執行後到首屏渲染完成前只處理與首屏渲染相關的操作,非首屏業務的初始化,監聽註冊,配置檔案讀取等放到首屏渲染完層後處理。

方法級別的優化

檢查首屏渲染完成前主執行緒上有哪些耗時方法,將沒必要的耗時方法之後或者非同步執行。通常情況下,耗時較長的方法主要發生在計算大量資料的情況下,具體表現就是載入,編輯,儲存圖片和檔案等資源。 這裡有兩種方式可以可以監控App啟動速度:

  • 定時抓取主執行緒上方法的呼叫堆疊,計算一段時間裡方法的耗時
  • 對objc_msgSend方法進行hook操作,來掌握所有方法的耗時

相關文章