最近的工作是制作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)目。
動(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即可纷宇。
這篇文章寫的挺好:
http://www.reibang.com/p/fb5083f2c0d2