iOS中動/靜態庫支持bitcode的問題

最近,在將工程中的幾個基礎庫打包成動態庫,減小二進制包大小。在本機build時沒出現啥問題。可是在jenkins上打包,卻出現了以下錯誤:ios

Error Domain=IDEFoundationErrorDomain Code=1 "Failed to verify bitcode in FLAnimatedImage.framework/FLAnimatedImage: error: Bundle only contains bitcode-marker  複製代碼

經搜索,發現跟bitcode相關。由於這些庫默認是支持bitcode的,在build時,compile的參數是-fembed-bitcode-marker,它的意思只是標記二進制文件中有bitcode,可是實際上沒有內容,通常用於測試。xcode

而咱們在jenkins上打包時,先archive,而後再導出ipa包,而archive的編譯參數是-fembed-bitcode,因此與本地調試不太同樣。bash

那麼,這兩個參數有什麼區別呢?架構

[StackOverFlow上的回答](https://stackoverflow.com/questions/31233395/ios-library-to-bitcode)說的比較清楚。測試

• -fembed-bitcode-marker simply marks where the bitcode would be in the binary after an archive build. • -fembed-bitcode actually does the full bitcode generation and embedding, so this is what you need to use for building static libraries. • Xcode itself builds with -fembed-bitcode-marker for regular builds (like deploy to simulator) • Xcode only builds with -fembed-bitcode for archive builds / production builds (as this is only needed for Apple).ui

-fembed-bitcode-marker會生成一個最小bitcode的section,可是沒有任何內容,size=1。this

-fembed-bitcode則會生成bitcode的相關內容。spa

You should be aware that a normal build with the -fembed-bitcode-marker option will produce minimal size embedded bitcode sections without any real content. This is done as a way of testing the bitcode-related aspects of your build without slowing down the build process. The actual bitcode content is included when you do an Archive build.調試

因此咱們在打包lib的時候,須要設置參數-fembed-bitcode,這樣纔會包含bitcode的內容。code

所以,解決方案有兩種:

  • 禁用bitcode

  • 設置參數-fembed-bitcode

如何設置參數

因爲我是基於pod package來打包,因此須要需改podspec文件,添加xcconfig便可。

s.xcconfig = {'BITCODE_GENERATION_MODE' => 'bitcode'}
複製代碼

這裏插一句,在用pod package打包時,若是依賴的庫是動態庫時,會有問題,我本身將源碼改了下,會另外寫一篇文章說說。

若是你是經過xcodebuild來打包lib的話,能夠在build setting的User-Define Setting中添加,這樣在build的時候也會是-fembed-bitcode

'BITCODE_GENERATION_MODE' => 'bitcode'
複製代碼

以下圖:

若是想讓參數是-fembed-bitcode-marker,設置爲marker

'BITCODE_GENERATION_MODE' => 'marker'
複製代碼

這張圖表達的比較清晰:

bitcode.png

另外還有一個種方式是直接在Other C flags裏設置,網上說會產生warning。不過我還沒嘗試過。推薦使用設置BITCODE_GENERATION_MODE的方式。

(When I tested using the -fembed-bitcode on the Other C flags, Xcode gave the warning clang: warning: argument unused during compilation: '-fembed-bitcode-marker')

如何檢查生成的lib是否正確

可經過如下方式查看,打出的lib參數是-fembed-bitcode-marker仍是-fembed-bitcode

在terminal中輸入

otool -arch armv7 -l xx.a/xx.framework
複製代碼

注意:若是lib包含了模擬器架構,則須要指定相應真機的arch才能看獲得。

而後,Ctrl+F,搜索__bundle,應該會出現如下內容:

Section
 sectname __bundle
  segname __LLVM
     addr 0x0002c000
     size 0x000b0a09
   offset 180224
    align 2^0 (1)
   reloff 0
   nreloc 0
    flags 0x00000000
reserved1 0
reserved2 0
複製代碼

若是size不爲1,則說明是-fembed-bitcode

若是結果以下圖,則是-fembed-bitcode-marker,說明咱們打的包不對。

bundle.png

另外,若是要查看lib是否支持bitcode,可執行以下命令,查看是否有__LLVM

otool -arch armv7 -l xx.a/xx.framework | grep __LLVM
複製代碼
相關文章
相關標籤/搜索