iOS开发 - Bitcode适配指南

2024-01-07 05:18
文章标签 开发 ios 指南 适配 bitcode

本文主要是介绍iOS开发 - Bitcode适配指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自: http://dzpqzb.com/2015/11/19/bitcode-open.html


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

一点编译原理

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

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

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

打开bitcode设置

实际上在Xcode 7中,我们新建一个iOS程序时,bitcode选项默认是设置为YES的。我们可以在”Build Settings”->”Enable Bitcode”选项中看到这个设置。

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

  1. 对应iOS,bitcode是可选的。
  2. 对于watchOS,bitcode是必须的。
  3. Mac OS不支持bitcode。

如果我们开启了bitcode,在提交包时,下面这个界面也会有个bitcode选项:

但是如果其中包含第三方库,不支持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文件则会输出一个数字

如果不支持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

选择出包的方式

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

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

最终结果

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

在App Thinning Size Report中能够明显看到,由于使用了bitcode等技术之后,所带来的收益:


App Thinning Size Report for All Variants of BlackVariant: 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适配指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578835

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。