iOS應用啓動流程分析之dyld過程初探

前言:做爲一個開發者,若是你熟悉不少語言的開發,你會發現大部分語言的一個共同點,main函數。咱們都是從main函數開始,去關注程序的編寫、編譯和執行過程。main函數以前,系統有沒有作一些其餘的工做,作了哪些工做呢,一塊兒來看看?web

1、應用啓動分析

一、程序從編寫到執行的過程

編譯過程.png

一、代碼怎麼加載到內存?編程

二、靜態庫、動態庫怎麼加載到內存?markdown

三、objc_init -> objc 在哪裏執行的?app

咱們能夠想一下以上的過程是怎麼發生的,各個環節都是怎麼加載到內存的?ide

二、靜態庫和動態庫

咱們常常在項目中使用靜態庫和動態庫,其中系統提供的UIKit,Foundation庫,WebKit庫等等,這些是動態庫,好比咱們常常使用的自定義的靜態Framework,.a文件,就是屬於靜態庫。那麼,靜態庫和動態庫是怎麼區分的?函數

靜態庫和動態庫.png

  • 動態庫形式:.dylib和.framework工具

  • 靜態庫形式:.a和.frameworkoop

如上圖所示,咱們分析:post

一、靜態庫:連接時,靜態庫會被完整地複製到可執行文件中,被屢次使用就有多份冗餘拷貝spa

二、動態庫:連接時不復制,程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存

可是,系統的動態庫怎麼加載到內存呢?經過什麼方式?這裏就用到了一個工具dyld動態連接器。

三、動態連接器

3.1 動態連接器的工做過程

dyld加載.png

上面是dyld的加載工做流程圖,經過它主要進行了動態庫的註冊和動態庫的加載過程。

2、dyld過程初探

  • 經過上面原理的總體分析後,咱們接下來就進行應用程序代碼執行邏輯的分析

image.png

在main函數的入口位置,加上斷點,運行後程序停在斷點位置,通過堆棧打印(bt爲lldb堆棧打印命令),發現程序是崩潰在了lldb中,這裏咱們並不能獲取更多信息去跟蹤。

因而,咱們經過編程經驗,想到了在程序執行main函數以前,會提早執行load函數的加載,那麼就作一下嘗試,在ViewController中假如load函數,並添加斷點,運行程序。

image.png

結果很順利,咱們斷點停在了ViewController的load方法,經過堆棧打印,發現了關於dyld的一系列函數過程。下面就引出咱們探究的主題:dyld(動態連接器),咱們的函數追蹤,也將按照這樣一個順序去進行!

一、dyld簡介

dyld(the dynamic link editor)是蘋果的動態連接器,是蘋果操做系統一個重要組成部分,在系統內核作好程序準備工做以後,交由dyld負責餘下的工做。並且它是開源的,任何人能夠經過蘋果官網下載它的源碼來閱讀理解它的運做方式,瞭解系統加載動態庫的細節。

二、dyld的源碼

蘋果官方 dyld庫 下載地址

image.png

這裏咱們選擇最新的版本進行研究,技術嘛,總要與時俱進,下載完這些,先不急,先來一個蘋果的官方視頻介紹,關於dyld2,到dyld3過程的更新、特性,而後咱們在下一章介紹 dyld 的探究過程。

三、蘋果官方關於dyld的介紹視頻

App Startup Time: Past, Present, and Future https://developer.apple.com/videos/play/wwdc2017/413/

3、總結

咱們這裏介紹了應用啓動過程的大概過程分析,主要有:

一、動態庫與靜態庫的概念和理解

二、dyld的概念和連接過程解析

三、咱們是如何知道程序是在main函數以前進入了dyld

關於dyld的詳細執行過程,下一節單獨講解!

連接:iOS應用啓動流程分析之dyld源碼解析

🌺更多內容期待與你一塊兒分享,喜歡的話,點個贊點個關注,持續爲您創造好的內容。

相關文章
相關標籤/搜索