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

什么是庫?

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

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

在實際的項目開發(fā)中,經(jīng)常會使用到庫,庫分為靜態(tài)庫和動態(tài)庫兩種。和多數(shù)人所熟悉的動態(tài)語言和靜態(tài)語言一樣,這里的所謂靜態(tài)和動態(tài)是相對編譯期和運行期的:靜態(tài)庫在程序編譯時會被鏈接到目標代碼中,程序運行時將不再需要改靜態(tài)庫;而動態(tài)庫在程序編譯時并不會被鏈接到目標代碼中,只是在程序運行時才被載入,因為在程序運行期間還需要動態(tài)庫的存在。

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

  • 靜態(tài)庫:鏈接時,靜態(tài)庫會被完整的復制到可執(zhí)行文件中,被多次使用就又多份冗余拷貝
  • 動態(tài)庫:鏈接時不復制,程序運行時由系統(tǒng)動態(tài)加載到內存,供程序調用,系統(tǒng)只會加載一次,多個程序共用,節(jié)省內存

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

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

  • .a是一個純二進制文件,.framework是一個文件夾,文件夾中除了有二進制文件之外還有資源文件。* .a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。* .a + .h + sourceFile = .framework。

靜態(tài)庫的應用場景

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

1. a靜調庫的編譯

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

1.png

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

2.png

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

3.png

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


4.png

在不同的文件夾下可以查看不同環(huán)境使用的.a靜調庫文件,新建項目,將.a文件拖拽到項目中估計可使用

5.png

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

當使用真機環(huán)境的.a文件在模擬中編譯或者運行時,會報架構的錯誤 。

  • 設備的CPU架構

  • 不同的設備使用的CPU不同

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

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

    • 如果靜態(tài)庫在其不支持的CPU架構上面運行就會報錯
  • 模擬器使用的CPU架構

  • iPhone4s-iPhone5:i386

  • iPhone5s-iPhone6Plus:x86_64

  • 真機使用的CPU架構

  • iPhone3gs-iPhone4sP:armv7

  • iPhone5-iPhone5c:armv7s

  • iPhone5s-iPhone6plus:arm64

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

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

如何使靜調庫支持多種CPU架構

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

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


    6.png

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

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

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

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

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

1.png

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

2.png

3.使用.framework并運行

3.png

查看控制臺發(fā)現(xiàn)報錯,發(fā)現(xiàn)制作的framework為動態(tài)庫,動態(tài)庫的使用,需要在target中手動添加動態(tài)庫。(只能作為測試使用,蘋果禁止自制的動態(tài)庫上架,上架前切記修改為靜態(tài)庫)
4.修改編譯環(huán)境,編譯靜態(tài)庫buildsetting 搜索mach 并修改

4.png

使用該方法制作的靜態(tài)庫,可以運行,但是在4s中是無法運行的,會報CPU架構的錯誤,通過$lipo -info StaticFramework查看framework所支持的架構,目前這樣制作的framework只支持x86架構,因此4s不能運行** 注意 :**cd 到.framework的路徑是不夠的,因為僅僅是一個文件夾,真正的靜態(tài)庫是一個二進制文件.因此查看架構信息的時候需要跟這個靜態(tài)庫名字修改架構,使制作的framework支持所有架構

5.png

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

3 SDK靜調庫的調試

單獨進行核心代碼SDK的開發(fā),開發(fā)完成以后需要拖到項目中調試,這樣是本末倒置的。SDK的開發(fā)需要在項目中調試以及開發(fā)。

6.png

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

7.png

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

4 制作靜態(tài)庫時注意的幾點:

  1. 圖片資源的處理:兩種靜態(tài)庫,一般都是把圖片文件單獨的放在一個.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一個文件夾,把它改名為.bundle就可以了,右鍵,顯示包內容可以向其中添加圖片資源。
  2. category是我們實際開發(fā)項目中經(jīng)常用到的,把category打成靜態(tài)庫是沒有問題的,但是在用這個靜態(tài)庫的工程中,調用category中的方法時會有找不到該方法的運行時錯誤(selector not recognized),解決辦法是:在使用靜態(tài)庫的工程中配置other linker flags的值為-ObjC -all_load
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容