bitcode_strip (xcrun) 有什么作用?

Rob*_*Rob 8 xcode xcrun bitcode

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

经过一些研究,我发现了这个线程,尤其是这个消息,它建议通过 Podfile 使用此命令剥离位代码

我对 bitcode 了解不多,直到我发现了这篇关于它的好文章:https ://lowlevelbits.org/bitcode-demystified/

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

谢谢你的帮助。

Noa*_*ker 8

这是联机帮助页 bitcode_strip

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

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

什么是.Mach-O文件?

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

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

这是联机帮助页 xcrun

运行或定位开发工具

xcrun [-sdk SDK] -find <tool_name>

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

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

剩下的部分:特定于机器的事情,例如优化、组装和链接,例如,iPhone 与 macbook 的不同之处

如果您将位码提交到应用程序商店,则可以更轻松地将其编译为不同 CPU 类型的不同最终形式。看起来您的问题是项目中的 bitcode 最终变成了一个相当大的文件(这来自 Twilio 添加了对 bitcode 的支持)。“剥离”位代码基本上从您的项目中删除了位代码(从您的 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
Run Code Online (Sandbox Code Playgroud)

1.

bitcode_strip_path = `xcrun -sdk iphoneos --find bitcode_strip`.chop!
Run Code Online (Sandbox Code Playgroud)

bitcode_strip在您的 Xcode 安装中找到该工具(阅读上面链接的 xcrun 联机帮助页)

2.

framework_path = "#{path}/Pods/TwilioVideo/TwilioVideo.framework/TwilioVideo"
Run Code Online (Sandbox Code Playgroud)

查找要从中删除位码的框架

3.

strip_command = "#{bitcode_strip_path} #{framework_path} -m -o #{framework_path}" 
puts "About to strip: #{strip_command}"
system(strip_command)
Run Code Online (Sandbox Code Playgroud)

创建并执行命令以从 Mach-O 可执行文件中实际删除位代码部分。-m指定删除(请参阅 bitcode_strip 的链接联机帮助页)

请注意:使用此 twilio 员工提供的解决方案(或其他类似的解决方案)可能无法满足未来需求,因为在应用商店中,bitcode 可能成为强制性要求

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