bitcode_strip (xcrun) 是做什么的?

What does bitcode_strip (xcrun) do?

在我的 iOS 项目中添加 TwilioVideo 作为 Pods 依赖项后,我意识到它的大小显着增加(+100 Mo)。

经过一些研究,我找到了这个帖子 especially this message that advises stripping bitcode using this command via Podfile

我对位码了解不多,直到我找到这篇关于它的精彩文章:https://lowlevelbits.org/bitcode-demystified/

现在我明白了什么是位码,为什么 Apple 需要它,以及他们如何使用它来重新编译应用程序(如果他们愿意的话)。但是,我仍然不明白这个 "strip bitcode" 操作是什么,所以我正在寻找关于这个的信息(它实际上运行良好,因为在将这些行添加到我的 Podfile 之后,我的应用程序现在是 "only"大了30莫)。

感谢您的帮助。

这是 bitcode_strip

的联机帮助页

remove or leave the bitcode segment in a Mach-O file

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

什么是 Mach-O 文件?

Mach-O is a file format for executables, object code, shared libraries, dynamically-loaded code, and core dumps

Mach-O 也恰好是存储 iOS 和 OS X 可执行文件以及位码的地方。

这是 xcrun

的联机帮助页

run or locate development tools

xcrun [-sdk SDK] -find <tool_name>

根据我阅读您所附链接后的理解,bitcode 是编译过程中的一个中间步骤。如果你自己将源代码提交给苹果,苹果最终会在每个应用程序中拥有不同版本的目标代码,对应于 OS X 和 iOS 不同 CPU 类型的数量可以 运行 on(超过 4 种不同类型)。现在,Apple 可以将您的源代码大部分编译成称为 bitcode 的最小形式,它没有与 CPU 相关的包袱 运行。

大部分方式:它执行编译器的词法分析器、解析器、语义分析和代码生成部分,这些部分特定于您的源代码。

其余部分:机器特定的事情,例如优化、组装和链接,iPhone 与 macbook 不同,例如

如果您将位码提交到应用商店,则针对不同的 CPU 类型将其编译成不同的最终形式会容易得多。看起来你的问题是你项目中的位码最终变成了一个相当大的文件(这来自 Twilio 添加对位码的支持)。 "Stripping" 位码基本上从您的项目中删除了位码(从您的 Mach-O 文件中删除了位码段),使其符合您的大小限制。缺点是苹果没有位码,他们只有二进制文件(并且无法重新编译)。

让我们分解一下您在 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 工具(阅读上面链接的 xc运行 联机帮助页)

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 可能在应用商店中成为强制性要求

有关详细信息,请查看 "app thinning"