本文共 3999 字,大约阅读时间需要 13 分钟。
随着 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的文档 。
其大概意思是 Bitcode 类似于一个中间码,被上传到 AppleStore 之后,苹果会根据下载应用的用户的手机指令集类型生成只有该指令集的二进制,进行下发,从而达到精简安装包体积的目的。
2、一点编译原理
为了更好的理解什么是 Bitcode,我们简短的看一下编译器编译的过程:
Linker :通常程序会引用其他的二进制文件(.a 或者 framework),但是这些链接在程序中没有正确的地址,只是个占位符。Linker 的工作就是给这些占位符正确的地址。
更多信息可以参考:
一般情况下,在真实的编译器构架那种,会将上述过程分成前端和后端两部分来处理:
3、Bitcode 设置
实际上在 Xcode7 + 中,我们新建一个 iOS 程序时,Bitcode 选项默认是设置为 YES 的。我们可以在 Build Settings => Build Options => Enable Bitcode 选项中看到这个设置。
不过,我们现在需要考虑的是三个平台:iOS / Mac OS / watchOS。
如果我们开启了 Bitcode,在提交包时,下面这个界面也会有个 Bitcode 选项:
确保打包的时候使用的是 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:真的会生成 Bitcode 指令,并且嵌入到二进制中,这个设置不止要在 app 中设置,同样你也必须在编译静态链接库的时候使用。而且需要主题的是该参数系统只默认在 archive 模式下会添加。
需要注意的是 Bitcode 只默认在 archive 下编译。在 debug 和 release 下并不会。
4、检测是否打开 Bitcode
当打开 Bitcdoe 选项之后,我们可以使用 otool 工具来检查二进制文件中是否包含 bitcode 段。
针对于静态链接库 .a 文件
otool -arch armv7 -l xxxx.a | grep __bitcode | wc -l
如果是当前库支持 .a 文件则会输出一个数字,如果不支持 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 了。
CheckPoint2 检查最终效果
使用开发模式导出 ipa
5、选择出包的方式
这里建议使用第二种,生成针对具体机型的包
出现了,Compiling Bitcode,这个过程
在最后输出的文件中,你能够看到一个 App Thinning 的结果,里面有针对各个机型的 ipa 包。
在 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 ....
转载地址:http://nqupx.baihongyu.com/