背景
項目中最開始為了使用@import特性,在Podfile中使用的是use_frameworks!眯分,把所有Pods做成動態(tài)framework,同時也為后面的Swift混編做好準備。
微信等第三方SDK以靜態(tài)庫.a的形式提供給用戶噪舀,導致我們沒有辦法在Pods中直接依賴,會報類似xxx has transitive dependencies that include static binaries
的錯誤与倡,因此需要把.a封裝成動態(tài)framework.于是開始了先忙的艱辛之旅。
重要概念
- 靜態(tài)庫:一堆目標文件的打包體息拜。鏈接時會被完整的復(fù)制到可執(zhí)行文件中净响,存在多個可執(zhí)行文件中包含同一份靜態(tài)庫代碼的問題。
- 動態(tài)庫:一個沒有main函數(shù)的可執(zhí)行文件赞别。鏈接時不復(fù)制代碼配乓,程序啟動后用dyld加載,然后再決議符號崎页。所以一份動態(tài)庫可以供多個程序動態(tài)鏈接羽莺,達到節(jié)省內(nèi)存的目的盐固。
入坑
framework的制作過程網(wǎng)上有很多文章,我主要參考了組件化-動態(tài)庫實戰(zhàn)志电。再次感謝作者@南梔傾寒
按這篇文章一步一步來基本可以完成85%的工作蛔趴。
制作是需要特別關(guān)注以下幾點:
- Mach-O Type要選擇Dynamic Library
- Buld Setting中Other Linker Flags要加上-all_load
- Buld Setting中Build Active Architecture Only選No
- 架構(gòu)合并,作者在文中附帶了script,很贊鱼蝉!
framwork做好后可以使用lipo -info 查看所支持的CPU架構(gòu),顯示出Architectures in the fat file: XXX are: i386 x86_64 armv7 arm64
表示同時支持了模擬器和真機魁亦,可以拿來用了羔挡。
惱人的秋風--bitcode問題
framework打好了间唉,調(diào)試運行一切OK呈野,打包上線走起印叁,果然掛了:砀帧!幔戏!error提示
bitcode bundle could not be generated because
xxx was built without full bitcode.
All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture armv7
又是一番Google税课。最終在這篇文章找到了解決方案,淚流滿面垒玲。同時腦補了下-fembed-bitcode-marker和-fembed-bitcode合愈,還是蠻開心击狮。于是在Bulid Settings中同時做了以下處理
- Enable Bitcode = Yes
- Other C Flags中添加-fembed-bitcode
- User-Defined中添加BITCODE_GENERATION_MODE=bitcode
然后再次構(gòu)建出新的framework,終于彪蓬,穩(wěn)了。