導(dǎo)讀
出于安全性和穩(wěn)定性的考慮坎吻,不想被外界知道婴渡,所以會把核心代碼打包成庫,只暴露出頭文件以供使用敞映。
庫分靜態(tài)庫和動態(tài)庫兩種较曼。
二次封裝AF網(wǎng)絡(luò)請求為例:如果代碼里面不需要 AF磷斧,則導(dǎo)入AF 的時候,Add to targets. 不需要選擇捷犹,這樣才不會有引用弛饭,造成.a 文件與源文件沖突,造成的編譯失斊记浮)
- 靜態(tài)庫:
.a 和 .framework 兩種形式侣颂。
.a 是一個純二進制文件,.framework 中除了有二進制文件之外還有資源文件枪孩。
.a 憔晒,要有 .h 文件以及資源文件配合藻肄, .framework 文件可以直接使用。
總的來說拒担,.a + .h + sourceFile = .framework嘹屯。
所以創(chuàng)建靜態(tài)庫最好還是用.framework的形式。
- 優(yōu)劣:
靜態(tài)庫从撼,在鏈接時會被完整地復(fù)制到可執(zhí)行文件中州弟,被多次使用就有多份冗余拷貝。
好處很明顯低零,編譯完成之后婆翔,庫文件實際上就沒有作用了。目標程序沒有外部依賴掏婶,直接就可以運行啃奴。當然其缺點也很明顯,就是會使用目標程序的體積增大雄妥。
動態(tài)庫纺腊,與靜態(tài)庫相反,動態(tài)庫在編譯時并不會被拷貝到目標程序中茎芭,目標程序中只會存儲指向動態(tài)庫的引用揖膜。等到程序運行時,動態(tài)庫才會被真正加載進來梅桩。
系統(tǒng)的動態(tài)庫不需要拷貝到目標程序中壹粟,自建的動態(tài)庫可以由工程內(nèi)的多個庫共享,因此可以減小目標程序的體積宿百。但是趁仙,由于其把靜態(tài)鏈接做的事情都搬到運行時來做,程序的啟動會變慢
靜態(tài)庫:
- 第一步:創(chuàng)建一個 .a 靜態(tài)庫項目
- 這一步是需要 新建一個工程垦页,新建以后 下一步(Next) 需要給工程起個名字雀费,系統(tǒng)會自動生成一個以工程名命名的 .h和 .m 文件。如第二步的StaticLibraryMake.h 和 StaticLibraryMake.m 文件痊焊。
這里面的文件開發(fā)者可以自己去定義盏袄,刪除、添加薄啥、修改辕羽、替換都可以。
注意: 要適配最低版本號
-
第二步:
image.png
我們可以把需要做成 .a 文件的 相關(guān)文件放到工程目錄下面垄惧。但是要執(zhí)行第四步(target —> Build Phases —> Copy files )添加需要暴露的 .h 文件刁愿,如果不添加,可能也不會有什么問題到逊,但是在 第五步的 Products —> Debug-iphonesimulator —> include 路徑下只有一個默認的 .h 文件 如果你在靜態(tài)庫工程中使用了category铣口,那么你可能會碰到鏈接問題滤钱,解決的辦法就是需要同時在生成靜態(tài)庫的工程和使用靜態(tài)庫的工程中使用“-all_load”編譯選項,即在對應(yīng)target的"Build Settings"中的“Other Linker Flags”選項添加“-all_load”脑题,注意:使用靜態(tài)庫的工程中是一定要加該編譯選項的菩暗!至于生成靜態(tài)庫的工程中加不加沒有試過,不過建議還是加上該編譯選項旭蠕。
此時的Products 文件目錄下的 .a 文件 為紅色停团,說明文件并不存在(show in finder 查看是沒有的)
-
第三步:
image.png
這個配置分為 Debug 模式(真機調(diào)試)、Release模式(發(fā)布appstore)掏熬;
Yes 表示只編譯選中模擬器設(shè)備對應(yīng)的架構(gòu)佑稠;
No 則為編譯所有模擬器設(shè)備支持的cup架構(gòu)(Debug、Release版本同理)
我們一般都選擇NO
-
編譯
配置好以后旗芬,我們 commoand + B 編譯(需要選擇編譯環(huán)境: 真機: Generic ios Device舌胶、模擬器),第五步 的 Products中 .a 文件 變黑疮丛,此時的文件是存在的(show in finder 可以查看幔嫂,在 模擬器的 模式下編譯會出現(xiàn) 第五步的樣式:Products —> Debug-iphonesimulator —> include + .a 文件)
在 真機: Generic ios Device 的 模式下編譯會出現(xiàn) 第五步的樣式:Products —> Release-iphones —> include + .a 文件)在開發(fā)中,我們需要 上面兩步都需要操作(在開發(fā)中需要Debug誊薄、Release)
這個地方的修改履恩,對應(yīng)
第六步
終端的輸出結(jié)果: i386 、x86_64 呢蔫。 -
第四步:
image.png
這部分在上面 也提及過(添加你需要暴露的接口頭文件
切心,放到同一個 文件Include 目錄下),這里不解釋了
-
第五步:
image.png
這一步是選擇模擬器或者真機
模擬器下: 說明 生成的 .a 文件可以在 模擬器上面使用片吊,而不能在 真機 上使用绽昏;
真機下: 說明 生成的 .a 文件可以在 真機上面使用,而不能在 模擬器 上使用俏脊;
真正開發(fā)全谤,需要在 模擬器、真機 都需要 分別編譯一下爷贫,是否成功认然,查看Products 目錄下的 .a 是否變黑,準確的測試 我們可以在 終端用命令行 測試沸久,
如第六步:
在 模擬器季眷、真機: Generic ios Device 都需要 分別編譯以后,在Products 目錄下 有兩個文件卷胯,分別對應(yīng)模擬器、真機
-
第六步:
image.png 這是 驗證威酒,下面 我也是查看別人的博客(正確與否 就不清楚了窑睁,個人感覺正確):
注:關(guān)于靜態(tài)庫對CPU架構(gòu)的支持挺峡,首先了解iOS設(shè)備CPU架構(gòu)方面的知識,ARM是微處理器行業(yè)的一家知名企業(yè)担钮,arm處理器以體積小和高性能的優(yōu)勢在嵌入式設(shè)備中廣泛使用橱赠,幾乎所有手機都是使用它的。
模擬器:iphone4s~5 : i386 iphone5s~6plus : x86_64
真機:iphone3gs~4s : armv7 iphone5~5c : armv7s (靜態(tài)庫只要支持了armv7箫津,就可以跑在armv7s的架構(gòu)上) iphone5s~6plus : arm64
armv6, armv7, armv7s是ARM CPU的不同指令集狭姨,原則是向下兼容的。例如iPhone4S CPU支持armv7, 但它同時兼容armv6苏遥,只是使用armv6指令可能無法充分發(fā)揮它的特性饼拍。
這里再補充一下查看靜態(tài)庫.a對處理器架構(gòu)的支持,先cd到.a文件的路徑下田炭,命令行輸入:lipo -info xxxxx.a
上圖 只有 i386 师抄、x86_64 說明是 模擬器 操作,真機 操作與其 相似(真機 只有 armv7s)
使用命令:
在 .a 文件 目錄下:
lipo -info .a文件 例如:lipo -info libStaticLibraryMake.a
-
第七步:
image.png
第七步: 調(diào)用 .a 文件
- 第八步
如果 第七步 編譯失敗教硫,可能是 路徑問題叨吮,則執(zhí)行這一步
第八步: 由于 Xcode9 的原因,需要在這個地方 導(dǎo)入 .a 文件瞬矩,否則編譯失敳杓(路徑問題),導(dǎo)入以后,在Build Settings —> Search Paths —> Library Search Paths 中景用,會自動生成 $(inherited) 蛤铜、 $(PROJECT_DIR)/工程名
,如下圖:
上面的步驟 知識解決 在 模擬器 或者 真機上面的問題丛肢,如果需要在真機和模擬器都能夠跑起來围肥,那么,怎么做呢蜂怎,做兩個 .a 文件嗎穆刻,當然不行,我們需要把:
在 模擬器的 模式下編譯會出現(xiàn) 第五步的樣式:Products —> Debug-iphonesimulator —> include + .a 文件)
在 真機的 模式下編譯會出現(xiàn) 第五步的樣式:Products —> Release-iphones —> include + .a 文件)
這兩個路徑下的 .a 文件合并起來
合并真機和模擬器.a文件杠步,在終端輸入以下命令行:注意空格
lipo -create 模擬器.a文件的路徑 真機.a文件的路徑 -output 合并后的保存路徑
例:lipo -create /Users/jq/Library/Developer/Xcode/DerivedData/StaticLibraryMake-bpgdvzwilkgvkjdhbdmhezavfloc/Build/Products/Debug-iphonesimulator/libStaticLibraryMake.a /Users/jq/Library/Developer/Xcode/DerivedData/StaticLibraryMake-bpgdvzwilkgvkjdhbdmhezavfloc/Build/Products/Debug-iphoneos/libStaticLibraryMake.a -output /Users/jq/Desktop/majq/majqStaric.a
majqStaric.a 開發(fā)者自定義的名字
最終會在桌面得到一個合并后的 majqStaric.a 文件氢伟,再將暴露出來的.h頭文件一起復(fù)制出來。
測試 生成的 .a 文件是否支持真機和模擬器
使用命令:
在 .a 文件 目錄下:
lipo -info .a文件
例如:lipo -info /Users/jq/Desktop/majq/majqStaric.a 幽歼,
如果Architectures in the fat file: /Users/jq/Desktop/majq/majqStaric.a are:
i386 armv7 x86_64 arm64
(包含i386 x86_64 armv7s朵锣,說明支持真機和模擬器)
使用:只需將.a和暴露出來的.h頭文件導(dǎo)入工程目錄下就可供外界使用
總結(jié):
- 使用兩個命令:
lipo -info
,lipo -create 模擬器環(huán)境下路徑1 真機環(huán)境下路徑2 -output 合并導(dǎo)出路徑3