iOS 高級(jí)開發(fā)_ 打包與封裝 SDK_ 封裝靜態(tài)庫 . a

什么是庫朴读?

庫是共享程序代碼的方式辖所,一般分為動(dòng)態(tài)庫和靜態(tài)庫。

  • 靜態(tài)庫:.a和.framework
  • 動(dòng)態(tài)庫:.dylib和.framework

在實(shí)際的項(xiàng)目開發(fā)中磨德,經(jīng)常會(huì)使用到庫缘回,庫分為靜態(tài)庫和動(dòng)態(tài)庫兩種。和多數(shù)人所熟悉的動(dòng)態(tài)語言和靜態(tài)語言一樣典挑,這里的所謂靜態(tài)和動(dòng)態(tài)是相對(duì)編譯期和運(yùn)行期的:靜態(tài)庫在程序編譯時(shí)會(huì)被鏈接到目標(biāo)代碼中酥宴,程序運(yùn)行時(shí)將不再需要改靜態(tài)庫;而動(dòng)態(tài)庫在程序編譯時(shí)并不會(huì)被鏈接到目標(biāo)代碼中您觉,只是在程序運(yùn)行時(shí)才被載入拙寡,因?yàn)樵诔绦蜻\(yùn)行期間還需要?jiǎng)討B(tài)庫的存在。

靜態(tài)庫和動(dòng)態(tài)庫區(qū)別

  • 靜態(tài)庫:鏈接時(shí)琳水,靜態(tài)庫會(huì)被完整的復(fù)制到可執(zhí)行文件中肆糕,被多次使用就又多份冗余拷貝
  • 動(dòng)態(tài)庫:鏈接時(shí)不復(fù)制,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存在孝,供程序調(diào)用诚啃,系統(tǒng)只會(huì)加載一次,多個(gè)程序共用私沮,節(jié)省內(nèi)存

注意:項(xiàng)目中如果使用了自制的動(dòng)態(tài)庫(framework)不能被上傳到AppStore

.a和.framewrok有什么區(qū)別始赎?

  • .a是一個(gè)純二進(jìn)制文件,.framework是一個(gè)文件夾,文件夾中除了有二進(jìn)制文件之外還有資源文件造垛。* .a文件不能直接使用魔招,至少要有.h文件配合,.framework文件可以直接使用五辽。* .a + .h + sourceFile = .framework办斑。

靜態(tài)庫的應(yīng)用場(chǎng)景

  • 希望更多的開發(fā)者在程序中集成,但是又不想公布自己的核心技術(shù)杆逗;對(duì)外暴露統(tǒng)一接口乡翅,開發(fā)者調(diào)用靜態(tài)庫即可。
  • 項(xiàng)目開發(fā)中有一部分核心代碼髓迎,非核心開發(fā)人員倘若離職,對(duì)于公司來說是一種損失

1. a靜調(diào)庫的編譯

1.靜態(tài)庫的創(chuàng)建:左側(cè)為.framework 右側(cè)為.a

1.png

2.創(chuàng)建工具類建丧,并暴露接口新建工具類排龄,并在buildPhrase中添加需要暴露的.h文件

2.png

3.分別在不同的環(huán)境下編譯,從而得到支持不同環(huán)境的靜調(diào)庫

3.png

4.查看不同環(huán)境下的靜態(tài)庫


4.png

在不同的文件夾下可以查看不同環(huán)境使用的.a靜調(diào)庫文件翎朱,新建項(xiàng)目橄维,將.a文件拖拽到項(xiàng)目中估計(jì)可使用

5.png

靜態(tài)庫中的架構(gòu)問題

