.a 文件靜態(tài)庫的制作

導(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)庫項目
image.png
  • 這一步是需要 新建一個工程垦页,新建以后 下一步(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 文件

  • 第八步
image.png

如果 第七步 編譯失敗教硫,可能是 路徑問題叨吮,則執(zhí)行這一步

第八步: 由于 Xcode9 的原因,需要在這個地方 導(dǎo)入 .a 文件瞬矩,否則編譯失敳杓(路徑問題),導(dǎo)入以后,在Build Settings —> Search Paths —> Library Search Paths 中景用,會自動生成 $(inherited) 蛤铜、 $(PROJECT_DIR)/工程名,如下圖:

image.png

上面的步驟 知識解決 在 模擬器 或者 真機上面的問題丛肢,如果需要在真機和模擬器都能夠跑起來围肥,那么,怎么做呢蜂怎,做兩個 .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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市甸私,隨后出現(xiàn)的幾起案子诚些,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诬烹,死亡現(xiàn)場離奇詭異砸烦,居然都是意外死亡,警方通過查閱死者的電腦和手機绞吁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門幢痘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人家破,你說我怎么就攤上這事颜说。” “怎么了汰聋?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵门粪,是天一觀的道長。 經(jīng)常有香客問我马僻,道長庄拇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任韭邓,我火速辦了婚禮措近,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘女淑。我一直安慰自己瞭郑,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布鸭你。 她就那樣靜靜地躺著屈张,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袱巨。 梳的紋絲不亂的頭發(fā)上阁谆,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音愉老,去河邊找鬼场绿。 笑死,一個胖子當著我的面吹牛嫉入,可吹牛的內(nèi)容都是我干的焰盗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼咒林,長吁一口氣:“原來是場噩夢啊……” “哼熬拒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起垫竞,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤澎粟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捌议,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡哼拔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年引有,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓣颅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡譬正,死狀恐怖宫补,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情曾我,我是刑警寧澤粉怕,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站抒巢,受9級特大地震影響贫贝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛉谜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一稚晚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧型诚,春花似錦客燕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涵紊,卻和暖如春傍妒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摸柄。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工颤练, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人塘幅。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓昔案,卻偏偏與公主長得像,于是被迫代替她去往敵國和親电媳。 傳聞我的和親對象是個殘疾皇子踏揣,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容