iOS開發(fā)中『庫』的區(qū)別與應(yīng)用

iOS開發(fā)中『庫』的區(qū)別與應(yīng)用

前言

在iOS開發(fā)中你肯定聽說過.framework桦山、.a秕岛、.tbd.dylib那么這都是啥折汞?那個是靜態(tài)庫倔幼?那個是動態(tài)庫?

1.編譯過程

首先我們先了解一下編譯過程爽待,這有助于我們對「庫」的理解损同。

1.1 編譯過程中的幾個步驟

當(dāng)我們開始build后我們的IDE究竟為我們做了什么事情呢?

  • 預(yù)處理(Pre-process)

預(yù)編譯階段是把宏替換鸟款,刪除注釋膏燃,展開頭文件,產(chǎn)生 .i 文件何什。

  • 編譯(Compliling)

編譯階段是把之前的 .i 文件轉(zhuǎn)換成匯編語言组哩,產(chǎn)生 .s文件。

  • 匯編(Asembly)

匯編階段是把匯編語言文件轉(zhuǎn)換為機(jī)器碼文件,產(chǎn)生 .o 文件伶贰。

  • 鏈接(Link)

連接階段是對.o文件中的對于其他的庫的引用的地方進(jìn)行引用蛛砰,生成最后的可執(zhí)行文件(同時也包括多個 .o 文件進(jìn)行 link)。

1.2 編譯選項(xiàng)

  • Build phases

主要是用來控制從源文件到可執(zhí)行文件的整個過程的黍衙,所以說應(yīng)該是面向源文件的泥畅,包括編譯那些文件,以及在編譯過程中執(zhí)行一些自定義的腳本琅翻。

  • Build rules

主要是用來控制如何編譯某種類型的源文件位仁,例如相對某種類型的源文件進(jìn)行特定的編譯就應(yīng)該在這里進(jìn)行編輯了,同時也會大量的運(yùn)用一些Xcode中的環(huán)境變量望迎。

官方文檔傳送門:Build Setting Reference

查看Xcode中所有環(huán)境變量:
終端->export OBJC_HELP=1

Xcode env.jpg
  • Build settings

主要是對編譯工作的細(xì)節(jié)設(shè)定障癌,在這個窗口中可以看見大量的選項(xiàng),從編譯到打包再到代碼簽名應(yīng)有盡有辩尊,這里要注意 settingssection 分類涛浙,同時一般通過右側(cè)的 inspector 就可以很好的理解選項(xiàng)的意義了。

2. 動態(tài)庫&靜態(tài)庫

Static frameworks are linked at compile time. Dynamic frameworks are linked at runtime. 靜態(tài)庫在編譯期間進(jìn)行鏈接摄欲,動態(tài)庫在運(yùn)行時進(jìn)行鏈接轿亮。

不管是動態(tài)庫還是靜態(tài)庫都是「庫」也就是編譯好的二進(jìn)制文件,它們的區(qū)別在于用法胸墙,那么為什么還要區(qū)分動態(tài)和靜態(tài)呢我注?請看下圖:

Static frameworks.jpg
Dynamic frameworks.jpg
  • 靜態(tài)庫

對于靜態(tài)庫而言,在編譯鏈接的時候迟隅,會將靜態(tài)庫被使用的文件合并到目標(biāo)APP可執(zhí)行文件中但骨,其實(shí)靜態(tài)庫只參與了鏈接過程,因?yàn)樗旧砭褪潜痪幾g好了的.o文件智袭。

靜態(tài)庫鏈接過程

  • 連接器會將所有.o用到的global symbolunresolved symbol放入到一個臨時表奔缠,而且global symbol是不能重復(fù)的。

  • 對于靜態(tài)庫的.o鏈接器會將沒有任何symbolunresolved symbol table忽略

  • 最后吼野,連接器會將函數(shù)的引用替換為其實(shí)際的實(shí)現(xiàn)地址

  • 動態(tài)庫

首先校哎,對于動態(tài)庫其實(shí)分為動態(tài)鏈接庫動態(tài)加載庫兩種,這兩個的本質(zhì)區(qū)別還是加載時間瞳步。

  • 動態(tài)鏈接庫:在沒有被加載到內(nèi)存的前提下闷哆,當(dāng)可執(zhí)行文件被加載,動態(tài)庫也隨著被加載到內(nèi)存中单起。
  • 動態(tài)加載庫:當(dāng)需要使用的時候通過命令進(jìn)行加載抱怔,例如dlopen

小結(jié):

  1. 靜態(tài)庫和動態(tài)庫都是二進(jìn)制文件
  2. 靜態(tài)庫在編譯連接期間就會被合并的可執(zhí)行文件中
  3. 動態(tài)庫可能隨著可執(zhí)行文件的加載而加載,也可能在被使用的時候通過命令加載
  4. 動態(tài)庫由于加載延后所以啟動和加載會更耗時
  5. 在iOS中蘋果通過共享緩存技術(shù)來實(shí)現(xiàn)UIKit嘀倒、Foundation野蝇、CFNetwork等等庫的加載讼稚,同時也減少了APP包的體積

