在蔚來的時候驯嘱,啟動了解決半年的APP系統(tǒng)優(yōu)化項目。每個月累進一點點喳坠,日積月累鞠评,還是有些效果的『攫模回到兩鮮剃幌,重新梳理了下項目聋涨,項目的啟動速度也得到了很大的提升。權(quán)且記錄下操作經(jīng)驗负乡。
996期間牛郑,忙中做了很多系統(tǒng)優(yōu)化的事情。iPhone 6sp敬鬓,安裝包從90M下降到50M淹朋;熱啟動pre-main/ total time 從448ms/1.35s降到397ms/1.25s左右; 冷啟動 pre-main/ total time 500ms/1.65s變化到505ms/1.7s左右。
一钉答、通過xcode 開啟APP啟動時間打印础芍,Edit Scheme>Envirement Variables新增DYLD_PRINT_STATISTICS
二、APP啟動包括冷啟動和熱啟動数尿,我們以冷啟動為例仑性。啟動時間優(yōu)化包括main()之前和main()之后
1.main()之前
1.1 load dylibs:這一階段dyld會分析應(yīng)用依賴的dylib
,找到其mach-o
文件右蹦,打開和讀取這些文件并驗證其有效性诊杆,接著會找到代碼簽名注冊到內(nèi)核,最后對dylib
的每一個segment
調(diào)用mmap()何陆。
1.2 rebase/bind:進行rebase
指針調(diào)整和bind
符號綁定晨汹。
1.3 ObjC setup:runtime運行時初始化。包括ObjC
相關(guān)Class
的注冊贷盲、category
注冊淘这、selector
唯一性檢查等。
1.4Initializers:調(diào)用每個ObjC
類與分類的+load
方法巩剖,調(diào)用attribute((constructor))
修飾的函數(shù)铝穷、創(chuàng)建C++
靜態(tài)全局變量。
作者:QiShare
鏈接:http://www.reibang.com/p/024b3d847fe0
2.兩鮮在main()之前的優(yōu)化:
2.1減少非必要的動態(tài)庫加載佳魔,移除APP廢棄lib
2.2減少部分+(void)load() 方法曙聂,盡量合并實現(xiàn)
3.其他的一些建議:
2.1:二進制文件重排,據(jù)說效果很明顯
APP 二進制文件重排已經(jīng)被玩壞了 http://yulingtianxia.com/blog/2019/09/01/App-Order-Files/
2main()之后鞠鲜,主要是didFinishLaunchingWithOptions到首頁屏幕內(nèi)容展示
1.1Time Profiler 工具查看main線程的方法耗時宁脊,針對性優(yōu)化啟動時間。主要考慮UI繪制的邏輯镊尺,兩鮮的首頁結(jié)構(gòu)比較復(fù)雜朦佩,需要簡化請求并思,預(yù)加載UI結(jié)構(gòu)庐氮,后渲染圖片等耗時操作。
1.2常規(guī)的iOS常見的圖片i/O耗時宋彼、NSString 占位計算弄砍、NSDateFormatter
1.3全部圖片通過Images.xcassets仙畦,通過字典方式尋址,[UIImage imageNamed:]遍歷尋址效率低
1.4didFinishLaunchingWithOptions的部分lib延遲加載或者再實際使用時候初始化