APP啓動時間優化

APP通常分爲熱啓動和冷啓動

  • 冷啓動是指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()函數執行後到首屏渲染完成前只處理與首屏渲染相關的操做,非首屏業務的初始化,監聽註冊,配置文件讀取等放到首屏渲染完層後處理。code

方法級別的優化

檢查首屏渲染完成前主線程上有哪些耗時方法,將不必的耗時方法以後或者異步執行。一般狀況下,耗時較長的方法主要發生在計算大量數據的狀況下,具體表現就是加載,編輯,存儲圖片和文件等資源。 這裏有兩種方式能夠能夠監控App啓動速度:進程

  • 定時抓取主線程上方法的調用堆棧,計算一段時間裏方法的耗時
  • 對objc_msgSend方法進行hook操做,來掌握全部方法的耗時
相關文章
相關標籤/搜索