轉載_iOS理解開發(fā)中的BitCode選項(Objective-C)

2018.4.18
如相關原作者要求刪除博敬,請聯(lián)系我奉呛,立刪计螺。

1.iOS開發(fā) - Bitcode適配指南
2.理解iOS開發(fā)中BitCode功能
3.深入理解iOS開發(fā)中的BitCode功能

從Xcode7開始,新建項目默認就打開了bitcode設置

LLVM是目前蘋果采用的編譯器工具鏈,Bitcode是LLVM編譯器的中間代碼的一種編碼,LLVM的前端可以理解為C/C++/OC/Swift等編程語言,LLVM的后端可以理解為各個芯片平臺上的匯編指令或者可執(zhí)行機器指令數(shù)據(jù),那么,BitCode就是位于這兩者直接的中間碼. LLVM的編譯工作原理是前端負責把項目程序源代碼翻譯成Bitcode中間碼,然后再根據(jù)不同目標機器芯片平臺轉換為相應的匯編指令以及翻譯為機器碼.這樣設計就可以讓LLVM成為了一個編譯器架構,可以輕而易舉的在LLVM架構之上發(fā)明新的語言(前端),以及在LLVM架構下面支持新的CPU(后端)指令輸出,雖然Bitcode僅僅只是一個中間碼不能在任何平臺上運行,但是它可以轉化為任何被支持的CPU架構,包括現(xiàn)在還沒被發(fā)明的CPU架構,也就是說現(xiàn)在打開Bitcode功能提交一個App到應用商店,以后如果蘋果新出了一款手機并CPU也是全新設計的,在蘋果后臺服務器一樣可以從這個App的Bitcode開始編譯轉化為新CPU上的可執(zhí)行程序,可供新手機用戶下載運行這個App.
再看官方文檔的解釋:
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 App 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.
說的是bitcode是被編譯程序的一種中間形式的代碼。包含bitcode配置的程序將會在App store上被編譯和鏈接瞧壮。bitcode允許蘋果在后期重新優(yōu)化我們程序的二進制文件登馒,而不需要我們重新提交一個新的版本到App store上。
繼續(xù)看咆槽,在What’s New in Xcode-New Features in Xcode 7中陈轿,還有一段如下的描述
Bitcode. When you archive for submission to the App Store, Xcode will compile your app into an intermediate representation. The App Store will then compile the bitcode down into the 64 or 32 bit executables as necessary.
當我們提交程序到App store上時,Xcode會將程序編譯為一個中間表現(xiàn)形式(bitcode)秦忿。然后App store會再將這個botcode編譯為可執(zhí)行的64位或32位程序麦射。

Bitcode配置

在相關的錯誤提示中,一般類似的有提到如何處理我們遇到的問題:
You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
要么讓第三方庫支持灯谣,要么關閉target的bitcode選項潜秋。
實際上從Xcode 7之后,我們新建一個iOS程序時胎许,bitcode選項默認是設置為YES的峻呛。我們可以在”Build Settings”->”Enable Bitcode”選項中看到這個設置罗售。
不過,我們現(xiàn)在需要考慮的是三個平臺:iOS钩述,Mac OS寨躁,watchOS。
對應iOS牙勘,bitcode是可選的职恳。
對于watchOS,bitcode是必須的方面。
Mac OS不支持bitcode放钦。
如上面所說,bitcode是一種中間代碼恭金。LLVM官方文檔有介紹這種文件的格式最筒,有興趣的可以移步LLVM Bitcode File Format。

一點編譯原理

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

  1. Lexer :讀入源文件床蜘,并將其轉化成字符流
  2. Parser :將字符流轉換成AST(抽象語法樹)
  3. Semantic Analysis: 對輸入的AST進行語法檢查。
  4. Code Generation: 代碼生成蔑水,將AST轉換成低層次的IR指令
  5. Optimization: 分析IR指令邢锯,將其中潛在會拖慢運行速度的指令干掉。
  6. AsmPrinter: 通過IR(中間碼)生成特定CPU架構的匯編代碼
  7. Assemble: 將匯編代碼轉化成二進制
  8. Linker: 通常程序會引用其他的二進制文件(.a或者framework)搀别,但是這些鏈接在程序中沒有正確的地址丹擎,只是個占位符。Linker的工作就是給這些占位符正確的地址歇父。
    更多信息可以參考:The Compiler
    一般情況下蒂培,在真實的編譯器構架那種,會將上述過程分成前端和后端兩部分來處理:

    在前后端之間傳遞的就是IR(中間碼)榜苫,而bitcode就是一種特殊形式的中間碼护戳。原本前后端的工作都是在本地LLVM中完成,雖然Apple沒有給出具體的Bitcode實現(xiàn)垂睬,但是通過他們的文檔可以猜測媳荒,是將一部分后端的工作移到了服務器進行。從Xcode上傳IR到服務器驹饺,服務器來真對不同的機型進行后續(xù)操作钳枕。從而達到真對不同機型生成對應指令集的二進制,而減小報體積的目的赏壹。
    需要注意的是bitcode只默認在archive下編譯鱼炒。在debug和release下并不會。

