Bitcode適配

一、BitCode是什么

Bitcode is an intermediate representation of a compiled program. Apps you upload to iTunes Connect that contain bitcode will be compiled and linked on the store. Including bitcode will allow Apple to re-optimize your app binary in the future without the need to submit a new version of your app to the store.

Xcode hides symbols generated during build time by default, so they are not readable by Apple. Only if you choose to include symbols when uploading your app to iTunes Connect would the symbols be sent to Apple. You must include symbols to receive crash reports from Apple.

上述引自Apple的文檔?App Thinning (iOS, tvOS, watchOS)隅肥。

其大概意思是Bitcode類似于一個中間碼竿奏,被上傳到applestore之后,蘋果會根據(jù)下載應(yīng)用的用戶的手機(jī)指令集類型生成只有該指令集的二進(jìn)制腥放,進(jìn)行下發(fā)泛啸。從而達(dá)到精簡安裝包體積的目的。

為了更好的理解什么是bitcode秃症,我們簡短的看一下編譯器編譯的過程:

Lexer:讀入源文件候址,并將其轉(zhuǎn)化成字符流

Parser:將字符流轉(zhuǎn)換成AST(抽象語法樹)

Semantic Analysis: 對輸入的AST進(jìn)行語法檢查吕粹。

Code Generation: 代碼生成,將AST轉(zhuǎn)換成低層次的IR指令

Optimization: 分析IR指令岗仑,將其中潛在會拖慢運(yùn)行速度的指令干掉昂芜。

AsmPrinter: 通過IR(中間碼)生成特定CPU架構(gòu)的匯編代碼

Assemble: 將匯編代碼轉(zhuǎn)化成二進(jìn)制

Linker: 通常程序會引用其他的二進(jìn)制文件(.a或者framework),但是這些鏈接在程序中沒有正確的地址赔蒲,只是個占位符。Linker的工作就是給這些占位符正確的地址良漱。

更多信息可以參考:The Compiler

一般情況下舞虱,在真實(shí)的編譯器構(gòu)架那種,會將上述過程分成前端和后端兩部分來處理:

在前后端之間傳遞的就是IR(中間碼)母市,而bitcode就是一種特殊形式的中間碼矾兜。原本前后端的工作都是在本地LLVM中完成,雖然Apple沒有給出具體的Bitcode實(shí)現(xiàn)患久,但是通過他們的文檔可以猜測椅寺,是將一部分后端的工作移到了服務(wù)器進(jìn)行。從Xcode上傳IR到服務(wù)器蒋失,服務(wù)器來真對不同的機(jī)型進(jìn)行后續(xù)操作返帕。從而達(dá)到真對不同機(jī)型生成對應(yīng)指令集的二進(jìn)制,而減小報體積的目的篙挽。

二荆萤、打開bitcode設(shè)置

實(shí)際上在Xcode 7中,我們新建一個iOS程序時铣卡,bitcode選項(xiàng)默認(rèn)是設(shè)置為YES的链韭。我們可以在”Build Settings”->”Enable Bitcode”選項(xiàng)中看到這個設(shè)置。

不過煮落,我們現(xiàn)在需要考慮的是三個平臺:iOS敞峭,Mac OS,watchOS蝉仇。

對應(yīng)iOS旋讹,bitcode是可選的。

對于watchOS轿衔,bitcode是必須的骗村。

Mac OS不支持bitcode。

如果我們開啟了bitcode呀枢,在提交包時胚股,下面這個界面也會有個bitcode選項(xiàng):

但是如果其中包含第三方庫,不支持bitcode時候裙秋。需要將”Enable BitCode”設(shè)置成NO琅拌。而且這個選項(xiàng)是缨伊,只要有一個第三方庫不支持,就不能開的进宝。否則連接錯誤刻坊。

確保打包的時候使用的是fembed-bitcode, 而不是fembed-bitcode-maker

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.

fembed-bitcode-maker:只是簡單的標(biāo)記一下在archive出來的二進(jìn)制中bitcdoe所在的位置。

fembed-bitcode: 真的會生成bitcode指令党晋,并且嵌入到二進(jìn)制中谭胚,這個設(shè)置不止要在app中設(shè)置,同樣你也必須在編譯靜態(tài)鏈接庫的時候使用未玻。而且需要主題的是該參數(shù)系統(tǒng)只默認(rèn)在archive模式下會添加

需要注意的是bitcode只默認(rèn)在archive下編譯灾而。在debug和release下并不會。

如果您開發(fā)的是app那么走正常的打包archive流程就好了扳剿。如果你正在開發(fā).a靜態(tài)庫或者framework旁趟,請注意打包方式設(shè)置為archive,或者在打包腳本中加入-fembed-bitcode參數(shù)。如果需要的話庇绽,需要在Build Settings中打開 DEPLOYMENT_POSTPROCESSING=YES锡搜,設(shè)置Strip Style為debugging。

三瞧掺、檢測是否打開Bitcode

當(dāng)打開bitcdoe選項(xiàng)之后耕餐,我們可以使用otool工具來檢查二進(jìn)制文件中是否包含bitcode段。

