關(guān)于Framework的一點(diǎn)看法

最近的工作是制作SDK扮惦,而在公司的SDK內(nèi)部需要用到第三方的SDK臀蛛,這就出現(xiàn)了Framework包含或依賴Framework的的情況。就把自己的一點(diǎn)看法記錄下來。
名詞解釋:
包含:不需要對(duì)外暴露內(nèi)部所使用的三方庫
依賴:需要對(duì)外暴露內(nèi)部使用的三方庫

什么是靜態(tài)庫 (Static Library)

所謂靜態(tài)庫浊仆,或者說 .a 文件客峭,就是一系列從源碼編譯的目標(biāo)文件的集合。它是你的源碼的實(shí)現(xiàn)所對(duì)應(yīng)的二進(jìn)制抡柿。配合上公共的 .h 文件舔琅,我們可以獲取到 .a 中暴露的方法或者成員等。在最后編譯 app 的時(shí)候.a 將被鏈接到最終的可執(zhí)行文件中洲劣,之后每次都隨著app的可執(zhí)行二進(jìn)制文件一同加載备蚓,你不能控制加載的方式和時(shí)機(jī),所以稱為靜態(tài)庫囱稽。
Framework也分為靜態(tài)庫和動(dòng)態(tài)庫郊尝。其中動(dòng)態(tài)庫又區(qū)分為系統(tǒng)的真正的動(dòng)態(tài)庫,自己制作的只能在APP內(nèi)部使用的動(dòng)態(tài)庫(Cocoa Touch Framework)战惊。

在 iOS 8 之前流昏,iOS 只支持以靜態(tài)庫的方式來使用第三方的代碼。

什么是動(dòng)態(tài)庫 (Dynamic Framework)

與靜態(tài)相對(duì)應(yīng)的當(dāng)然是動(dòng)態(tài)吞获。我們每天使用的 iOS 系統(tǒng)的框架是以 .framework 結(jié)尾的况凉,它們就是動(dòng)態(tài)庫。

Framework 其實(shí)是一個(gè) bundle各拷,或者說是一個(gè)特殊的文件夾刁绒。系統(tǒng)的 framework 是存在于系統(tǒng)內(nèi)部,而不會(huì)打包進(jìn) app 中撤逢。app 啟動(dòng)的時(shí)候會(huì)檢查所需要的動(dòng)態(tài)框架是否已經(jīng)加載膛锭。像 UIKit 之類的常用系統(tǒng)框架一般已經(jīng)在內(nèi)存中,就不需要再次加載蚊荣,這可以保證 app 啟動(dòng)速度初狰。相比靜態(tài)庫,framework 是自包含的互例,你不需要關(guān)心頭文件位置等奢入,使用起來很方便。

Cocoa Touch Framework

Apple 從 iOS 8 開始允許開發(fā)者有條件地創(chuàng)建和使用動(dòng)態(tài)框架媳叨,這種框架叫做 Cocoa Touch Framework腥光。
雖然同樣是動(dòng)態(tài)框架,但是和系統(tǒng) framework 不同糊秆,app 中的使用的 Cocoa Touch Framework 在打包和提交 app 時(shí)會(huì)被放到 app bundle 中武福,運(yùn)行在沙盒里,而不是系統(tǒng)中痘番。也就是說捉片,不同的 app 就算使用了同樣的 framework平痰,但還是會(huì)有多份的框架被分別簽名,打包和加載伍纫。

動(dòng)態(tài)庫宗雇、靜態(tài)庫的相互包含(Add to targets 也就是 Link Binary With Libraries)

.a靜態(tài)庫:
1 .a靜態(tài)庫內(nèi)部可以包含.a靜態(tài)庫
2 .a靜態(tài)庫內(nèi)部不可以包含.framework靜態(tài)庫
3 .a靜態(tài)庫內(nèi)部不可以包含.framework動(dòng)態(tài)庫

.framework靜態(tài)庫
1 .framework靜態(tài)庫內(nèi)部可以包含.a靜態(tài)庫
2 .framework靜態(tài)庫內(nèi)部不可以包含.framework靜態(tài)庫
3 .framework靜態(tài)庫內(nèi)部不可以包含.framework動(dòng)態(tài)庫

.framework動(dòng)態(tài)庫
1 .framework動(dòng)態(tài)庫內(nèi)部可以包含.a靜態(tài)庫
2 .framework動(dòng)態(tài)庫內(nèi)部可以包含.framework靜態(tài)庫
3 .framework動(dòng)態(tài)庫內(nèi)部不可以包含.framework動(dòng)態(tài)庫

動(dòng)態(tài)庫、靜態(tài)庫的相互依賴(Add to targets 不添加)

以上不能包含的都可以使用依賴來解決莹规。

.a靜態(tài)庫:
1赔蒲、可以引用.framework靜態(tài)庫,使用時(shí)需要兩者都添加到項(xiàng)目良漱。
1舞虱、可以引用.framework動(dòng)態(tài)庫,使用時(shí)需要兩者都添加到項(xiàng)目母市。

.framework靜態(tài)庫
1砾嫉、可以依賴.a靜態(tài)庫,使用時(shí)需要兩者都添加到項(xiàng)目窒篱。
2、可以依賴.framework靜態(tài)庫舶沿,使用時(shí)需要兩者都添加到項(xiàng)目墙杯。
3、可以依賴.framework動(dòng)態(tài)庫括荡,使用時(shí)需要兩者都添加到項(xiàng)目高镐。

