這段時間公司需要把一個工程里的代碼抽出來制作成靜態(tài)庫, 所以就研究了一下怎么打包靜態(tài)庫
一些概念的補(bǔ)充
-
什么是庫?
所謂庫就是程序代碼的集合,是共享程序代碼的一種方式。
-
庫的分類
根據(jù)程序代碼的開源情況,庫可以分為兩類
-
開源庫
源代碼是公開的,你可以看到具體實現(xiàn)。比如GitHub上比較出名的第三方框架AFNetworking、SDWebImage。
-
閉源庫
不公開源代碼,只公開調(diào)用的接口,看不到具體的實現(xiàn),是一個編譯后的二進(jìn)制文件。這種常見于一些公司的SDK包,比如高德地圖SDK、環(huán)信即時通訊SDK等等。而閉源庫又分為兩類:靜態(tài)庫和動態(tài)庫。本篇重點要講的便是其中的靜態(tài)庫。
-
3、靜態(tài)庫和動態(tài)庫的存在形式和使用區(qū)別
-
存在形式:
-
靜態(tài)庫
以".a"或者“.framework”為文件后綴名
-
動態(tài)庫
以".dylib"或者“.framework”為文件后綴名
-
-
使用區(qū)別:
- 靜態(tài)庫鏈接時會被完整的復(fù)制到可執(zhí)行文件中,被多次使用就有多份拷貝。
- 動態(tài)庫鏈接時不復(fù)制,程序運行時由系統(tǒng)動態(tài)加載到內(nèi)存,供程序調(diào)用。而且系統(tǒng)只加載一次,多個程序共用,節(jié)省內(nèi)存。
.a文件靜態(tài)庫打包
-
打開Xcode創(chuàng)建一個新的工程,這里以Xcode8為例,選擇工程如下:
WX20170611-160303@2x.png -
把需要打包的文件放入到根目錄里面(注意是根目錄)
- 自動生成的 .h 和 .m 文件可以刪除

-
公開接口或者頭文件供人調(diào)用
-
targets->Build Phases->Copy Files->"+"你需要公開的頭文件
WX20170611-161122@2x.png
-
- 靜態(tài)庫也分為 Debug 和 Release 這里我們可以直接選擇 Release

-
選擇編譯設(shè)備(真機(jī) 或者 模擬器)
- 注: 真機(jī)打包的只能在真機(jī)上運行, 模擬器打包的只能在模擬器上運行, 不然會報錯, 可以在真機(jī)上打一個包, 模擬器上打一個包 然后合并.
WX20170611-161949@2x.png
-
此時需要配置的都已經(jīng)完成按住 cmd+B 編譯成功之后可以看到 Products 文件夾里面的 .a 文件從紅色變成黑色(注: 可能不會改變顏色, 可以關(guān)閉 Xcode 重新打開, 此時顏色應(yīng)該改變了,不改變也沒有關(guān)系!!!)
-
選中文件點擊 Show in Finder
WX20170611-161808@2x.png -
此時文件里面有個 .a 文件 和 一個文件夾如果要使用這個的話需要把兩個文件全部放到工程文件里面
WX20170611-162314@2x.png
-
.framework文件靜態(tài)庫打包
-
和 .a 文件的創(chuàng)建一樣 直接把需要打包的代碼放到根目錄里面, 不同的是 自動生成的.h 文件不用刪除 (注: 可以把需要暴露出來的多個頭文件放到這個.h文件中,到時只要引用這一次頭文件就OK了)
WX20170611-173037@2x.png -
把需要暴露出來的頭文件寫入到.h文件里面,寫法<工程名/頭文件.h>
WX20170612-091729@2x.png -
暴露頭文件,和 .a 文件不同的是 .framework文件是在 Headers 里面暴露出來
WX20170611-173406@2x.png -
和 .a文件一樣,.frmeworke靜態(tài)庫也分為 Debug 和 Release 這里我們可以直接選擇 Release
WX20170611-161212@2x-2.png -
設(shè)置打包的是靜態(tài)庫。因為動態(tài)庫也可以是以framework形式存在,所以需要設(shè)置,否則默認(rèn)打出來的是動態(tài)庫
- target->BuildSetting ->搜索關(guān)鍵字mach->Mach-o Type 設(shè)為Static Library(這個默認(rèn)選項是動態(tài)的)

