iOS - Bitcode App 瘦身中间码

时间:2021-08-06 17:44:28

1、Bitcode

  • 随着 Xcode7 的发布,Apple 提供了一项新的技术来支持 App 瘦身功能,那就是 Bitcode。

  • 1、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 之后,苹果会根据下载应用的用户的手机指令集类型生成只有该指令集的二进制,进行下发,从而达到精简安装包体积的目的。

    iOS - Bitcode  App 瘦身中间码

  • 2、一点编译原理

    • 为了更好的理解什么是 Bitcode,我们简短的看一下编译器编译的过程:

      • Lexer :读入源文件,并将其转化成字符流。

      • Parser :将字符流转换成 AST(抽象语法树)。

      • Semantic Analysis :对输入的 AST 进行语法检查。

      • Code Generation :代码生成,将 AST 转换成低层次的IR指令。

      • Optimization :分析 IR 指令,将其中潜在会拖慢运行速度的指令干掉。

      • AsmPrinter :通过 IR(中间码)生成特定 CPU 架构的汇编代码。

      • Assemble :将汇编代码转化成二进制。

      • Linker :通常程序会引用其他的二进制文件(.a 或者 framework),但是这些链接在程序中没有正确的地址,只是个占位符。Linker 的工作就是给这些占位符正确的地址。

      • 更多信息可以参考:The Compiler

    • 一般情况下,在真实的编译器构架那种,会将上述过程分成前端和后端两部分来处理:

      iOS - Bitcode  App 瘦身中间码

      • 在前后端之间传递的就是 IR(中间码),而 Bitcode 就是一种特殊形式的中间码。原本前后端的工作都是在本地 LLVM 中完成,虽然 Apple 没有给出具体的 Bitcode 实现,但是通过他们的文档可以猜测,是将一部分后端的工作移到了服务器进行。从 Xcode 上传 IR 到服务器,服务器来真对不同的机型进行后续操作。从而达到真对不同机型生成对应指令集的二进制,而减小包体积的目的。
  • 3、Bitcode 设置

    • 实际上在 Xcode7 + 中,我们新建一个 iOS 程序时,Bitcode 选项默认是设置为 YES 的。我们可以在 Build Settings => Build Options => Enable Bitcode 选项中看到这个设置。

    • 不过,我们现在需要考虑的是三个平台:iOS / Mac OS / watchOS。

      • 对应 iOS,Bitcode 是可选的。
      • 对于 watchOS,Bitcode 是必须的。
      • Mac OS 不支持 Bitcode。
    • 如果我们开启了 Bitcode,在提交包时,下面这个界面也会有个 Bitcode 选项:

      iOS - Bitcode  App 瘦身中间码

      • 但是如果其中包含第三方库,不支持 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。
  • 4、检测是否打开 Bitcode

    • 当打开 Bitcdoe 选项之后,我们可以使用 otool 工具来检查二进制文件中是否包含 bitcode 段。

    • 针对于静态链接库 .a 文件

      	otool -arch armv7 -l xxxx.a | grep __bitcode | wc -l
      • 如果是当前库支持 .a 文件则会输出一个数字,如果不支持 Bitcode 则不会出现该数字。

        iOS - Bitcode  App 瘦身中间码

      • 上述命令只检查了 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 了。

          iOS - Bitcode  App 瘦身中间码

      • CheckPoint2 检查最终效果

        • 使用开发模式导出 ipa

          iOS - Bitcode  App 瘦身中间码

          iOS - Bitcode  App 瘦身中间码

  • 5、选择出包的方式

    • 这里建议使用第二种,生成针对具体机型的包

      iOS - Bitcode  App 瘦身中间码

      • 出现了,Compiling Bitcode,这个过程

        iOS - Bitcode  App 瘦身中间码

    • 在最后输出的文件中,你能够看到一个 App Thinning 的结果,里面有针对各个机型的 ipa 包。

      iOS - Bitcode  App 瘦身中间码

    • 在 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 - Bitcode App 瘦身中间码的更多相关文章

  1. iOS 安装包瘦身 (上篇)

    本文来自网易云社区 作者:饶梦云 1. 安装包组成 谈到 App 瘦身,最直接的想法莫过于分析一个安装包内部结构,了解其每一部分的来源.解压一个 ipa 包,拿到其 payload 中 app 文件的 ...

  2. 【转】app瘦身

    iPhone经过这几年的发展,已经发生了很大的变化,例如屏幕变得更加多样,尺寸更多,内存变得更大,CPU的架构也在变化.伴随着iPhone的变化,iOS也在变化,例如AutoLayout.size c ...

  3. iOS安装包瘦身的那些事儿

    在我们提交安装包到App Store的时候,如果安装包过大,有可能会收到类似如下内容的一封邮件: 收到这封邮件的时候,意味着安装包在App Store上下载的时候,有的设备下载的安装包大小会超过100 ...

  4. App瘦身、性能优化总结

    App瘦身 资源瘦身 使用tinypng压缩PNG图片.视频可以通过 Final cut等软件进行分辨率压缩.音频则降低码率即可. 非必须资源文件可以放到自己服务器上 启动图使用 LaunchScre ...

  5. 包建强的培训课程(6):Android App瘦身优化

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  6. app瘦身和包压缩技术有什么区别?

    APP瘦身 针对app文件中的文件进行优化,利用素材的拉伸,祛除不必要的文件,优化png, jpg素材,压缩音视频素材等方式实现app文件的减小. 包压缩技术 所谓包压缩,顾名思义就是将手游的安装包体 ...

  7. 如何实现手游app瘦身?

    手游服务商来说,手游包体大一直是个很困扰的问题.一款手游产品而言,包体大小和更新方式对于有效用户的转化率往往起到非常关键的作用,话说手游安装包越小,用户转化率越高,那该如何实现app瘦身呢? 工具/原 ...

  8. iOS App 瘦身方案

    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大 ...

  9. iOS 安装包瘦身(下篇)

    本文来自网易云社区 作者:饶梦云 2.4. 清理无用代码 2.4.1. Dead Code Stripping Activating this setting causes the -dead_str ...

