iOS-底層原理 32:啟動優(yōu)化(二)優(yōu)化建議

iOS 底層原理 文章匯總

啟動

啟動的過程一般是指從用戶點擊app圖標開始到AppDelegate 的didFinishLaunching方法執(zhí)行完成為止,其中嗜历,啟動也分為冷啟動和熱啟動

  • 冷啟動:內(nèi)存中不包含app相關數(shù)據(jù)的啟動撵割,一般我們可以通過重啟手機來實現(xiàn)冷啟動

  • 熱啟動:是指殺掉app進程后,數(shù)據(jù)仍然存在時的啟動

而我們這里所說的啟動優(yōu)化桅狠,一般是指冷啟動情況下的兰怠,這種情況下的啟動主要分為兩部分:

  • T1pre-main階段垃僚,即main函數(shù)之前,操作系統(tǒng)加載App可執(zhí)行文件到內(nèi)存错妖,執(zhí)行一系列的加載&鏈接等工作绿鸣,簡單來說,就是dyld加載過程

  • T2:main函數(shù)之后暂氯,即從main函數(shù)開始潮模,到Appdelegate 的didFinishLaunching方法執(zhí)行完成為止,主要是構建第一個界面痴施,并完成渲染

所以擎厢,T1+T2的過程 就是 從用戶點擊App圖標到用戶能看到app主界面的過程,即需要啟動優(yōu)化的部分

pre-main階段的優(yōu)化

iOS-底層原理 15:dyld加載流程中辣吃,已經(jīng)了解過了dyld的加載流程动遭。pre-main階段的啟動時間其實就是dyld加載過程的時間

針對main函數(shù)之前的啟動時間,蘋果提供了內(nèi)建的測量方法神得,在Edit Scheme -> Run -> Arguments ->Environment Variables點擊+添加環(huán)境變量 DYLD_PRINT_STATISTICS 設為 1)厘惦,然后運行,以下是iPhone7p正常啟動的pre-main時間(以WeChat為例)

pre-main啟動時間示例

說明
pre-main階段總共用時1.7s

  • dylib loading time(動態(tài)庫耗時):主要是加載動態(tài)庫哩簿,用時320.32ms

  • rebase/binding time(偏移修正/符號綁定耗時)宵蕉,耗時160.52ms

    • rebase(偏移修正):任何一個app生成的二進制文件,在二進制文件內(nèi)部所有的方法节榜、函數(shù)調(diào)用羡玛,都有一個地址,這個地址是在當前二進制文件中的偏移地址宗苍。一旦在運行時刻(即運行到內(nèi)存中)稼稿,每次系統(tǒng)都會隨機分配一個ASLR(Address Space Layout Randomization,地址空間布局隨機化)地址值(是一個安全機制讳窟,會分配一個隨機的數(shù)值让歼,插入在二進制文件的開頭),例如挪钓,二進制文件中有一個 test方法是越,偏移值是0x0001耳舅,而隨機分配的ASLR是0x1f00碌上,如果想訪問test方法倚评,其內(nèi)存地址(即真實地址)變?yōu)?ASLR+偏移值 = 運行時確定的內(nèi)存地址(即0x1f00+0x0001 = 0x1f01)

    • binding(綁定):,例如NSLog方法馏予,在編譯時期生成的mach-o文件中天梧,會創(chuàng)建一個符號!NSLog(目前指向一個隨機的地址)霞丧,然后在運行時(從磁盤加載到內(nèi)存中呢岗,是一個鏡像文件),會將真正的地址給符號(即在內(nèi)存中將地址與符號進行綁定蛹尝,是dyld做的后豫,也稱為動態(tài)庫符號綁定),一句話概括:綁定就是給符號賦值的過程

  • ObjC setup time(OC類注冊的耗時):OC類越多突那,越耗時

  • initializer time(執(zhí)行l(wèi)oad和構造函數(shù)的耗時)

針對這幾部挫酿,有以下幾點優(yōu)化建議:

  • 盡量少用外部動態(tài)庫,蘋果官方建議自定義的動態(tài)庫最好不要超過6個愕难,如果超過6個早龟,需要合并動態(tài)庫

  • 減少OC類,因為OC類越多猫缭,越耗時

  • 將不必須在+load方法中做的事情延遲到+initialize中葱弟,盡量不要用C++虛函數(shù)

  • 如果是swift,盡量使用struct

main函數(shù)階段的優(yōu)化

在main函數(shù)之后的didFinishLaunching方法中猜丹,主要是執(zhí)行了各種業(yè)務芝加,有很多并不是必須在這里立即執(zhí)行的,這種業(yè)務我們可以采取延遲加載射窒,防止影響啟動時間妖混。

didFinishLaunching中的業(yè)務主要分為三個類型

  • 【第一類】初始化第三方sdk
  • 【第二類】app運行環(huán)境配置
  • 【第三類】自己工具類的初始化等

main函數(shù)階段的優(yōu)化建議主要有以下幾點:

  • 減少啟動初始化的流程,能懶加載的懶加載轮洋,能延遲的延遲制市,能放后臺初始化的放后臺,盡量不要占用主線程的啟動時間

  • 優(yōu)化代碼邏輯弊予,去除非必須的代碼邏輯祥楣,減少每個流程的消耗時間

  • 啟動階段能使用多線程來初始化的,就使用多線程

  • 盡量使用純代碼來進行UI框架的搭建汉柒,尤其是主UI框架误褪,例如UITabBarController。盡量避免使用Xib或者SB碾褂,相比純代碼而言兽间,這種更耗時

  • 刪除廢棄類、方法

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末正塌,一起剝皮案震驚了整個濱河市嘀略,隨后出現(xiàn)的幾起案子恤溶,更是在濱河造成了極大的恐慌,老刑警劉巖帜羊,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咒程,死亡現(xiàn)場離奇詭異,居然都是意外死亡讼育,警方通過查閱死者的電腦和手機帐姻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奶段,“玉大人饥瓷,你說我怎么就攤上這事”约” “怎么了扛伍?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長词裤。 經(jīng)常有香客問我刺洒,道長,這世上最難降的妖魔是什么吼砂? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任逆航,我火速辦了婚禮,結(jié)果婚禮上渔肩,老公的妹妹穿的比我還像新娘因俐。我一直安慰自己,他們只是感情好周偎,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布抹剩。 她就那樣靜靜地躺著,像睡著了一般蓉坎。 火紅的嫁衣襯著肌膚如雪澳眷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天蛉艾,我揣著相機與錄音钳踊,去河邊找鬼。 笑死勿侯,一個胖子當著我的面吹牛拓瞪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播助琐,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼祭埂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了兵钮?” 一聲冷哼從身側(cè)響起蛆橡,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤舌界,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后航罗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡屁药,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年粥血,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酿箭。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡复亏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缭嫡,到底是詐尸還是另有隱情缔御,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布妇蛀,位于F島的核電站耕突,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏评架。R本人自食惡果不足惜眷茁,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纵诞。 院中可真熱鬧上祈,春花似錦、人聲如沸浙芙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗡呼。三九已至纸俭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間南窗,已是汗流浹背掉蔬。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留矾瘾,地道東北人女轿。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像壕翩,于是被迫代替她去往敵國和親蛉迹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容