1.庫(kù)的介紹碾牌。
- 什么是庫(kù)?
- 庫(kù)是程序代碼的集合,是共享程序代碼的一種方式
- 根據(jù)源代碼的公開(kāi)情況秩仆,庫(kù)可以分為2種類(lèi)型
- 開(kāi)源庫(kù)
- 公開(kāi)源代碼瀑梗,能看到具體實(shí)現(xiàn)
- 比如SDWebImage烹笔、AFNetworking
- 閉源庫(kù)
- 不公開(kāi)源代碼,是經(jīng)過(guò)編譯后的二進(jìn)制文件抛丽,看不到具體實(shí)現(xiàn)
- 主要分為:靜態(tài)庫(kù)谤职、動(dòng)態(tài)庫(kù)
- 開(kāi)源庫(kù)
- 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)
- 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的存在形式
- 靜態(tài)庫(kù):.a 和 .framework
- 動(dòng)態(tài)庫(kù):.dylib 和 .framework
- 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)在使用上的區(qū)別
- 靜態(tài)庫(kù):鏈接時(shí),靜態(tài)庫(kù)會(huì)被完整地復(fù)制到可執(zhí)行文件中亿鲜,被多次使用就有多份冗余拷貝
- 動(dòng)態(tài)庫(kù):鏈接時(shí)不復(fù)制允蜈,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用蒿柳,系統(tǒng)只加載一次饶套,多個(gè)程序共用,節(jié)省內(nèi)存
- 需要注意的是: 項(xiàng)目中如果使用了自制的動(dòng)態(tài)庫(kù)其馏,不能被上傳到AppStore
- 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的存在形式
- 應(yīng)用場(chǎng)景
- 靜態(tài)庫(kù)應(yīng)用場(chǎng)景(一)
- 百度地圖想開(kāi)發(fā)者在應(yīng)用程序中集成百度地圖
- 但是百度不想公布自己的技術(shù)實(shí)現(xiàn),如何完成呢?
- 百度將自己的核心代碼編譯成靜態(tài)庫(kù)
- 對(duì)外暴露統(tǒng)一的接口
- 開(kāi)發(fā)者集成靜態(tài)庫(kù),并且調(diào)用靜態(tài)庫(kù)即可集成
- 靜態(tài)庫(kù)應(yīng)用場(chǎng)景(二)
- 公司項(xiàng)目開(kāi)發(fā)有一部分代碼為核心代碼
- 如果任何人都可以拿到核心代碼,那么一旦有人離職,公司核心代碼就會(huì)一起被拿到.如何防止這種情況呢?
- 公司抽出一部分核心團(tuán)隊(duì)成員,專(zhuān)門(mén)開(kāi)發(fā)這部分核心代碼
- 開(kāi)發(fā)后,將核心代碼編譯成靜態(tài)庫(kù)給其他程序員調(diào)用
- 核心成員很少會(huì)離職,非核心成員離職無(wú)法帶走核心代碼
- 靜態(tài)庫(kù)應(yīng)用場(chǎng)景(一)
2.制作庫(kù):
下面有請(qǐng)我們的攻城利器閃亮登場(chǎng)!1病叛复!
你沒(méi)有看錯(cuò)在開(kāi)發(fā)ios庫(kù)時(shí),Xcode為我們提供了兩個(gè)開(kāi)發(fā)工具扔仓,左邊工具是生成后綴為.Framework的庫(kù)的褐奥,默認(rèn)生成的是動(dòng)態(tài)庫(kù),開(kāi)發(fā)語(yǔ)言是可選的(Swift或者OC)翘簇,撬码;右邊工具只能生成后綴為.a的靜態(tài)庫(kù),開(kāi)發(fā)語(yǔ)言不可選(只能是OC)
說(shuō)了辣么多版保,到底我們?cè)撨x哪個(gè)呢呜笑?
其實(shí)上文我已經(jīng)給出答案:"項(xiàng)目中如果使用了自制的動(dòng)態(tài)庫(kù)夫否,不能被上傳到AppStore",所以實(shí)際開(kāi)發(fā)中我們常用的是右邊的工具(Cocoa Touch Static Library)來(lái)自定義靜態(tài)庫(kù),當(dāng)然了這也并不絕對(duì)下文我會(huì)告訴你如何使用Cocoa Touch Framework 制作靜態(tài)庫(kù)順利上傳AppStore叫胁。
2.1如何自定義.a靜態(tài)庫(kù)
- 創(chuàng)建項(xiàng)目時(shí),選擇Framework&Library-->Static Library
- 編寫(xiě)核心代碼(例子如下)
- 編譯靜態(tài)庫(kù)前,將頭文件暴露出去
- 選擇模擬器/真機(jī)分別編譯(原因如下)
知識(shí)點(diǎn)補(bǔ)充: - 設(shè)備的CPU架構(gòu)
- 不同的設(shè)備使用的CPU是不同的
- CPU的不同造成使用的CPU架構(gòu)(指令集)不同
- 靜態(tài)庫(kù)有其支持的CPU架構(gòu)
- 如果靜態(tài)庫(kù)在不支持的CPU架構(gòu)上運(yùn)行就會(huì)報(bào)錯(cuò)
- 模擬器使用的CPU架構(gòu)
- iPhone4s-iPhone5 : i386
- iPhone5s-iPhone6plus : x86_64
- 真機(jī)使用的CPU架構(gòu)
- iPhone3gs-iPhone4s : armv7
- iPhone5-iPhone5c : armv7s
- iPhone5s-iPhone6plus : arm64
- 唯一特殊:只要支持armv7的靜態(tài)庫(kù)可以在armv7s上正常運(yùn)行
- 綜上:
暫且不考慮真機(jī)和模擬器共存凰慈,僅僅當(dāng)我們決定好在某一環(huán)境下使用時(shí),最好在這個(gè)環(huán)境下編譯一次處處運(yùn)行吧驼鹅!操作如下:
注意:
觀察編譯前后:
讓我們進(jìn)入里面一探究竟微谓!
從里面內(nèi)容我們也可以發(fā)現(xiàn)我們編譯是在調(diào)試(Debug)模式下,并且是區(qū)分設(shè)備的输钩,此時(shí)顯示時(shí)的是Phone模擬器 => 驗(yàn)證了我們之前的說(shuō)法豺型,編譯創(chuàng)建的庫(kù)是分設(shè)備(架構(gòu))的。
之前我們考慮好了各個(gè)環(huán)境下都應(yīng)該是一次編譯處處運(yùn)行买乃,是時(shí)候該考慮模擬器和真機(jī)通用的時(shí)候了姻氨,模仿模擬器的編譯過(guò)程我們當(dāng)然首先也要編譯生成一個(gè)真機(jī)架構(gòu)下的庫(kù)
再次進(jìn)入庫(kù)
兩個(gè)庫(kù)!为牍!不可能一次拖兩個(gè)庫(kù)吧:甙蟆!讓我們來(lái)合并一下他們好了碉咆。
終端命令補(bǔ)充:
- 查看靜態(tài)庫(kù)支持的架構(gòu)
- lipo -info 靜態(tài)庫(kù)
- 合并靜態(tài)庫(kù)
- lipo -create 靜態(tài)庫(kù)1 靜態(tài)庫(kù)2 -output 合并的靜態(tài)庫(kù)
為了驗(yàn)證我們合并是否成功抖韩,我們先分別查看他們所支持的架構(gòu):
先看真機(jī)的:
再看模擬器:
接下來(lái)進(jìn)入最激動(dòng)人心的時(shí)刻:合并
合并成不成功,驗(yàn)證一下就可以了
恭喜你疫铜,還差最后一步??
生成了一個(gè)指定的合并庫(kù)茂浮,總不能就直接拖它進(jìn)入你的項(xiàng)目吧(庫(kù)是看不到源碼的,你知道怎么使用壳咕?席揽?這下你該知道頭文件暴露的好處了吧,暴露了你就應(yīng)該把它和你新生成的庫(kù)存放在同一個(gè)文件夾下呀N嚼濉;闲摺!)具體操作如下
最后試試你的庫(kù)到底好不好使(測(cè)試下自己會(huì)不會(huì)用??)
2.2如何自定義.Framewor靜態(tài)庫(kù)
聲明:默認(rèn)情況下利用Cocoa Touch Framework 制作的庫(kù)為動(dòng)態(tài)庫(kù)竟稳,動(dòng)態(tài)庫(kù)雖然能在模擬器下正常使用属桦,但是不能上傳AppStore,故我在這里不做深入介紹他爸。其制作過(guò)程幾乎與制作.a靜態(tài)庫(kù)一樣聂宾。
一.編譯.framework靜態(tài)庫(kù)
- 創(chuàng)建項(xiàng)目時(shí),選擇Framework&Library-->Frameword
- 默認(rèn)創(chuàng)建的項(xiàng)目中有一個(gè)主頭文件,可以將其他頭文件在該頭文件中import一下
- 編寫(xiě)核心代碼
- 編譯庫(kù)前,將頭文件都暴露出去
- 分別設(shè)置好模擬器和真機(jī)環(huán)境下都適配
- 將庫(kù)設(shè)置為編譯生成靜態(tài)庫(kù)!U矬浴系谐!
- 再進(jìn)入庫(kù)內(nèi)部文件,去合并兩個(gè)庫(kù)讨跟,具體操作和生成靜態(tài)庫(kù)一致纪他,這里就不在贅述鄙煤。
3實(shí)際開(kāi)發(fā)中如何自定義庫(kù)
1.直接新建一個(gè)庫(kù),寫(xiě)代碼 -> 編譯 -> 合并 -> 好了止喷?馆类?文件一多,你能確保百分百正確弹谁?故這種方式不可惹伞!预愤!
2.將兩個(gè)程序沟于,一個(gè)測(cè)試,一個(gè)寫(xiě)庫(kù)植康。旷太。∠觯可以供璧,只要你不嫌麻煩!冻记!
3主流:邊開(kāi)發(fā)邊調(diào)試靜態(tài)庫(kù)
操作如下:
接下來(lái)操作與常規(guī)開(kāi)發(fā)一致睡毒,當(dāng)確保庫(kù)無(wú)誤之后,切換編譯Target冗栗,轉(zhuǎn)為庫(kù)演顾,再分別編譯 => 合并
注意:
1.如果制作的是動(dòng)態(tài)庫(kù)的話,一定要embeded binaries中將庫(kù)導(dǎo)入一下隅居,
2.如果編譯的靜態(tài)庫(kù)中有分類(lèi)的話必須在 Build Settings --> Other Linker Flags 中加 -Objc 如果還崩潰钠至,還得加上 -all_load
3.關(guān)于在靜態(tài)庫(kù)中添加資源,一般使用的是bundle文件夾胎源,如何創(chuàng)建呢棉钧?很簡(jiǎn)單先創(chuàng)建一個(gè)文件夾,然后將所需資源扔進(jìn)去涕蚤,最后將文件夾名稱(chēng)加上后綴bundle就ok了宪卿。***注意,默認(rèn)的靜態(tài)庫(kù)編輯是不會(huì)將bundle一起編譯進(jìn)去的赞季,所以這個(gè)文件夾需要我們手動(dòng)添加到使用靜態(tài)庫(kù)的工程中去愧捕。
4.如果在swift中使用OC動(dòng)態(tài)庫(kù)奢驯,可不用建立橋接文件
5.用swift建立動(dòng)態(tài)庫(kù):記得類(lèi)和方法需要public 或open 具體看需求
4.關(guān)于庫(kù)的那些坑申钩!
1添加自定義動(dòng)態(tài)庫(kù)位置得手動(dòng)添加!1窀蟆撒遣!
修改如下:
2.合并庫(kù)后的取名注意不要隨便取邮偎,盡量與原庫(kù)名一致,否則一致報(bào)錯(cuò)
(對(duì)了义黎,如果你想提升用戶(hù)體驗(yàn)禾进,那么你真正用到項(xiàng)目中的編譯好的靜態(tài)庫(kù)其實(shí)只要支持真機(jī)的架構(gòu)就行,那樣app的占用空間會(huì)相對(duì)很小)