随机推荐

  1. css3动画第一式--简单翻滚

    在w3cschool上面查阅css3的动画语法手册时,发现“css3 动画”栏目首页放了一个翻滚的div动画案例,觉得挺好看的,于是就自己模仿着写了一下,感觉还行O(∩_∩)O哈哈~ 查看原地址 下面 ...

  2. js中自己实现each方法来遍历多维数组

  3. Linux驱动开发——__stringify

    在Linux内核中有一个宏__stringify,在include/linux/stringify.h定义如下: #ifndef __LINUX_STRINGIFY_H #define __LINUX ...

  4. Win10环境下安装theano并配置GPU详细教程

    一.软件和环境 (1)安装日期2016/12/23: (2)原材料VS2013,cuda-8.0(最好下载cuda7.5,目前theano-0.8.2对cuda-8支持不是很好),Anaconda3- ...

  5. Ubuntu Kylin15下PHP环境的搭建(LAMP)

    Ubuntu下的PHP开发环境架设   今天重新装了ubuntu那么就吧过程记录下. 打开终端,也就是命令提示符. 我们先来最小化组建安装,按照自己的需求一步一步装其他扩展.命令提示符输入如下命令: ...

  6. c#高效比对大量图片

    比较图片的方法 以前传统的比较方式是遍历图片中的每一个像素,然后进行比对.这样的比对在少量图片的比对上虽然效率低一点,但是也没有什么不好.但是在大量图片比对的时候,过长的反应时间和对服务器比较高的消耗 ...

  7. 指定端口号,多线程扫描局域网内IP地址

    小白第一次发博客,请各路大神不要喷,有错的地方还请不吝啬指教,谢谢....... 因为注释基本上已经说清楚啦,在这里就不多说什么啦,知识不够怕误人子弟 # -*- coding:utf-8 -*-im ...

  8. jQuery LigerUI V1.2.2

    jQuery LigerUI V1.2.2 (包括API和全部源码) 发布 前言 这次版本主要对树进行了加载性能上面的优化,并解决了部分兼容性的问题,添加了几个功能点. 欢迎使用反馈. 相关链接 AP ...

  9. github + SourceTree管理自己的库并上传到cocoapods及各种坑的解决办法

    一.上传写好的库到github(我这里使用SourceTree客户端) 1.在github上创建一个仓库 2.将仓库拉倒本地 复制仓库地址 将刚才复制的地址粘贴到这里 3.上传项目到github 将写 ...

  10. hdu 5730 Shell Necklace [分治fft | 多项式求逆]

    hdu 5730 Shell Necklace 题意:求递推式\(f_n = \sum_{i=1}^n a_i f_{n-i}\),模313 多么优秀的模板题 可以用分治fft,也可以多项式求逆 分治 ...