Swift工程如何整合Static Library

杭州鳳梨發表於2018-11-13

我們的iOS專案中使用了Swift+Objective-C的混合開發,很長一段時間我們在Podfile中使用的是use_frameworks!,也就是把所有Pods做成Dynamic framework。 微信等第三方SDK以靜態庫.a的形式提供給開發者,導致我們沒有辦法直接依賴,會報類似xxx has transitive dependencies that include static binaries的錯誤,因此我們不得不把.a封裝成動態framework然後才能通過Cocoapods整合到專案裡。

基本概念

  • 靜態庫:一堆目標檔案的打包體。連結時會被完整的複製到可執行檔案中,存在多個可執行檔案中包含同一份靜態庫程式碼的問題。
  • 動態庫:一個沒有main函式的可執行檔案。連結時不復制程式碼,程式啟動後用dyld載入,然後再決議符號。所以一份動態庫可以供多個程式動態連結,達到節省記憶體的目的。

坑一

Dynamic framework的製作過程網上有很多文章,我主要參考了元件化-動態庫實戰 這邊文章。再次感謝文章作者@南梔傾寒 按這篇文章一步一步來基本可以完成90%以上的工作。之所以不是100%是因為我們實際製作中遇到了CPU指令集的支援問題,需要特別關注以下幾點:

  • Mach-O Type要選擇Dynamic Library
  • Buld Setting中Other Linker Flags要加上-all_load,否則可能會導致部分檔案無法整合到framework
  • Buld Setting中Build Active Architecture Only選No
  • 指令集合並,作者在文中附帶了script,可以使生成的framework同事支援模擬器和真機的CPU上允許,很贊! framwork做好後可以使用lipo -info 檢視所支援的CPU架構,顯示出Architectures in the fat file: XXX are: i386 x86_64 armv7 arm64表示同時支援了模擬器和真機,可以拿來用了。

坑二

Dynamic framework打好了,通過Cocoapods整合到主工程。除錯、執行一切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,還是覺得收穫滿滿。於是在製作Dy namic framework的工種的Bulid Settings中同時做了以下處理

  • Enable Bitcode = Yes
  • Other C Flags中新增-fembed-bitcode
  • User-Defined中新增BITCODE_GENERATION_MODE=bitcode

然後再次構建出新的framework整合到主工程中去Archive,這下,終於,穩了!

相關文章