首先,需要清楚App的啟動過程
1、解析 Info.plist
·加載相關信息,例如閃屏
·沙箱建立、權限檢查
2、Mach-O加載
·如果是胖二進制文件,尋找適合當前CPU類別的部分
·加載所有依賴的Mach-O文件(遞歸調用Mach-O加載的方法)
·定位內部、外部指針引用,例如字符串、函數等
·執行聲明為__attribute__(constructor)的C函數
·加載類擴展(category)中的方法
·C++靜態對象加載、調用OC的+load函數
3、程序執行
·調用main()函數
·調用UIApplicationMain()函數
1)創建UIApplicationDelegate對象
2)創建UIApplicationDelegate對象並復制
3)讀取配置文件Info.plist,設置程序啟動的一些屬性
4)創建應用程序的Main Runloop循環
·調用applicationWillFinishLaunching
1)程序啟動成功之后,首先調用Application:didFinishLaunchingWithOptions:方法,如果Info.plist文件中配置了啟動storyboard文件名,則加載storyboard文件。如果沒有配置,則根據代碼來創建UIWindow-->UIWindow的rootViewController-->顯示
然后,影響啟動性能的因素有:
1、main()函數之前耗時的影響因素
·動態庫加載越多,啟動越慢
·OC類越多,啟動越慢
·C的constructor函數越多,啟動越慢
·C++靜態對象越多,啟動越慢
·OC的+load越多,啟動越慢
2、main()函數之后耗時的影響因素
·執行main()函數的耗時
·執行applicationWillFinishLaunching的耗時
·rootViewController及其childViewController的加載、view及其subviews的加載
借鑒方案:
針對今日頭條這個App我們可以優化的點如下:
·純代碼方法而不是storyboard加載首頁UI
·對didFinishLaunching里面的函數考慮是否可以延遲加載或者懶加載,需要與各個業務方共同check,對於一些已經下線的業務,刪除冗余代碼
·對於一些與UI展示無關的業務,如微博認證過期檢查、圖片最大緩存空間設置等做延遲加載。對實現了+load()方法的類進行分析,盡量將load里的代碼延后調用
·上面統計數據顯示展示feed的導航控制器頁面(NewsListViewController)比較耗時,對於viewDidLoad以及viewWillAppear方法中盡量去嘗試少做、晚做、不做。