檢測是否打開Bitcode

當打開bitcdoe選項之后蝌借,我們可以使用otool工具來檢查二進制文件中是否包含bitcode段昔瞧。

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

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

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

如果不支持bitcode則不會出現(xiàn)該數(shù)字俐巴。
上述命令只檢查了armv7架構,同時硬爆,也必須使用改指令檢查其他的指令集是否包含bitcode如:arm64,armv7s等等

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

由于app中二進制和framework中二進制文件與.a文件存在差異擎鸠,因為需要檢查的是__LLVM段缀磕,當出現(xiàn)該段的時候,則表示支持bitcdoe劣光,否則不支持袜蚕。
otool -l xxxx | grep __LLVM | wc -l
這里otool有個bug,當你的framework使用過lipo命令绢涡,進行拆解和合并之后牲剃,需要指定指令集進行檢查才可以。
otool -arch armv7 -l xxxx | grep __LLVM | wc -l
BUT, 上述檢查過了之后雄可,也不一定是真的支持bitcode凿傅,在實際的測試中,發(fā)現(xiàn)上述檢測命令通過之后数苫,某個使用的第三方庫聪舒,依然報錯不支持bitcode。因而最終結果虐急,還是需要以是否能夠連接成功為準箱残。重要事情說三遍,上述網上流傳的檢測方法只做參考止吁,最終還是要以實際效果為準被辑。

最終結果檢查

如果您是一個APP,可以直接進行Archive打包敬惦,如果是一個庫盼理,則建議建一個Demo工程進行打包,記得要打開bitcode設置俄删。

CheckPoint1 連接是否報錯

如果有任何一個庫沒有打開bitcode鏈接榜揖,將會出現(xiàn)類似下方的錯誤。只要鏈接過了抗蠢,那么恭喜了举哟,基本上是OK了。
連接報錯
CheckPoint2 檢查最終效果

1.使用開發(fā)模式導出ipa


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

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

2.選擇出包的方式


這里建議使用第二種迅矛,生成真對具體機型的包

出現(xiàn)了妨猩,Compiling Bitcode,這個過程;喟:琛M怠!庐椒!

3.最終結果
在最后輸出的文件中椒舵,你能夠看到一個App Thinning的結果,里面有針對各個機型的ipa包约谈。
Apps

在App Thinning Size Report中能夠明顯看到笔宿,由于使用了bitcode等技術之后,所帶來的收益:

App Thinning Size Report for All Variants of Black

Variant: Black-iPad (4th generation)-etc.ipa
Supported devices: iPad (3rd generation) and iPad (4th generation)
App + On Demand Resources size: 368 KB compressed, 737 KB uncompressed
App size: 368 KB compressed, 737 KB uncompressed
On Demand Resources size: Zero KB compressed, Zero KB uncompressed
....
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末棱诱,一起剝皮案震驚了整個濱河市泼橘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迈勋,老刑警劉巖炬灭,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異靡菇,居然都是意外死亡重归,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門厦凤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來提前,“玉大人,你說我怎么就攤上這事泳唠”吠” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵笨腥,是天一觀的道長拓哺。 經常有香客問我,道長脖母,這世上最難降的妖魔是什么士鸥? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮谆级,結果婚禮上烤礁,老公的妹妹穿的比我還像新娘。我一直安慰自己肥照,他們只是感情好脚仔,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舆绎,像睡著了一般鲤脏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天猎醇,我揣著相機與錄音窥突,去河邊找鬼。 笑死硫嘶,一個胖子當著我的面吹牛阻问,可吹牛的內容都是我干的。 我是一名探鬼主播沦疾,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼称近,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了曹鸠?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤斥铺,失蹤者是張志新(化名)和其女友劉穎彻桃,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晾蜘,經...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡邻眷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了剔交。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肆饶。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖岖常,靈堂內的尸體忽然破棺而出驯镊,到底是詐尸還是另有隱情,我是刑警寧澤竭鞍,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布板惑,位于F島的核電站,受9級特大地震影響偎快,放射性物質發(fā)生泄漏冯乘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一晒夹、第九天 我趴在偏房一處隱蔽的房頂上張望裆馒。 院中可真熱鬧,春花似錦丐怯、人聲如沸喷好。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绒窑。三九已至,卻和暖如春舔亭,著一層夾襖步出監(jiān)牢的瞬間些膨,已是汗流浹背蟀俊。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留订雾,地道東北人肢预。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像洼哎,于是被迫代替她去往敵國和親烫映。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內容