iOS優化APP啓動時間

1. load dylibs image

通常的,一個App需要加載100到400個dylibs, 但是其中的系統庫被優化,可以很快的加載。 針對這一步驟的優化有:

1.減少非系統庫的依賴
2.合併非系統庫
3.使用靜態資源,比如把代碼加入主程序

2. rebase/bind

優化該階段的關鍵在於減少__DATA segment中的指針數量。我們可以優化的點有:

1.減少Objc類數量, 減少selector數量
2.減少C++虛函數數量
3.轉而使用swift stuct(其實本質上就是爲了減少符號的數量)

3. main()調用之前的耗時我們可以優化的點

1.減少不必要的framework,因爲動態鏈接比較耗時
2.check framework應當設爲optional和required,如果該framework在當前App支持的所有iOS系統版本都存在,那麼就設爲required,否則就設爲optional,因爲optional會有些額外的檢查
3.合併或者刪減一些OC類,關於清理項目中沒用到的類,使用工具AppCode代碼檢查功能,查到當前項目中沒有用到的類如下:
3.1 刪減一些無用的靜態變量
3.2 刪減沒有被調用到或者已經廢棄的方法
3.3 將不必須在+load方法中做的事情延遲到+initialize中
3.4 儘量不要用C++虛函數(創建虛函數表有開銷)

4. main()調用之後的加載時間

在main()被調用之後,App的主要工作就是初始化必要的服務,顯示首頁內容等。而我們的優化也是圍繞如何能夠快速展現首頁來開展。 App通常在AppDelegate類中的- (BOOL)Application:(UIApplication *)Application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中創建首頁需要展示的view,然後在當前runloop的末尾,主動調用CA::Transaction::commit完成視圖的渲染。

而視圖的渲染主要涉及三個階段:
1.準備階段 這裏主要是圖片的解碼
2.佈局階段 首頁所有UIView的- (void)layoutSubViews()運行
3.繪製階段 首頁所有UIView的- (void)drawRect:(CGRect)rect運行再加上啓動之後必要服務的啓動、必要數據的創建和讀取,這些就是我們可以嘗試優化的地方

因此,對於main()函數調用之前我們可以優化的點有:
1.不使用xib,直接視用代碼加載首頁視圖
2.NSUserDefaults實際上是在Library文件夾下會生產一個plist文件,如果文件太大的話一次能讀取到內存中可能很耗時,這個影響需要評估,如果耗時很大的話需要拆分(需考慮老版本覆蓋安裝兼容問題)
3.每次用NSLog方式打印會隱式的創建一個Calendar,因此需要刪減啓動時各業務方打的log,或者僅僅針對內測版輸出log
4.應用啓動時發送的所有網絡請求,是否可以統一在異步線程請求

5. 具體優化點

因此,針對於今日頭條這個App我們可以優化的點如下:

1.純代碼方式而不是storyboard加載首頁UI。
2.對didFinishLaunching裏的函數考慮能否挖掘可以延遲加載或者懶加載,需要與各個業務方pm和rd共同check 對於一些已經下線的業務,刪減冗餘代碼。
3.對於一些與UI展示無關的業務,如微博認證過期檢查、圖片最大緩存空間設置等做延遲加載,對實現了+load()方法的類進行分析,儘量將load裏的代碼延後調用。
4.上面統計數據顯示展示feed的導航控制器頁面(NewsListViewController)比較耗時,對於viewDidLoad以及viewWillAppear方法中儘量去嘗試少做,晚做,不做。

6.iOS App啓動過程

參考 http://blog.csdn.net/justinjing0612/article/details/43969681

(1) 鏈接並加載Framework和static lib

(2) UIKit初始化

(3) 應用程序callback

(4) 第一個Core Animation transaction

6.1 鏈接並加載Framework及static lib時需要注意:

1.每個Framework都會增加啓動時間和佔用的內存
2.不必要的Framework,不要鏈接
3.必要的Framework,不要設置爲Optional
4.只在使用在Deployment Target之後發佈的Framework時,才使用Optional(比如你的Deployment Target是iOS 3.0,需要鏈接StoreKit的時候)避免創建全局的C++對象

6.2 初始化UIKit時需要注意:

1.字體、狀態欄、user defaults、main nib會被初始化
2.保持main nib儘可能的小
3.User defaults本質上是一個plist文件,保存的數據是同時被反序列化的,不要在user defaults裏面保存圖片等大數據

6.3 應用程序的回調

1.application:willFinishLaunchingWithOptions:
2.恢復應用程序的狀態
3.application:didFinishLaunchingWithOptions:

7. WWDC 之優化 App 啓動速度

參考 https://juejin.im/entry/57c3d611a633bd005d7b3b62

7.1 對動態庫加載的時間優化

每個App都進行動態庫加載,其中系統級別的動態庫佔據了絕大數,而針對系統級別的動態庫都是經過系統高度優化的,不用擔心時間的花費.開發者應該關注於自己集成到App的那些動態庫,這也是最能消耗加載時間的地方.對此Apple建議減少在App裏開發者的動態庫集成或者有可能地將其多個動態庫最終集成一個動態庫後進行導入, 儘量保證將App現有的非系統級的動態庫個數保證在6個以內.

7.2 減少Appp的Objective-C類,分類和的唯一Selector的個數

這樣做主要是爲了加快程序的整個動態鏈接, 在進行動態庫的重定位和綁定(Rebase/binding)過程中減少指針修正的使用,加快程序機器碼的生成.

7.3 減少Objc運行初始化的時間花費

主要是類的註冊,分類的註冊,唯一選擇器的存在,以及涉及子父類內存佈局的Non Fragile ivars偏移的更新,都會影響Objective-C運行時初始化的時間消耗.

7.4 使用initialize方法進行必要的初始化工作

用+initialize方法替換調用原先在OC的+load方法中執行初始代碼工作,從而加快所有類文件的加載速度.

結尾

1.使用DYLD_PRINT_STATISTICS測試啓動加載時間
2.減少自定義的動態庫集成
3.精簡原有的Objective-C類和代碼
4.移除靜態的初始化操作
5.使用更多的Swift代碼

8. Facebook iOS App如何優化啓動時間

參考 http://www.cocoachina.com/ios/20160105/14870.html



轉載鏈接:https://www.jianshu.com/p/1f1c4e13b857

發佈了22 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章