針對于靜態(tài)鏈接庫.a文件

otool -arch armv7 -l xxxx.a | grep __bitcode | wc -l

如果是當(dāng)前庫支持.a文件則會輸出一個數(shù)字

如果不支持bitcode則不會出現(xiàn)該數(shù)字辟狈。

上述命令只檢查了armv7架構(gòu)蛾方,同時,也必須使用改指令檢查其他的指令集是否包含bitcode如:arm64上陕,armv7s等等

檢查app或者framework中是否包含bitcode

由于app中二進(jìn)制和framework中二進(jìn)制文件與.a文件存在差異桩砰,因?yàn)樾枰獧z查的是__LLVM段,當(dāng)出現(xiàn)該段的時候释簿,則表示支持bitcdoe亚隅,否則不支持。

otool -l xxxx | grep __LLVM | wc -l

這里otool有個bug庶溶,當(dāng)你的framework使用過lipo命令煮纵,進(jìn)行拆解和合并之后,需要指定指令集進(jìn)行檢查才可以偏螺。

otool -arch armv7 -l xxxx | grep __LLVM | wc -l

BUT, 上述檢查過了之后行疏,也不一定是真的支持bitcode,在實(shí)際的測試中套像,發(fā)現(xiàn)上述檢測命令通過之后酿联,某個使用的第三方庫,依然報錯不支持bitcode。因而最終結(jié)果贞让,還是需要以是否能夠連接成功為準(zhǔn)周崭。重要事情說三遍,上述網(wǎng)上流傳的檢測方法只做參考喳张,最終還是要以實(shí)際效果為準(zhǔn)续镇。

四、最終結(jié)果檢查

如果您是一個APP销部,可以直接進(jìn)行Archive打包摸航,如果是一個庫,則建議建一個Demo工程進(jìn)行打包舅桩,記得要打開bitcode設(shè)置酱虎。

CheckPoint1 連接是否報錯

如果有任何一個庫沒有打開bitcode鏈接,將會出現(xiàn)類似下方的錯誤江咳。只要鏈接過了,那么恭喜了哥放,基本上是OK了歼指。

CheckPoint2 檢查最終效果

使用開發(fā)模式導(dǎo)出ipa

五、選擇出包的方式

這里建議使用第二種甥雕,生成真對具體機(jī)型的包

出現(xiàn)了踩身,Compiling Bitcode,這個過程I缏丁P琛!G偷堋附鸽!

六、最終結(jié)果

在最后輸出的文件中瞒瘸,你能夠看到一個App Thinning的結(jié)果坷备,里面有針對各個機(jī)型的ipa包。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末情臭,一起剝皮案震驚了整個濱河市省撑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俯在,老刑警劉巖竟秫,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異跷乐,居然都是意外死亡肥败,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拙吉,“玉大人潮孽,你說我怎么就攤上這事】昵” “怎么了往史?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長佛舱。 經(jīng)常有香客問我椎例,道長,這世上最難降的妖魔是什么请祖? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任订歪,我火速辦了婚禮,結(jié)果婚禮上肆捕,老公的妹妹穿的比我還像新娘刷晋。我一直安慰自己,他們只是感情好慎陵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布眼虱。 她就那樣靜靜地躺著,像睡著了一般席纽。 火紅的嫁衣襯著肌膚如雪捏悬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天润梯,我揣著相機(jī)與錄音过牙,去河邊找鬼。 笑死纺铭,一個胖子當(dāng)著我的面吹牛寇钉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舶赔,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼摧莽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了顿痪?” 一聲冷哼從身側(cè)響起镊辕,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚁袭,沒想到半個月后征懈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揩悄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年卖哎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡亏娜,死狀恐怖焕窝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情维贺,我是刑警寧澤它掂,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站溯泣,受9級特大地震影響虐秋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垃沦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一客给、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肢簿,春花似錦靶剑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纵菌,卻和暖如春阐污,著一層夾襖步出監(jiān)牢的瞬間休涤,已是汗流浹背咱圆。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留功氨,地道東北人序苏。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像捷凄,于是被迫代替她去往敵國和親忱详。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 2018.4.18如相關(guān)原作者要求刪除跺涤,請聯(lián)系我匈睁,立刪。 1.iOS開發(fā) - Bitcode適配指南2.理解iOS...
    Raywf閱讀 793評論 1 2
  • 實(shí)修第五周第天 早上見到朋友一個人桶错,旁邊的小“跟屁蟲”不見了航唆,我問她:“今天怎么沒帶孩子呢?”她話中含怒說:“不知...
    孫海霞_a364閱讀 715評論 0 5
  • 假期里讀了《誰動了我的奶酪》這本書院刁,感觸很深糯钙。這本書主要講了兩只小老鼠嗅嗅、匆匆和兩個小矮人哼哼、唧唧在迷...
    玉茶胡玉霞閱讀 74評論 0 0
  • “求你了任岸,渡我…渡我……” 天色昏沉再榄,黯云游走于天際,層疊交錯享潜,時常滯留片刻疯趟。一望無際的河川橫在眼前,崖頭翩隧,僅寥寥...
    宋昏閱讀 475評論 0 0