随着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
....

结合实际问题的 Bitcode 适配指南 (一)相关推荐

  1. Android P 适配指南

    Android P 适配指南 原创: 王超 刘望舒 1周前 作者:王超1478507995000 https://juejin.im/post/5b8959f96fb9a019fe685eb3 本文由 ...

  2. Android P(3)---Android P版本刘海屏适配指南

    Android P版本刘海屏适配指南 Android P预览版增加了很多亮点新特性,其中最接地气.最直观的改变当属适配了类似于华为P20的顶部凹槽屏幕设计这一项,俗称刘海屏. 在开发者模式中,Andr ...

  3. Android系统---- 全面屏(18:9屏幕)适配指南

    7535 Android手机 全面屏(18:9屏幕)适配指南     从小米MIX 1发布以来,越来越多所谓"全面屏"手机发布,如三星S8,小米MIX2,VIVO X20,Goog ...

  4. RK系列开发板音频驱动适配指南(二)

    背景: 上一篇文章RK系列开发板音频驱动适配指南-DAI模块适配中已经阐述音频驱动适配的DAI模块适配步骤以及核心代码的展示,本次主要介绍音频驱动适配中的DMA模块适配. RK系列开发板 DMA模块适 ...

  5. 微信iOS WKWebview 网页开发适配指南

    微信2017.1.6日推送一条消息: 微信iOS客户端 将于2017年3月1日前逐步升级为WKWebview内核,需要网页开发者提前做好网站的兼容检查和适配. 背景 WKWebView 是苹果在iOS ...

  6. Android12 新特性及适配指南

    Android 12(API 31)于2021年10月4日正式发布,正式版源代码也于当日被推送到AOSP Android开源项目.截止到笔者撰写这篇文章时,国内各终端厂商的在售Android设备,已经 ...

  7. 【Web技术】935- 深色模式适配指南

    ????  这是第 65 篇不掺水的原创,想要了解更多,请戳上方蓝色字体:政采云前端团队 关注我们吧- 本文首发于政采云前端团队博客:深色模式适配指南 https://www.zoo.team/art ...

  8. Android 11 适配指南

    Android 适配指南 Android 11适配指南 Scoped Storage(分区存储) 诞生的缘由 文件访问 详细 权限改变 定位权限 软件包可见性 前台服务类型 读取手机号 自定义Toas ...

  9. 移动端适配指南!聊聊安卓折叠屏给交互设计和开发带来的变化

    移动端的时代前端同学面临着各种适配的处理.刘海机的出现,前端需要考虑刘海机适配.如今,随着折叠屏手机的面世,前端同学接着又要处理折叠屏幕的适配.本文除了介绍折叠机给我们带来的变化之外,还提出了响应式设 ...

最新文章

  1. 报告!插件×元宵来啦
  2. yolov3 get_next_batch 异常
  3. Windows 上看端口 找PID
  4. VS2019 开发第一个Windows驱动程序
  5. python语言通过字典实现映射关系_mpython3丨字典的使用介绍
  6. python使用率_Python获取CPU、内存使用率以及网络使用状态代码
  7. iOS再现安全漏洞 “1970变砖”问题仍未解决
  8. 小学生们在B站讲算法,这么内卷么?
  9. mysql中in的使用
  10. 网易微专业python全栈工程师_Python学习笔记:6.3.10 flash WTF数据验证,6310flaskwtf
  11. C++期末项目设计------制作一个游戏盒
  12. 记《浪潮之巅》-第一版-6.IT业的罗马帝国--微软,Microsoft
  13. 成功解决xgboost\core.py:614: UserWarning: Use subset (sliced data) of np.ndarray is not recommended beca
  14. 目标检测YOLO实战应用案例100讲-自动驾驶场景下的三维目标检测技术研究
  15. Delphi名称的由来(原作:Borland公司Danny Thorpe)
  16. 毕设论文中第一章的图注出现“图一.1”,转化为“图1.1”的方法
  17. 【Matlab图像去噪】小波滤波(硬阙值+软阙值)+中值滤波图像去噪【含源码 462期】
  18. Android创建新的联系人,保存至现有联系人
  19. STM32L0系列之【LPTIM定时器】
  20. 浙大python习题超详细思路(第二章)

热门文章

  1. 软件宝宝系列——SQL注入篇
  2. JAI LT-400CL相机设置
  3. 工作,是人生的另一道窄门
  4. 12星座的出生年月日性格_十二星座的日期和性格特点
  5. CAD数据集导出DWG,风格对照表的使用
  6. IDEA 2020/7/28更新特性速览 - 对于各框架的支持,版本控制工具,docker,构建工具等的支持
  7. Go语言特性记录及与java、python对比之包、变量和函数
  8. 图像处理中的香农采样定理
  9. 在 Ubuntu 上添加或删除 PPA 存储库
  10. 数据预处理之对数变换