当前位置: 首页 > 科技观察

必读!Bitcode适配指南结合实际问题

时间:2023-03-15 15:18:30 科技观察

随着XCode7的发布,Apple提供了一项支持App瘦身功能的新技术,那就是Bitcode。本文将结合本人在支持bitcode过程中遇到的问题,来讲解支持bitcode的过程。什么是比特码?位码是已编译程序的中间表示。您上传到iTunesConnect的包含位码的应用程序将在商店中编译和链接。包含bitcode将允许Apple在未来重新优化您的应用程序二进制文件,而无需向商店提交新版本的应用程序。默认情况下,Xcode会隐藏构建期间生成的符号,因此Apple无法读取它们。仅当您在将应用程序上传到iTunesConnect时选择包含符号时??,这些符号才会发送给Apple。您必须包含符号才能接收来自Apple的崩溃报告。上面的引述来自Apple的文档AppThinning(iOS,tvOS,watchOS)。大致意思就是Bitcode类似于一个中间码。上传到applestore后,苹果会根据下载应用的用户手机指令集的类型,生成只有指令集的二进制文件,然后进行分发。从而达到简化安装包体积的目的。一点编译原理为了更好的理解什么是bitcode,我们简单看一下编译器编译的过程:Lexer:读入源文件,转换为字符流Parser:将字符流转换为AST(抽象语法树)语义化分析:对输入的AST进行语法检查。CodeGeneration:代码生成,将AST转化为低级IR指令优化:分析IR指令,kill掉可能拖慢运行速度的指令。AsmPrinter:通过IR(中间码)为特定CPU架构生成汇编代码该程序,只是一个占位符。为这些占位符提供正确的地址是链接器的工作。更多信息请参考:TheCompiler通常情况下,在真正的编译器架构中,上述过程会分为前端和后端两部分:前端和后端之间传递IR(中间代码)后端,Bitcode是一种特殊形式的中间代码。本来前后端的工作都是在本地的LLVM中完成的。虽然Apple没有给出具体的Bitcode实现,但是从他们的文档可以猜到,后端的部分工作被转移到了服务器端。将Xcode中的IR上传到服务器,服务器会对不同模型进行后续操作。从而达到针对不同机型生成指令集对应的二进制文件,减少报告体积的目的。开启bitcode设置其实在Xcode7中,当我们新建一个iOS程序时,bitcode选项默认设置为YES。我们可以在“BuildSettings”->“EnableBitcode”选项中看到这个设置。不过,我们现在需要考虑的是三个平台:iOS/MacOS/watchOS。对于iOS,位码是可选的。对于watchOS,bitcode是必须的。MacOS不支持位码。如果我们开启了bitcode,在提交包的时候,下面的界面也会有bitcode选项:但是如果包含了不支持bitcode的第三方库。需要将“启用BitCode”设置为NO。而这个选项是,只要有不支持的第三方库,就打不开。否则连接错误。确保在打包时使用fembed-bitcode而不是fembed-bitcode-maker。您应该知道,使用-fembed-bitcode-marker选项的正常构建将生成最小尺寸的嵌入式位码部分,没有任何实际内容。这样做是为了在不减慢构建过程的情况下测试构建的与位码相关的方面。当您进行存档构建时,会包含实际的位码内容。地点。fembed-bitcode:它会真正生成位码指令并将它们嵌入到二进制文件中。这个设置不仅要在app中设置,在编译静态链接库的时候也必须要用到。并且需要说明的是参数系统默认只会在归档模式下添加。需要注意的是,默认情况下,bitcode仅在存档中编译。不在调试和发布中。如果您正在开发应用程序,那么只需遵循正常的包归档过程即可。如果开发的是.a静态库或框架,请注意打包方式设置为archive,或者在打包脚本中添加-fembed-bitcode参数。如有必要,需要在BuildSettings中开启DEPLOYMENT_POSTPROCESSING=YES,并将StripStyle设置为debugging。检测是否启用了Bitcode当启用了bitcdoe选项时,我们可以使用otool工具来检查二进制文件是否包含bitcode段。对于静态链接库的.a文件otool-archarmv7-lxxxx.a|grep__位码|wc-l如果当前库支持.a文件,会输出一个数字,如果不支持bitcode,则不会出现数字。上面的命令只检查armv7架构。同时,还必须使用修改后的命令查看其他指令集是否包含bitcode,如:arm64、armv7s等。查看app或framework是否包含bitcode。因为app里面的二进制文件和framework里面的二进制文件是不一样的.a文件是有区别的,因为需要检查的是__LLVM部分。当出现这一段时,表示支持bitcdoe,否则不支持。otool-lxxxx|grep__LLVM|wc-lotool这里有一个错误。当你的框架已经使用了lipo命令,拆合并后,你需要指定一个指令集进行检查。otool-archarmv7-lxxxx|grep__LLVM|wc-lBUT,经过上面的检查,可能真的不支持bitcode。实际测试中发现,上述检测命令通过后,使用了第三方库,仍然报错bitcodeisnotsupported。所以最终的结果还是要看能否连接成功。重要的事说三遍。以上网上流传的检测方法仅供参考,最终以实际效果为准。检查最终结果。如果你是APP,直接打包到Archive里面就可以了。如果是库,建议构建一个Demo工程进行打包。记得打开位码设置。是否报CheckPoint1连接错误如果有库没有打开bitcode链接,会出现类似如下的错误。只要已经通过链接,恭喜,基本就OK了。CheckPoint2查看最终效果使用开发模式导出ipa,选择包。这里推荐使用第二种方法。为特定模型生成包。编译Bitcode,这个过程!!!!!最后的结果在***的输出文件中,可以看到一个AppThinning的结果,里面包含了各个机型的ipa包。在AppThinningSizeReport中,我们可以清楚地看到使用bitcode等技术带来的好处:AppThinningSizeReportforAllVariantsofBlackVariant:Black-iPad(4thgeneration)-etc.ipaSupporteddevices:iPad(3rdgeneration)和iPad(第4代)App+按需资源大小:压缩368KB,未压缩737KBApp大小:压缩368KB,未压缩737KB按需资源大小:压缩零KB,未压缩零KB....