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莫)。
感谢您的帮助。
的联机帮助页
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"
在我的 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莫)。
感谢您的帮助。
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"