最近,在將工程中的幾個基礎庫打包成動態庫,減小二進制包大小。在本機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'
複製代碼
這張圖表達的比較清晰:
另外還有一個種方式是直接在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參數是-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
,說明咱們打的包不對。
另外,若是要查看lib是否支持bitcode,可執行以下命令,查看是否有__LLVM
。
otool -arch armv7 -l xx.a/xx.framework | grep __LLVM
複製代碼