bitcode_strip(xcrun)有什么作用?

时间:2018-09-28 23:17:57

标签: xcode bitcode xcrun

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

经过研究,我找到了这个线程和especially this message that advises stripping bitcode using this command via Podfile

我对比特码了解不多,直到找到有关它的出色文章:https://lowlevelbits.org/bitcode-demystified/

现在,我了解了什么是位码,以及Apple为什么要求它,以及他们如何根据需要重新编译应用程序。但是,我仍然不知道这是“条带位码”操作是什么,因此我正在寻找有关此信息(它确实运行良好,因为在将这些行添加到Podfile之后,我的应用现在“仅”大了30莫)。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

这是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>

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

大多数方式:它完成了编译器的词法分析器,解析器,语义分析和代码生成部分,

其余方式:优化,组装和链接之类的特定于机器的事物,例如,iPhone和Macbook相比在iPhone上有所不同

如果将位代码提交到应用商店,则完成将其编译为不同CPU类型的不同最终形式要容易得多。看来您的问题是项目中的位代码最终变成了一个很大的文件(这来自Twilio,添加了对位代码的支持)。 “剥离”位代码基本上从项目中删除了位代码(从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工具(请阅读上面链接的xcrun手册页)

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员工提供的解决方案(或类似的其他解决方案)可能无法适应未来,因为在应用程序商店中位代码可能成为强制要求

有关更多信息,请查看“应用程序精简”