bitcode_strip (xcrun)是什么?

9
在我的iOS项目中将TwilioVideo添加为Pods依赖项后,我意识到其大小显着增加(+100 Mo)。
经过一些研究,我找到了这个主题和特别是这个建议使用Podfile通过此命令剥离位代码的消息
我以前不太了解位代码,直到我发现了这篇关于它的好文章:https://lowlevelbits.org/bitcode-demystified/ 现在我明白了什么是位代码,为什么苹果要求它以及他们如何使用它来重新编译应用程序。但是,我仍然不理解什么是“剥离位代码”操作,因此我正在寻找有关此信息的资料(自从我将这些行添加到我的Podfile后,它确实很好用,现在我的应用程序只增加了30 Mo)。
感谢您的帮助。
1个回答

12

这是 bitcode_strip 的手册页。

从Mach-O文件中删除或保留位码段

bitcode_strip input [ -r | -m | -l ] -o output

什么是 Mach-O 文件?

Mach-O是可执行文件、目标代码、共享库、动态加载的代码和核心转储的文件格式

值得一提的是,iOS和OS X可执行文件以及位码都存储在Mach-O中。

这里是xcrun的手册页。

运行或查找开发工具

xcrun [-sdk SDK] -find <tool_name>

根据您提供的链接,我了解到位码是编译过程的中间步骤。如果将源代码单独提交给Apple,则Apple会在每个应用程序中拥有不同版本的目标代码,对应于OSX和iOS可以运行的不同CPU类型(超过4种)。现在,Apple可以将您的源代码大部分编译为称为位码的最小形式,该形式与将在其上运行的CPU无关。

大部分的编译过程包括词法分析器、解析器、语义分析和代码生成器,这是针对您的源代码而特定的。

剩余的编译过程则是机器特定的部分,如优化、汇编和链接,例如在iPhone和MacBook上不同。

如果将位码提交给应用商店,则更容易将其编译成不同的最终形式以适应不同的CPU类型。看起来您的问题在于项目中的位码文件太大(这是由Twilio添加位码支持导致的)。 “剥离”位码基本上会从您的项目中删除位码(从Mach-O文件中删除位码段),使其符合大小约束。缺点是Apple没有位码,它们只有二进制文件(将无法重新编译)。

让我们分解您在github上引用的代码:

source 'https://github.com/twilio/cocoapod-specs'

target 'ObjCVideoQuickstart' do
  pod 'TwilioVideo', '1.0.0-beta14'
end

post_install do |installer|
  # Find bitcode_strip
  bitcode_strip_path = `xcrun -sdk iphoneos --find bitcode_strip`.chop!

  # Find path to TwilioVideo dependency
  path = Dir.pwd
  framework_path = "#{path}/Pods/TwilioVideo/TwilioVideo.framework/TwilioVideo"

  # Strip Bitcode sections from the framework
  strip_command = "#{bitcode_strip_path} #{framework_path} -m -o #{framework_path}" 
  puts "About to strip: #{strip_command}"
  system(strip_command)
end

1.

bitcode_strip_path = `xcrun -sdk iphoneos --find bitcode_strip`.chop!

在您的Xcode安装中查找bitcode_strip工具(请阅读上面链接的xcrun的manpage了解更多信息)。

2.

framework_path = "#{path}/Pods/TwilioVideo/TwilioVideo.framework/TwilioVideo"
找到您想要从中删除位码的框架。
3.
strip_command = "#{bitcode_strip_path} #{framework_path} -m -o #{framework_path}" 
puts "About to strip: #{strip_command}"
system(strip_command)

创建并执行命令,实际上从 Mach-O 可执行文件中删除位代码部分。指定 -m 进行删除(请参阅 bitcode_strip 的链接手册)。

请注意:使用此 Twilio 员工提供的解决方案(或类似解决方案)可能不具有未来可靠性,因为位码可能成为应用商店的强制要求。

有关更多信息,请查看“应用程序瘦身”。


谢谢你的好回答!我还有一个小问题有点困惑:如果我上传的应用没有启用 bitcode,这是否意味着苹果无法仅安装与设备 CPU 相关的切片,或者这些事情并不相关? - Rob
@Rob,这是一篇很棒的文章。我相信切片应该是由Xcode完成的,并且所有变体都会被发送到应用商店。我认为切片只是默认设置,当未使用位码时就会发生。所有切片变体的目标代码将保存在用户的磁盘上浪费空间。但是,使用这两个选项,用户只会下载相关的应用程序变体和资源。使用位码时,位码的改进是没有多余的目标代码,并且苹果可以重新编译新的架构。当您发送位码时,无需进行切片。 - Noam Hacker
@Rob 这篇文章说,位码方法实际上仍然利用了应用程序资源的切片。例如,位码被发送到应用商店,但不同屏幕分辨率的所有图像也会被发送。这些都不是必需的,但将它们混合在一起是一种有效的技术,称为“应用程序瘦身”。 - Noam Hacker
好的,我现在明白了。感谢您的解释! - Rob
@Rob 很高兴我能帮到你 :D - Noam Hacker
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接