關(guān)注度——★★★★
正文——眾所周知,一款軟件、一個客戶端的使用,給人的體驗度是非常重要的,只有有好的體驗度,才會有口碑,才會有越來越多的人使用,而一個客戶端啟動速度是非常重要的,這是用戶對產(chǎn)品的第一印象。
應(yīng)用啟動時間,直接影響用戶對一款應(yīng)用的判斷和使用體驗。頭條主app本身就包含非常多并且復(fù)雜度高的業(yè)務(wù)模塊(如新聞、視頻等),也接入了很多第三方的插件,這勢必會拖慢應(yīng)用的啟動時間,本著精益求精的態(tài)度和對用戶體驗的追求,我們希望在業(yè)務(wù)擴張的同時最大程度的優(yōu)化啟動時間。

main()調(diào)用之前的加載過程
App開始啟動后, 系統(tǒng)首先加載可執(zhí)行文件(自身App的所有.o文件的集合),然后加載動態(tài)鏈接庫dyld,dyld是一個專門用來加載動態(tài)鏈接庫的庫。 執(zhí)行從dyld開始,dyld從可執(zhí)行文件的依賴開始, 遞歸加載所有的依賴動態(tài)鏈接庫。
系統(tǒng)使用動態(tài)鏈接有幾點好處:
代碼共用:很多程序都動態(tài)鏈接了這些 lib,但它們在內(nèi)存和磁盤中中只有一份。
易于維護:由于被依賴的 lib 是程序執(zhí)行時才鏈接的,所以這些 lib 很容易做更新。
減少可執(zhí)行文件體積:相比靜態(tài)鏈接,動態(tài)鏈接在編譯時不需要打進去,所以可執(zhí)行文件的體積要小很多。
找到拖慢啟動應(yīng)用時長的瓶頸
為了找到瓶頸,我們在啟動之后的didFinishLauhcning方法開始執(zhí)行到首頁列表頁的NewsListViewController的viewDidAppear方法,幾乎每個可能比較耗時的流程進行拆分和統(tǒng)計,得到統(tǒng)計數(shù)據(jù)之后發(fā)現(xiàn):
主要耗時在首頁UI構(gòu)造和渲染(storyboard加載,tabBar/topBar渲染,開屏廣告加載/cell注冊/日志模塊初始化這幾個步驟)。
具體優(yōu)化點
因此,針對于今日頭條這個App我們可以優(yōu)化的點如下:
1.純代碼方式而不是storyboard加載首頁UI。
2.對didFinishLaunching里的函數(shù)考慮能否挖掘可以延遲加載或者懶加載,需要與各個業(yè)務(wù)方pm和rd共同check 對于一些已經(jīng)下線的業(yè)務(wù),刪減冗余代碼。
對于一些與UI展示無關(guān)的業(yè)務(wù),如微博認證過期檢查、圖片最大緩存空間設(shè)置等做延遲加載
3.對實現(xiàn)了+load()方法的類進行分析,盡量將load里的代碼延后調(diào)用。
4.上面統(tǒng)計數(shù)據(jù)顯示展示feed的導(dǎo)航控制器頁面(NewsListViewController)比較耗時,對于viewDidLoad以及viewWillAppear方法中盡量去嘗試少做,晚做,不做。