當(dāng)使用真機(jī)環(huán)境的.a文件在模擬中編譯或者運(yùn)行時(shí),會(huì)報(bào)架構(gòu)的錯(cuò)誤 拴曲。

  • 設(shè)備的CPU架構(gòu)

  • 不同的設(shè)備使用的CPU不同

  • CPU的不同就造成使用的CPU架構(gòu)(即指令集)不同

  • 靜態(tài)庫有其支持的CPU架構(gòu)

    • 如果靜態(tài)庫在其不支持的CPU架構(gòu)上面運(yùn)行就會(huì)報(bào)錯(cuò)
  • 模擬器使用的CPU架構(gòu)

  • iPhone4s-iPhone5:i386

  • iPhone5s-iPhone6Plus:x86_64

  • 真機(jī)使用的CPU架構(gòu)

  • iPhone3gs-iPhone4sP:armv7

  • iPhone5-iPhone5c:armv7s

  • iPhone5s-iPhone6plus:arm64

  • 注意: 支持armv7的靜態(tài)庫可以在armv7s上正常使用* 查看靜態(tài)庫的架構(gòu)(終端命令)
    $ lipo -info 靜態(tài)庫地址

  • 合并靜態(tài)庫
    $ lipo create 靜態(tài)庫1 靜態(tài)庫2 output 合并后的靜態(tài)庫

如何使靜調(diào)庫支持多種CPU架構(gòu)

想要制作的靜態(tài)庫既支持i386架構(gòu)也支持x86_64架構(gòu)争舞,有兩種解決方法.

  1. 修改靜態(tài)庫的編譯環(huán)境并重新編譯


    6.png

    在termnal中使用命令將多個(gè)靜態(tài)庫合并

 $ lipo -create Debug-iphoneos/libStaticLibrary.a Debug-iphonesimulator/libStaticLibrary.a -output libnewstatic.a

合并后的靜調(diào)庫的大小>=合并之前靜態(tài)庫大小之和
開發(fā)環(huán)境:需要支持真機(jī)以及模擬器的靜態(tài)庫
生產(chǎn)環(huán)境:只需要支持真機(jī)的靜態(tài)庫即可

2 .framework靜態(tài)庫的編譯

第一步與.a文件文件創(chuàng)建一樣,選擇framework澈灼,點(diǎn)開以后發(fā)現(xiàn)竞川,項(xiàng)目中已經(jīng)存在一個(gè)與項(xiàng)目名稱一樣的主頭文件(這是蘋果推薦的方式 )
1.將需要暴露的頭文件添加到public(拖入即可)

1.png

注意:將需要暴露的頭文件放到主頭文件中
2.步驟跟.a文件一致,分別在真機(jī)以及模擬器環(huán)境編譯叁熔,得到兩個(gè)不同環(huán)境的.framework

2.png

3.使用.framework并運(yùn)行

3.png

查看控制臺(tái)發(fā)現(xiàn)報(bào)錯(cuò)委乌,發(fā)現(xiàn)制作的framework為動(dòng)態(tài)庫,動(dòng)態(tài)庫的使用荣回,需要在target中手動(dòng)添加動(dòng)態(tài)庫遭贸。(只能作為測(cè)試使用,蘋果禁止自制的動(dòng)態(tài)庫上架心软,上架前切記修改為靜態(tài)庫)
4.修改編譯環(huán)境壕吹,編譯靜態(tài)庫buildsetting 搜索mach 并修改

4.png

使用該方法制作的靜態(tài)庫,可以運(yùn)行删铃,但是在4s中是無法運(yùn)行的耳贬,會(huì)報(bào)CPU架構(gòu)的錯(cuò)誤,通過$lipo -info StaticFramework查看framework所支持的架構(gòu)猎唁,目前這樣制作的framework只支持x86架構(gòu)效拭,因此4s不能運(yùn)行** 注意 :**cd 到.framework的路徑是不夠的,因?yàn)閮H僅是一個(gè)文件夾,真正的靜態(tài)庫是一個(gè)二進(jìn)制文件.因此查看架構(gòu)信息的時(shí)候需要跟這個(gè)靜態(tài)庫名字修改架構(gòu)缎患,使制作的framework支持所有架構(gòu)

5.png

靜調(diào)庫的合并與.a文件一樣慕的,在此就不做贅述。至此SDK的開發(fā)就到此為止挤渔,真正的SDK開發(fā)需要在項(xiàng)目中一邊開發(fā)一邊調(diào)試

3 SDK靜調(diào)庫的調(diào)試

單獨(dú)進(jìn)行核心代碼SDK的開發(fā)肮街,開發(fā)完成以后需要拖到項(xiàng)目中調(diào)試,這樣是本末倒置的判导。SDK的開發(fā)需要在項(xiàng)目中調(diào)試以及開發(fā)嫉父。

