iOS小知識(shí) -- 靜態(tài)庫(kù)(一)

  • 靜態(tài)庫(kù)
    • 靜態(tài)庫(kù)的介紹
    • .a靜態(tài)庫(kù)的制作以及測(cè)試
    • 靜態(tài)庫(kù)的架構(gòu)問(wèn)題
    • .framework靜態(tài)庫(kù)的制作以及測(cè)試
    • 邊開發(fā)邊制作靜態(tài)庫(kù)

簡(jiǎn)介

  • 什么是庫(kù)
    庫(kù)是程序代碼的集合,是共享代碼的一種方式
  • 根據(jù)源代碼的公開情況,庫(kù)可以分為兩類
    • 開源庫(kù)
      • 公開源代碼,能看到具體的實(shí)現(xiàn)
    • 閉源庫(kù):
      • 不公開源代碼,是經(jīng)過(guò)編譯后的二進(jìn)制文件,看不到具體的實(shí)現(xiàn)
  • 靜態(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
  • 應(yīng)用場(chǎng)景
    • 靜態(tài)庫(kù)的應(yīng)用場(chǎng)景(一)
      • 百度地圖想開發(fā)者在應(yīng)用程序中集成百度地圖
      • 但是百度不想公開自己的技術(shù)實(shí)現(xiàn),如何完成呢?
      • 百度將自己的核心代碼編譯成靜態(tài)庫(kù),對(duì)外暴露統(tǒng)一的接口
      • 開發(fā)者集成靜態(tài)庫(kù),并且調(diào)用靜態(tài)庫(kù)即可集成
    • 靜態(tài)庫(kù)的應(yīng)用場(chǎng)景(二)
      • 公司項(xiàng)目開發(fā)的一部分代碼為核心代碼


        1.png

編譯.a/.framework靜態(tài)庫(kù)

  • 創(chuàng)建項(xiàng)目的時(shí),選擇Framework&Library


    2.png
    • 創(chuàng)建.a靜態(tài)庫(kù)
      3.png

      如圖所示建一個(gè)文件,然后實(shí)現(xiàn).h.m,當(dāng)當(dāng)前是在模擬器上下是command+bproducts文件夾生成的.a是在模擬器上使用的,當(dāng)選的是真機(jī),command+bproducts文件夾生成的.a是在真機(jī)上使用的
      4.png

      點(diǎn)擊加號(hào)把所有暴露的文件添加進(jìn)去再command+b,到此靜態(tài)庫(kù)創(chuàng)建完成??梢苑诺焦こ汤镞M(jìn)行使用了。
      5.png

      show in find 查看當(dāng)前的庫(kù),使用時(shí)把庫(kù)和暴露的接口文件拖進(jìn)去,然后調(diào)用即可

靜態(tài)庫(kù)的架構(gòu)

  • 設(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 - iphone6splus:x86_64
  • 真機(jī)使用的cpu架構(gòu)
    • iphone3gs - iphone4s:armv7
    • iphone5 - iphone5c: armv7s
    • iphone5s - iphone6plus:arm64
    • 唯一特殊:只支持armv7的靜態(tài)庫(kù)可以在armv7s上正常運(yùn)行
  • 查看靜態(tài)庫(kù)支持的架構(gòu)
    • 進(jìn)入靜態(tài)庫(kù)所在的文件夾,然后執(zhí)行l(wèi)ipo -info 靜態(tài)庫(kù)的名字


      7.png
  • 假如當(dāng)前的只能運(yùn)行在模擬器或真機(jī)靜態(tài)庫(kù)不能支持所有設(shè)備的架構(gòu),可以采用如下方法:


    8.png
  • 合并靜態(tài)庫(kù)(可支持真機(jī)和模擬器)
    • lipo -create 靜態(tài)庫(kù)1 靜態(tài)庫(kù)2 -output合并的靜態(tài)庫(kù)


      9.png

提示:當(dāng)項(xiàng)目上線時(shí)推薦使用只支持真機(jī)的靜態(tài)庫(kù),如果兩者都支持,那樣會(huì)造成包太大了

(歡迎大家對(duì)不合適的地方進(jìn)行指正,看完覺(jué)得有幫到你給點(diǎn)個(gè)贊??吧)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容