3. 不同后綴庫的區(qū)別

3.1 .framework & .a

  • .a是一個純二進(jìn)制文件,需要配合頭文件绕沈,資源文件一起使用锐想,在iOS中一般用作靜態(tài)庫文件的后綴名。
  • 乍狐。framework中除了有二進(jìn)制文件還有資源文件赠摇,可以直接使用
  • 在不能開發(fā)動態(tài)庫的時候,其實(shí)framework = .a + .h + .bundle浅蚪,在Xcode6以后藕帜,我們可以開發(fā)動態(tài)庫了, framework = 靜態(tài)庫/動態(tài)庫 + .h + .bundle

3.2 .tbd & .dylib

  • .dylib是動態(tài)庫常用的后綴名惜傲,我們主要見過的地方就是libsqlite3.dylib
  • Xcode 7以后我們在導(dǎo)入系統(tǒng)提供的動態(tài)庫的時候不再有.dylib了洽故,取而代之的是.tbd
  • .tbd是一個YAML文本文件,描述了需要連接的動態(tài)庫信息盗誊,主要目的還是為了減少app的下載大小

那么為什么要這樣做呢泄鹏?以下是Stackoverflow上的一篇回答

You can also see a .tbd file if you go to the General tab of your Xcode project and then add a library under Linked Frameworks and Libraries. The .tbd file will be copied to your project.

So it appears that the .dylib file is the actual library of binary code that your project is using and is located in the /usr/lib/ directory on the user's device. The .tbd file, on the other hand, is just a text file that is included in your project and serves as a link to the required .dylib binary. Since this text file is much smaller than the binary library, it makes the SDK's download size smaller.

如果轉(zhuǎn)到Xcode項(xiàng)目的General選項(xiàng)卡寥袭,然后在鏈接框架和庫下添加一個庫拱镐,還可以看到一個.tbd文件慢显。tbd文件將被復(fù)制到您的項(xiàng)目中。

因此开镣,.dylib文件似乎是項(xiàng)目使用的二進(jìn)制代碼的實(shí)際庫刀诬,并且位于用戶設(shè)備的/usr/lib/目錄中。另一方面邪财,.tbd文件只是一個包含在項(xiàng)目中的文本文件陕壹,用作所需的.dylib二進(jìn)制文件的鏈接。因?yàn)檫@個文本文件比二進(jìn)制庫小得多树埠,所以它使得SDK的下載大小更小糠馆。

4.總結(jié)

  1. 靜態(tài)庫主要是.a文件,也有.framework
  2. 動態(tài)庫主要使用.dylib弥奸、.tbd榨惠、.framework作為后綴名
  3. 相對于靜態(tài)庫奋早,動態(tài)庫在包體積上占有絕對優(yōu)勢
  4. 在iOS上由于蘋果做了優(yōu)化盛霎,所以系統(tǒng)的動態(tài)庫通過共享緩存技術(shù)啟動很快,內(nèi)存占用很少
  5. 但是我們自己開發(fā)的動態(tài)庫將不會有4中的優(yōu)勢
  6. 從可用性來看.framework相對于.a在靜態(tài)庫上更有優(yōu)勢

5. 參考資料

iOS 開發(fā)中的『庫』(一)
iOS 開發(fā)中的『庫』(二)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耽装,一起剝皮案震驚了整個濱河市愤炸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掉奄,老刑警劉巖规个,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凤薛,死亡現(xiàn)場離奇詭異,居然都是意外死亡诞仓,警方通過查閱死者的電腦和手機(jī)缤苫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墅拭,“玉大人活玲,你說我怎么就攤上這事〉瘢” “怎么了舒憾?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長穗熬。 經(jīng)常有香客問我镀迂,道長,這世上最難降的妖魔是什么唤蔗? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任探遵,我火速辦了婚禮,結(jié)果婚禮上措译,老公的妹妹穿的比我還像新娘别凤。我一直安慰自己,他們只是感情好领虹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布规哪。 她就那樣靜靜地躺著,像睡著了一般塌衰。 火紅的嫁衣襯著肌膚如雪诉稍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天最疆,我揣著相機(jī)與錄音杯巨,去河邊找鬼。 笑死努酸,一個胖子當(dāng)著我的面吹牛服爷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播获诈,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼仍源,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舔涎?” 一聲冷哼從身側(cè)響起笼踩,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亡嫌,沒想到半個月后嚎于,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掘而,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年于购,在試婚紗的時候發(fā)現(xiàn)自己被綠了袍睡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡肋僧,死狀恐怖女蜈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情色瘩,我是刑警寧澤伪窖,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站居兆,受9級特大地震影響覆山,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泥栖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一簇宽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吧享,春花似錦魏割、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至殊鞭,卻和暖如春遭垛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背操灿。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工锯仪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趾盐。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓庶喜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親救鲤。 傳聞我的和親對象是個殘疾皇子久窟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評論 2 349