-
和.a文件一樣, .framework 也分為真機(jī)運行 和模擬器運行, 所以 真機(jī)運行一次, 模擬器運行一次, 然后合并
WX20170611-173725@2x.png -
雙擊.framework 文件,可以看到
WX20170611-174032@2x.png 把SDK合并完成之后,直接替換掉.framework 文件里面的SDK文件就可以了
靜態(tài)庫適配Bitcode
在我第一次打包成功之后,使用靜態(tài)庫,在運行在真機(jī) 模擬器沒有任何錯誤,然后打包工程的時候,報錯了,錯誤信息是沒有適配Bitcode
- 第一件事是在Target->Build Settings->Build Options中開啟Enable BitCode.
- 然后去Target->Build Settings->Custom Compiler Flags中加入-fembed-bitcode。
如圖:

靜態(tài)庫合并
-
讓工程在真機(jī)和模擬器上各運行一次, 然后點擊 Show in Finder 選擇文件夾 分欄展示, 可以看到文件的上一級有兩個文件夾 Release-iphoneos 和 Release-iphonesimulator
WX20170611-162630@2x.png -
對這兩個.a文件進(jìn)行合并: 打開終端 在終端里面執(zhí)行
lipo -create 第一個.a文件的絕對路徑 第二個.a文件的絕對路徑 -output 最終的.a文件路徑。
本文中使用的命令如下:
lipo -create
/Users/harvey/Library/Developer/Xcode/DerivedData/FMDB-ctegiztcjikewoeprxxtmryzetfa/Build/Products/Release-iphoneos/libFMDB.a
/Users/harvey/Library/Developer/Xcode/DerivedData/FMDB-ctegiztcjikewoeprxxtmryzetfa/Build/Products/Release-iphonesimulator/libFMDB.a
-output
/Users/harvey/Desktop/libFMDB.a
靜態(tài)庫的使用
-
.a靜態(tài)庫的使用
- 把打包生成的 .a 文件 和 暴露出來的頭文件 及 使用的其他資源(例: 圖片, 音頻...) 拖入到工程中, 然后在使用的地方導(dǎo)入暴露出來的相應(yīng)的頭文件即可.
-
.framework 靜態(tài)庫的使用
-
直接把打包好的靜態(tài)塊拖入進(jìn)工程里面, 在相應(yīng)的地方引入頭文件,用尖括號包起來 例:
#import <LinkPayLoanSDK/LinkPayLoanSDK.h>
-
Bundel 文件
Bundel文件是什么
什么是Bundle文件?
簡單理解,就是資源文件包。我們將許多圖片、XIB、文本文件組織在一起,打包成一個Bundle文件。方便在其他項目中引用包內(nèi)的資源。Bundle文件的特點?
Bundle是靜態(tài)的,也就是說,我們包含到包中的資源文件作為一個資源包是不參加項目編譯的。也就意味著,bundle包中不能包含可執(zhí)行的文件。它僅僅是作為資源,被解析成為特定的2進(jìn)制數(shù)據(jù)。
Bundle文件制作
直接在桌面新建一個文件夾然后把后綴名改為 .bundle 就可以了, 向里面放文件的時候直接雙擊打開,然后把文件拖入進(jìn)去
Bundle文件使用
把生成的.bundle文件拖入工程中, 使用規(guī)則: Bundle文件名稱.bundle/資源名稱,例:
[UIImage imageNamed:@"LinkPayBundle.bundle/LinkPaySDKback"]











