首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bitcode_strip (xcrun)做什么?

bitcode_strip (xcrun)做什么?
EN

Stack Overflow用户
提问于 2018-09-28 23:17:56
回答 1查看 2.3K关注 0票数 8

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

经过一些研究,我发现了这个线程和特别是这条通过Podfile命令建议删除bitcode的消息

我对bitcode不太了解,直到我找到了一篇关于它的伟大文章:https://lowlevelbits.org/bitcode-demystified/

现在我明白了什么是bitcode,为什么苹果会请求它,以及如果他们愿意的话,他们如何使用它来重新编译应用程序。然而,我仍然不明白这个“剥比特码”操作是什么,所以我正在寻找有关这个操作的信息(因为在我的Podfile中添加了这些行之后,我的应用程序现在“只”大了30 Mo ),它实际上运行得很好。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-01 03:35:27

下面是bitcode_strip的手册

删除或保留Mach-O文件中的bitcode段。 bitcode_strip input [ -r | -m | -l ] -o output

什么是马赫-O文件?

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

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

下面是xcrun的手册

运行或定位开发工具 xcrun [-sdk SDK] -find <tool_name>

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

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

剩下的部分:机器特有的东西,比如优化、组装和链接,这在iPhone上与macbook不同,例如

如果您将bitcode提交到应用程序存储区,那么完成将其编译成不同CPU类型的不同最终形式要容易得多。看起来您的问题是,您的项目中的bitcode最终是一个相当大的文件(这个文件来自Twilio,添加了对bitcode的支持)。“剥离”比特代码基本上从您的项目中删除了bitcode (从Mach-O文件中移除bitcode段),允许它适应您的大小约束。缺点是苹果不会有比特码,它们只会有二进制代码(并且无法重新编译)。

让我们分解一下在github上链接的代码:

代码语言:javascript
复制
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.

代码语言:javascript
复制
bitcode_strip_path = `xcrun -sdk iphoneos --find bitcode_strip`.chop!

在Xcode安装中定位bitcode_strip工具(请阅读上面链接的手册中的xcrun)

2.

代码语言:javascript
复制
framework_path = "#{path}/Pods/TwilioVideo/TwilioVideo.framework/TwilioVideo"

查找要删除bitcode的框架。

3.

代码语言:javascript
复制
strip_command = "#{bitcode_strip_path} #{framework_path} -m -o #{framework_path}" 
puts "About to strip: #{strip_command}"
system(strip_command)

创建并执行命令,以便实际从Mach-O可执行文件中删除bitcode部分。为删除指定了-m (参见bitcode_strip的链接手册)

请注意:使用这个twilio雇员提供的解决方案(或其他类似的解决方案)的可能不会成为未来的证据,因为bitcode可能成为应用程序商店中的强制命令。

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52563689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档