6.png

創(chuàng)建完成以后,項(xiàng)目中的結(jié)構(gòu)發(fā)生變化眼刃,變化的位置已經(jīng)已經(jīng)圈出

7.png

在framework文件目錄下創(chuàng)建核心代碼類绕辖,并在項(xiàng)目中需要的地方import主頭文件,靜調(diào)庫的制作就不贅述了擂红,與上面的一致仪际。

4 制作靜態(tài)庫時(shí)注意的幾點(diǎn):

  1. 圖片資源的處理:兩種靜態(tài)庫,一般都是把圖片文件單獨(dú)的放在一個(gè).bundle文件中昵骤,一般.bundle的名字和.a或.framework的名字相同树碱。.bundle文件很好弄,新建一個(gè)文件夾变秦,把它改名為.bundle就可以了成榜,右鍵,顯示包內(nèi)容可以向其中添加圖片資源蹦玫。
  2. category是我們實(shí)際開發(fā)項(xiàng)目中經(jīng)常用到的赎婚,把category打成靜態(tài)庫是沒有問題的,但是在用這個(gè)靜態(tài)庫的工程中樱溉,調(diào)用category中的方法時(shí)會(huì)有找不到該方法的運(yùn)行時(shí)錯(cuò)誤(selector not recognized)惑淳,解決辦法是:在使用靜態(tài)庫的工程中配置other linker flags的值為-ObjC -all_load
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市饺窿,隨后出現(xiàn)的幾起案子歧焦,更是在濱河造成了極大的恐慌,老刑警劉巖肚医,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绢馍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肠套,警方通過查閱死者的電腦和手機(jī)舰涌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來你稚,“玉大人瓷耙,你說我怎么就攤上這事朱躺。” “怎么了搁痛?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵长搀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鸡典,道長(zhǎng)源请,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任彻况,我火速辦了婚禮谁尸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纽甘。我一直安慰自己良蛮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布悍赢。 她就那樣靜靜地躺著决瞳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泽裳。 梳的紋絲不亂的頭發(fā)上瞒斩,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天破婆,我揣著相機(jī)與錄音涮总,去河邊找鬼。 笑死祷舀,一個(gè)胖子當(dāng)著我的面吹牛瀑梗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播裳扯,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼抛丽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了饰豺?” 一聲冷哼從身側(cè)響起亿鲜,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冤吨,沒想到半個(gè)月后蒿柳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漩蟆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年垒探,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怠李。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡圾叼,死狀恐怖蛤克,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情夷蚊,我是刑警寧澤构挤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站撬码,受9級(jí)特大地震影響儿倒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呜笑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一夫否、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叫胁,春花似錦凰慈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至输钩,卻和暖如春豺型,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背买乃。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國打工姻氨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剪验。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓肴焊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親功戚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子娶眷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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

  • 靜態(tài)庫與動(dòng)態(tài)庫的區(qū)別 首先來看什么是庫届宠,庫(Library)說白了就是一段編譯好的二進(jìn)制代碼,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 11,931評(píng)論 3 42
  • 這幾天公司有一個(gè)新的需求乘粒,就是要將我們開發(fā)的某些東西都抽取出來豌注,打個(gè)比方我們開發(fā)了A項(xiàng)目,可以以后B項(xiàng)目要包含A項(xiàng)...
    黃魚兒啦啦啦閱讀 6,165評(píng)論 2 16
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,070評(píng)論 25 707
  • 僅以方便自己查閱記錄前言1.靜態(tài)庫和動(dòng)態(tài)庫有什么異同谓厘?靜態(tài)庫:鏈接時(shí)完整地拷貝至可執(zhí)行文件中幌羞,被多次使用就有多份冗...
    190CM閱讀 4,204評(píng)論 0 4
  • 午夜一點(diǎn)多属桦,剛寫完代碼熊痴,300塊幫一個(gè)學(xué)生寫作業(yè),感覺也還不錯(cuò)吧聂宾,既能學(xué)英語果善,也能練編程,還能賺個(gè)零花錢系谐,一舉三得...
    鄧曉駿閱讀 254評(píng)論 0 0