1. 程式人生 > >APP啟動優化

APP啟動優化

目錄

APP的啟動分為兩種:熱啟動/冷啟動

APP的冷啟動主要包含以下幾個階段

APP啟動優化的步驟

 

  • 冷啟動:app 還沒開始啟動,從零開始啟動
  • 熱啟動:app以及啟動存在後臺中,再次點選app 圖示的一個種啟動
  • 一般app的啟動優化主要是針對冷啟動的。WWDC2016上Apple建議一個app的冷啟動時間大概在400ms左右設。通過新增環境變數可以打印出APP的啟動時間分析(Edit scheme -> Run -> Arguments),DYLD_PRINT_STATISTICS置為1,也可以通過設定DYLD_PRINT_STATISTICS_DETAILS為1獲得系統在呼叫main 函式之前主要工作佔用的時間資訊.
  •  

APP的冷啟動主要包含以下幾個階段

  • dylb:用來動態載入連結庫,可執行檔案,是apple的動態連結庫。啟動app 時apple會動態載入所有依賴的動態庫,當它把可執行檔案以及動態庫載入完成之後,會通知runtime進行下一步的操作。
  • runtime:
  1. 通過runtime原始碼可以得知,呼叫map_images進行可執行檔案的解析和處理
  2. 呼叫load_images執行call_load_methods從而呼叫 類以及分類的+load方法
  3. 對各種objc結構進行初始化(比如初始化物件,註冊類等等)
  4. 以上完成之後,所有的可執行檔案/動態庫中的所有符號(IMP,SEL,Class,Protocol....)已經按runtime的格式載入到記憶體中,被runtime管理
  • main:APP的啟動由dylb主導,dylb吧可執行檔案,Mach-O檔案載入到記憶體,順便載入所有依賴的動態庫。然後由runtime負責載入成objc定義的結構。初始化完成之後,由dylb呼叫main函式。然後去呼叫UIApplicationMain函式,再去呼叫AppDelegate 的didFinishLanchingWithOptions:方法

APP啟動優化的步驟

  • 能延遲執行的就延遲執行。比如SDK的初始化,介面的建立。
  • 減少動態庫,合併一些動態庫(定期的清理一些不必要的動態庫)
  • 合併一些功能類似的分類,減少Objc類。
  • 減少C的constructor函式,C++靜態物件,ObjC的+load,可以用 initialize方法和 dispath_once取代以上上面的操作
  • main函式中,在不影響使用者體驗的情況下,延遲載入。