iOS 制作包含靜態(tài)庫(kù)的動(dòng)態(tài)庫(kù)

  • 制作起因
    公司目前有個(gè)swift項(xiàng)目用到了組件化,也是我第一個(gè)用組件化的項(xiàng)目,都在摸索中一步步行進(jìn)中....在項(xiàng)目快結(jié)束的時(shí)候發(fā)現(xiàn)個(gè)問題,分享功能無(wú)法實(shí)現(xiàn),原因是項(xiàng)目中有個(gè)AXSDK工具模塊,然后各個(gè)項(xiàng)目子模塊都依賴了AXSDK模塊。最初實(shí)現(xiàn)分享功能的想法是AXSDK引用分享相關(guān)庫(kù),然后這樣就能實(shí)現(xiàn)各個(gè)子模塊要做分享功能都能做到,但事實(shí)永遠(yuǎn)不盡如人意....


    引用友盟分享SDK相關(guān)文件
驗(yàn)證本地時(shí)報(bào)錯(cuò)

如上圖,驗(yàn)證本地時(shí)不通過,后來查了下原因,是因?yàn)镼Q微信微博那幾個(gè)文件是.a靜態(tài)庫(kù),而cocoapods在最新版本上是不支持.a靜態(tài)庫(kù)文件依賴了,腦袋疼....
后來機(jī)緣巧合得知了可通過制作一個(gè)動(dòng)態(tài)庫(kù),將.a等相關(guān)靜態(tài)庫(kù)文件拖入,對(duì)外顯示為動(dòng)態(tài)庫(kù)的方式可行

  • 理論功底

    • 動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)介紹

      首先靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)都是以二進(jìn)制提供代碼復(fù)用的代碼庫(kù)
      靜態(tài)庫(kù) 常見的是 .a
      動(dòng)態(tài)庫(kù)常見的是 .dll(windows),.dylib(mac),so(linux)
      framework(in Apple): Framework 是Cocoa/Cocoa Touch程序中使用的一種資源打包方式,可以將代碼文件、頭文件、資源文件、說明文檔等集中在一起,方便開發(fā)者使用。也就是說我們的 framework其實(shí)是資源打包的方式,和靜態(tài)庫(kù)動(dòng)態(tài)庫(kù)的本質(zhì)是沒有關(guān)系的
      
    • 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別

      靜態(tài)庫(kù): 鏈接時(shí)會(huì)被完整的復(fù)制到可執(zhí)行文件中,所以如果兩個(gè)程序都用了某個(gè)靜態(tài)庫(kù),那么每個(gè)二進(jìn)制可執(zhí)行文件里面其實(shí)都含有這份靜態(tài)庫(kù)的代碼
      動(dòng)態(tài)庫(kù): 鏈接時(shí)不復(fù)制,在程序啟動(dòng)后用dyld加載,然后再?zèng)Q議符號(hào),所以理論上動(dòng)態(tài)庫(kù)只用存在一份,好多個(gè)程序都可以動(dòng)態(tài)鏈接到這個(gè)動(dòng)態(tài)庫(kù)上面,達(dá)到了節(jié)省內(nèi)存(不是磁盤是內(nèi)存中只有一份動(dòng)態(tài)庫(kù)),還有另外一個(gè)好處,由于動(dòng)態(tài)庫(kù)并不綁定到可執(zhí)行程序上,所以我們想升級(jí)這個(gè)動(dòng)態(tài)庫(kù)就很容易,windows和linux上面一般插件和模塊機(jī)制都是這樣實(shí)現(xiàn)的。
      But我們的蘋果爸爸在iOS平臺(tái)上規(guī)定不允許存在動(dòng)態(tài)庫(kù),并且所有的 IPA 都需要經(jīng)過蘋果爸爸的私鑰加密后才能用,基本你用了動(dòng)態(tài)庫(kù)也會(huì)因?yàn)楹灻粚?duì)無(wú)法加載,(越獄和非 APP store 除外)。于是就把開發(fā)者自己開發(fā)動(dòng)態(tài)庫(kù)掐死在幻想中。
      直到有一天,蘋果爸爸的iOS升級(jí)到了8,iOS出現(xiàn)了APP Extension,swift編程語(yǔ)言也誕生了,由于iOS主APP需要和Extension共享代碼,Swift語(yǔ)言的機(jī)制也只能有動(dòng)態(tài)庫(kù),于是蘋果爸爸尷尬了,不過這難不倒我們的蘋果爸爸,畢竟我是爸爸,規(guī)則是我來定,我想怎樣就怎樣,于是提出了一個(gè)概念Embedded Framework,這種動(dòng)態(tài)庫(kù)允許APP和APP Extension共享代碼,但是這份動(dòng)態(tài)庫(kù)的生命被限定在一個(gè)APP進(jìn)程內(nèi)。簡(jiǎn)單點(diǎn)可以理解為被閹割的動(dòng)態(tài)庫(kù)。
      

  • 制作步驟圖示



    https://developer.umeng.com/sdk/ios




    在Build Phases里添加以下腳本,真機(jī)和模擬器都Build一遍之后就會(huì)在工程目錄下生成Products文件夾
if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
open "${DEVICE_DIR}"
open "${SRCROOT}/Products"
fi
添加相關(guān)依賴庫(kù)
添加相關(guān)依賴庫(kù)
選擇模擬器或者 Generic iOS Device 運(yùn)行編譯就會(huì)生成對(duì)應(yīng)版本的 Framework 了
這個(gè)就是合并后的最終framework包了
驗(yàn)證
創(chuàng)建并配置podspec文件

發(fā)布到pod上

成功上傳
?著作權(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)容

  • 靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別 首先來看什么是庫(kù),庫(kù)(Library)說白了就是一段編譯好的二進(jìn)制代碼,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 12,313評(píng)論 3 42
  • 善用這第三個(gè)8小時(shí)。一、找到“不被打擾的時(shí)間”; 第二,分清“交易、消費(fèi)和投資”;第三、持之以恒,日拱一卒...
    FineYoga小如閱讀 196評(píng)論 0 1
  • 時(shí)間像琥珀,淚一滴一滴被反鎖。 ——題記 幼時(shí),他牽她走過一個(gè)個(gè)黃昏,散下一段段回憶。 長(zhǎng)大,她扔開他的手,開始對(duì)...
    小咕咚LY閱讀 432評(píng)論 2 3

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