成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

必讀!結合實際問題的Bitcode適配指南

移動開發
隨著XCode7的發布,Apple提供了一項新的技術來支持App瘦身功能,那就是Bitcode。本文章將會結合自己在支持bitcode過程中遇到的問題,來闡述支持bitcode的過程。

隨著XCode7的發布,Apple提供了一項新的技術來支持App瘦身功能,那就是Bitcode。本文章將會結合自己在支持bitcode過程中遇到的問題,來闡述支持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之后,蘋果會根據下載應用的用戶的手機指令集類型生成只有該指令集的二進制,進行下發。從而達到精簡安裝包體積的目的。

23.png

一點編譯原理

為了更好的理解什么是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

一般情況下,在真實的編譯器構架那種,會將上述過程分成前端和后端兩部分來處理:

7df22103jw1eyd62a1opyj21f816sn5d.jpg

在前后端之間傳遞的就是IR(中間碼),而bitcode就是一種特殊形式的中間碼。原本前后端的工作都是在本地LLVM中完成,雖然Apple沒有給出具體的Bitcode實現,但是通過他們的文檔可以猜測,是將一部分后端的工作移到了服務器進行。從Xcode上傳IR到服務器,服務器來真對不同的機型進行后續操作。從而達到真對不同機型生成對應指令集的二進制,而減小報體積的目的。

打開bitcode設置

實際上在Xcode 7中,我們新建一個iOS程序時,bitcode選項默認是設置為YES的。我們可以在”Build Settings”->”Enable Bitcode”選項中看到這個設置。

不過,我們現在需要考慮的是三個平臺:iOS/Mac OS/watchOS。

  • 對應iOS,bitcode是可選的。

  • 對于watchOS,bitcode是必須的。

  • Mac OS不支持bitcode。

如果我們開啟了bitcode,在提交包時,下面這個界面也會有個bitcode選項:

012.png

但是如果其中包含第三方庫,不支持bitcode時候。需要將”Enable BitCode”設置成NO。而且這個選項是,只要有一個第三方庫不支持,就不能開的。否則連接錯誤。

確保打包的時候使用的是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:只是簡單的標記一下在archive出來的二進制中bitcdoe所在的位置。

  • fembed-bitcode: 真的會生成bitcode指令,并且嵌入到二進制中,這個設置不止要在app中設置,同樣你也必須在編譯靜態鏈接庫的時候使用。而且需要主題的是該參數系統只默認在archive模式下會添加

需要注意的是bitcode只默認在archive下編譯。在debug和release下并不會。

如果您開發的是app那么走正常的打包archive流程就好了。如果你正在開發.a靜態庫或者framework,請注意打包方式設置為archive,或者在打包腳本中加入-fembed-bitcode參數。如果需要的話,需要在Build Settings中打開 DEPLOYMENT_POSTPROCESSING=YES,設置Strip Style為debugging。

檢測是否打開Bitcode

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

針對于靜態鏈接庫.a文件

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

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

7df22103jw1ey7d1wkb9aj21a7032gmo.jpg

如果不支持bitcode則不會出現該數字。

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

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

由于app中二進制和framework中二進制文件與.a文件存在差異,因為需要檢查的是__LLVM段,當出現該段的時候,則表示支持bitcdoe,否則不支持。

otool -l xxxx | grep __LLVM | wc -l

這里otool有個bug,當你的framework使用過lipo命令,進行拆解和合并之后,需要指定指令集進行檢查才可以。

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

BUT, 上述檢查過了之后,也不一定是真的支持bitcode,在實際的測試中,發現上述檢測命令通過之后,某個使用的第三方庫,依然報錯不支持bitcode。因而最終結果,還是需要以是否能夠連接成功為準。重要事情說三遍,上述網上流傳的檢測方法只做參考,最終還是要以實際效果為準。

最終結果檢查

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

CheckPoint1 連接是否報錯

如果有任何一個庫沒有打開bitcode鏈接,將會出現類似下方的錯誤。只要鏈接過了,那么恭喜了,基本上是OK了。 

7df22103jw1eyc7gbmexbj21fy04o7as.jpg

CheckPoint2 檢查最終效果

使用開發模式導出ipa

03.jpg

04.jpg

選擇出包的方式

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

05.jpg

出現了,Compiling Bitcode,這個過程?。。。?!

06.jpg

最終結果

在***輸出的文件中,你能夠看到一個App Thinning的結果,里面有針對各個機型的ipa包。

07.jpg

在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
....

責任編輯:倪明 來源: iOS_Tips
相關推薦

2021-12-27 10:40:13

Kubernetes網絡圖解Linux

2010-05-14 18:22:56

MySQLSQL優化索

2012-08-22 08:58:39

編程

2011-06-27 16:44:59

Qmake

2013-09-22 10:15:05

編程思想

2010-03-16 09:41:34

交換機配置

2010-03-15 18:08:01

Python編程語言

2024-11-21 06:00:00

Python列表推導式

2017-03-01 10:04:16

2009-10-10 09:03:00

網絡布線

2013-03-25 10:36:20

Android解決問題代碼片段

2010-03-23 09:32:32

云計算云網絡

2009-10-14 09:27:15

結構化綜合布線

2020-07-27 10:51:36

機器學習數據人工智能

2019-11-12 14:20:05

區塊鏈比特幣區塊鏈應用

2019-11-14 15:17:49

區塊鏈應用數字貨幣

2022-12-19 11:41:02

靈動島蘋果

2019-08-09 10:15:14

機器學習人工智能監督學習

2019-08-16 10:55:37

開發者技能AI

2021-11-04 11:43:04

騰訊云醫療
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 999在线精品 | 91精品国产色综合久久不卡98口 | 精品国产精品国产偷麻豆 | 国产日韩一区二区三区 | 成人国产免费视频 | 国产小视频自拍 | 日韩成人免费av | 日韩欧美中文 | 中文成人在线 | 欧美三区视频 | 久久久久久久久久久久亚洲 | 99精品国产在热久久 | 日韩中文在线视频 | 亚洲在线视频 | 日韩欧美三区 | 欧美狠狠操 | 在线免费中文字幕 | 中文字幕免费在线 | 精品久久久一区 | 欧美高清视频一区 | 国产高清在线精品一区二区三区 | 成年人黄色一级毛片 | 色桃网| 粉嫩粉嫩芽的虎白女18在线视频 | 日韩免费视频一区二区 | 美女张开腿露出尿口 | 国产精品国产精品国产专区不卡 | 看片国产 | 久久久久免费观看 | 欧美天堂| 青青草av | 天堂av影院 | 久久激情视频 | wwww.xxxx免费| 国产色在线 | 天天干免费视频 | 久久国产激情视频 | 99久久久无码国产精品 | 一区二区免费 | 欧美精品成人 | 亚洲乱码国产乱码精品精的特点 |