前言:
iOS的軟件開發(fā)工具包SDK,一般是以庫的形式出現(xiàn)蔚约,從本質上來說是一種可執(zhí)行代碼的二進制格式奄妨,可以被載入內存中執(zhí)行。開發(fā)過程中苹祟,我們常常會用到第三方的SDK砸抛。尤其是微信、QQ树枫、百度地圖直焙、支付功能等。其實我們也可以制作屬于自己的庫文件呢砂轻?如果奔誓,將自己寫的功能類編譯成庫文件,分發(fā)給其他人來使用呢搔涝?
庫分 靜態(tài)庫 和 動態(tài)庫 兩種:
1厨喂、靜態(tài)庫有 .a 和 .framework兩種形式和措;
2、動態(tài)庫有.dylib 和 .framework 形式蜕煌,后來.dylib動態(tài)庫又被蘋果替換成.tbd的形式派阱。
靜態(tài)庫和動態(tài)庫區(qū)別,是相對編譯期和運行期的:
1斜纪、靜態(tài)庫在程序編譯時會被鏈接到目標代碼中颁褂,程序運行時將不再需要改靜態(tài)庫;
2傀广、動態(tài)庫在程序編譯時并不會被鏈接到目標代碼中颁独,只是在程序運行時才被載入,因為在程序運行期間還需要動態(tài)庫的存在伪冰。
PS總結:
1誓酒、同一個靜態(tài)庫在不同程序中使用時,每一個程序中都得導入一次贮聂,打包時也被打包進去靠柑,形成一個程序;
2吓懈、而動態(tài)庫在不同程序中歼冰,打包時并沒有被打包進去,只在程序運行使用時耻警,才鏈接載入(如系統(tǒng)的框架如UIKit隔嫡、Foundation等),所以程序體積會小很多甘穿,但是蘋果不讓使用自己的動態(tài)庫腮恩,否則審核就無法通過。
這篇文章主要先針對.a文件靜態(tài)庫的制作過程進行闡述温兼,好了下面我們開始吧秸滴!
1、新建靜態(tài)庫募判,如圖示:
創(chuàng)建完工程之后我們進入看到的是這樣的:
新創(chuàng)建出來的.a庫還沒有進行編譯荡含,所以還沒有生成,顯示為紅色(run之后就變成了黑色)
2届垫、如何編譯一個.a靜態(tài)庫文件:
我們可以在系統(tǒng)默認的CYBCount.h和CYBCount.m進行編寫自己的代碼释液,也可以刪除后新建文件進行代碼的開發(fā),這里不做過多介紹敦腔,下面以系統(tǒng)默認的文件為例寫入一個方法均澳,并暴露在.h中:
+(void)MyFirstSDKAction{
NSLog(@"It is my first SDK test.");
}
然后修改導入的靜態(tài)庫文件配置,如下所示:
點擊之后符衔,按照以下步驟操作:
PS:如果不將【Build Configuration】改為Release找前,則打包出來的靜態(tài)庫會存于Debug-iphoneos和Debug-iphonesimulator兩個文件夾下。我們一般都使用Release模式判族,因為程序最終發(fā)布的是Release版的躺盛,所以靜態(tài)庫也是在Release模式下使用。
最后我們需要修改一下【Bulid Active Architecture Only】編譯的指令集形帮,如下圖:
PS:為什么我們要把【Bulid Active Architecture Only】的Release的設置這是為NO呢槽惫?
模擬器:iPhone4s~5 : i386
iPhone5s~6plus : x86_64
真 機:iPhone3gs~4s : armv7
iPhone5~5c : armv7s
iPhone5s~6plus : arm64
如何設置為YES,那么編譯出來的 .a 靜態(tài)庫就只包含當前設備的指令集辩撑。
舉個例子:若我們選擇iPhone 5模擬器Command+B編譯界斜,則編譯出來的 .a 靜態(tài)庫只能用iPhone4s~5模擬器跑程序,用iPhone5s~6plus合冀,則會報找不到x86_64的libMyFriSDK.a庫各薇。
設置為NO,則會把所有指令集的都打包合并君躺。
修改了編譯的指令集之后峭判,我們對工程進行編譯,快捷鍵Command+B
注意編譯時棕叫,需要用 模擬器 和 真機 各編譯一次林螃,這樣Products目錄下的libMyFriSDK.a靜態(tài)庫才會變?yōu)楹谏益Ishow in Finder俺泣,可以進入Products目錄下疗认,如下圖:
通過模擬器和真機各編譯一次后,我們可以在Products目錄下看到兩個文件夾:
Release-iphoneos文件夾里面有【真機】使用的.a靜態(tài)庫文件伏钠;
Release-iphonesimulator文件夾里面的是【模擬器】使用的.a靜態(tài)庫文件侮邀;
讓我們分別用命令行l(wèi)ipo -info XXXX.a的形式來查看這兩個.a文件的兼容屬性是什么吧,如下圖:
可以看出:支持真機的屬性包括armv7和arm64贝润;支持模擬器的屬性包括i386和x86_64
3绊茧、如何合并一個.a靜態(tài)庫文件
好了到了最后一步了,合并靜態(tài)庫打掘,步驟如下:
如果想要通用的靜態(tài)庫华畏,那我們需要將 模擬器使用的靜態(tài)庫 與 真機使用的靜態(tài)庫 合并成一個靜態(tài)庫,可以使用終端命令來實現(xiàn)尊蚁,如下圖:
命令格式:lipo -create 真機里.a文件的絕對路徑 第二個模擬器里.a文件的絕對路徑 -output 最終的.a文件路徑亡笑。 記得每一個文件路徑輸入后都需要用 空格 隔開哦
本文使用的命令如下:
lipo -create /Users/soutsubamehei/Library/Developer/Xcode/DerivedData/CYBCount-cxopjbchxzrxoafkulsubkazfkhr/Build/Products/Release-iphoneos/libCYBCount.a /Users/soutsubamehei/Library/Developer/Xcode/DerivedData/CYBCount-cxopjbchxzrxoafkulsubkazfkhr/Build/Products/Release-iphonesimulator/libCYBCount.a -output /Users/soutsubamehei/Desktop/CYBCount/CYBCountSDK.a
終端執(zhí)行完此命令之后,如圖:
沒有任何報錯信息横朋,證明.a文件已經成功生成仑乌,此時可以去自己設置的合并后的路徑中進行查看:
可以看到,.a文件已經成功生成,可以在終端看一下它所支持的屬性晰甚,如圖:
可以看到衙传,現(xiàn)在合成后的.a包已經支持所有屬性了。
PS:這里有人就很疑惑了為什么真機沒有armv7s架構厕九,那是否支持5和5c呢蓖捶?經過與身邊的一些用過合并的大神實踐操作證實,其實是可以兼容這兩種特殊機型的扁远,大家可以嘗試一下俊鱼!
4、如何集成通用.a靜態(tài)庫文件到項目中
將以上合并的通用版本的靜態(tài)庫文件libSDK.a還有你需要引用的.h頭文件拖入項目中即可畅买。這時你的靜態(tài)庫并闲,可以使用真機+模擬器,大功告成谷羞!~
【以上操作純屬個人見解帝火,有大神路過勿噴,如有雷同純屬巧合】