.framework動(dòng)態(tài)庫
1、引用.a靜態(tài)庫時(shí)畸冲,編譯報(bào)錯(cuò)嫉髓。
2、引用.framework靜態(tài)庫時(shí)邑闲,可以編譯通過算行,但是運(yùn)行閃退。
3苫耸、可以引用.framework動(dòng)態(tài)庫州邢,使用時(shí)需要兩者都添加到項(xiàng)目。


image.png

測試Demo地址

動(dòng)態(tài)庫褪子、靜態(tài)庫相互包含或依賴的解決方案

如果需要對(duì)外提供一個(gè)SDK D量淌,D內(nèi)部還需要用到A、B嫌褪、C三個(gè)庫呀枢,則可以這樣設(shè)計(jì)。
第一種:
A笼痛、B裙秋、C都是靜態(tài)庫.a D是靜態(tài)庫.framework
第二種:
A琅拌、B、C都是靜態(tài)庫.framework D是動(dòng)態(tài)庫.framework
第三種:
A是靜態(tài)庫.a B是靜態(tài)庫.framework C是靜態(tài)庫.framework D是動(dòng)態(tài)庫.framework

如果要求B是動(dòng)態(tài)庫.framework残吩,則:
A:靜態(tài)庫.a
B:動(dòng)態(tài)庫.framework
C:靜態(tài)庫.framework
D:動(dòng)態(tài)庫.framework

B包含A财忽,C依賴B,D包含C泣侮,最終只需要對(duì)外提供D即彪,B這兩個(gè)動(dòng)態(tài)庫就行了。
注意:A活尊、B隶校、C、D之間的關(guān)系蛹锰。包含也就是Add to targets深胳,依賴也就是不Add to targets。

如果靜態(tài)庫多次被copy铜犬,則會(huì)出現(xiàn)提示庫使用重復(fù)的警告舞终,而且無法通過xcodebuild打包成功。這個(gè)時(shí)候就需要檢查 add to target的使用是否正確癣猾。

可以通過file命令檢查當(dāng)前庫是動(dòng)態(tài)庫還是靜態(tài)庫:
cd /Users/leo/Desktop/TXLiteAVSDK_TRTC.framework
file TXLiteAVSDK_TRTC

知道當(dāng)前庫為靜態(tài)庫(current ar archive)

TXLiteAVSDK_TRTC: Mach-O universal binary with 4 architectures: [arm_v7:current ar archive] [i386] [x86_64] [arm64]
TXLiteAVSDK_TRTC (for architecture armv7):  current ar archive
TXLiteAVSDK_TRTC (for architecture i386):   current ar archive
TXLiteAVSDK_TRTC (for architecture x86_64): current ar archive
TXLiteAVSDK_TRTC (for architecture arm64):  current ar archive

如果是動(dòng)態(tài)庫(Mach-O dynamically)敛劝,顯示如下:

ImSDK: Mach-O universal binary with 3 architectures: [x86_64:Mach-O 64-bit dynamically linked shared library x86_64] [arm_v7] [arm64]
ImSDK (for architecture x86_64):    Mach-O 64-bit dynamically linked shared library x86_64
ImSDK (for architecture armv7): Mach-O dynamically linked shared library arm_v7
ImSDK (for architecture arm64): Mach-O 64-bit dynamically linked shared library arm64

暴露動(dòng)態(tài)庫A里面包含的靜態(tài)庫B

動(dòng)態(tài)庫A不用修改,只需要在使用到B的外部項(xiàng)目中再引入一次B即可纷宇。

WechatIMG1.jpeg

這篇文章寫的挺好:
http://www.reibang.com/p/fb5083f2c0d2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夸盟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子像捶,更是在濱河造成了極大的恐慌上陕,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拓春,死亡現(xiàn)場離奇詭異释簿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)痘儡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門辕万,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沉删,你說我怎么就攤上這事渐尿。” “怎么了矾瑰?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵砖茸,是天一觀的道長。 經(jīng)常有香客問我殴穴,道長凉夯,這世上最難降的妖魔是什么货葬? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮劲够,結(jié)果婚禮上震桶,老公的妹妹穿的比我還像新娘。我一直安慰自己征绎,他們只是感情好蹲姐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著人柿,像睡著了一般柴墩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凫岖,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天江咳,我揣著相機(jī)與錄音,去河邊找鬼哥放。 笑死歼指,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的甥雕。 我是一名探鬼主播东臀,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼犀农!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宰掉,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤呵哨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后轨奄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孟害,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年挪拟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挨务。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玉组,死狀恐怖谎柄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惯雳,我是刑警寧澤朝巫,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站石景,受9級(jí)特大地震影響劈猿,放射性物質(zhì)發(fā)生泄漏拙吉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一揪荣、第九天 我趴在偏房一處隱蔽的房頂上張望筷黔。 院中可真熱鬧,春花似錦仗颈、人聲如沸佛舱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽名眉。三九已至,卻和暖如春凰棉,著一層夾襖步出監(jiān)牢的瞬間损拢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工撒犀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留福压,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓或舞,卻偏偏與公主長得像荆姆,于是被迫代替她去往敵國和親映凳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胆筒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354