iOS开发中Mach-O的体积优化2

Code Generation Options

代码生成约定的选项:

16116685433219.jpg

  1. None[-00]不优化:
在这种设置下, 编译器的目标是降低编译消耗,保证调试时输出期望的结果。程序的语句之间是独立的:如果在程序的停在某一行的断点出,我们可以给任何变量赋新值抑或是将程序计数器指向方法中的任何一个语句,并且能得到一个和源码完全一致的运行结果。
复制代码
  1. Fast[-01]大函数所需的编译时间和内存消耗都会稍微增加:
在这种设置下,编译器会尝试减小代码文件的大小,减少执行时间,但并不执行需要大量编译时间的优化。在苹果的编译器中,在优化过程中,严格别名,块重排和块间的调度都会被默认禁止掉。此优化级别提供了良好的调试体验,堆栈使用率也提高,并且代码质量优于None[-O0]复制代码
  1. Faster[-02]编译器执行所有不涉及时间空间交换的所有的支持的优化选项:
是更高的性能优化Fast[-O1]。
在这种设置下,编译器不会进行循环展开、函数内联或寄存器重命名。和Fast[-O1]项相比,此设置会增加编译时间,降低调试体验,并可能导致代码大小增加,但是会提高生成代码的性能。
复制代码
  1. Fastest[-03]在开启Fast[-01]项支持的所有优化项的同时,开启函数内联和寄存器重命名选项:
是更高的性能优化Faster[-O2],指示编译器优化所生成代码的性能,而忽略所生成代码的大小,有可能会导致二进制文件变大。还会降低调试体验。
复制代码
  1. Fastest, Smallest[-Os]在不显着增加代码大小的情况下尽量提供高性能:
这个设置开启了Fast[-O1]项中的所有不增加代码大小的优化选项,并会进一步的执行可以减小代码大小的优化。增加的代码大小小于Fastest[-O3]。与Fast[-O1]相比,它还会降低调试体验。
复制代码
  1. Fastest, Aggressive, Optimizations[-Ofast]Fastest, Smallest[-Os]相比该级别还执行其他更激进的优化:
这个设置开启了Fastest[-O3]中的所有优化选项,同时也开启了可能会打破严格编译标准的积极优化,但并不会影响运行良好的代码。该级别会降低调试体验,并可能导致代码大小增加。 
复制代码
  1. Smallest, Aggressive Size Optimizations [-Oz]不使用LTO的情况下减小代码大小:
与-Os相似,指示编译器仅针对代码大小进行优化,而忽略性能优化,这可能会导致代码变慢。 
复制代码

总结:

16116713641290.png

16116713463311.png

strip

strip:移除指定符号。在Xcode中默认strip是在Archive的时候才会生效,移除对应符号。
strip -x:除了全局符号都可以移除 (动态库使用)
strip -S:移除调试符号(静态库使用)
strip:除了间接符号表中使用的符号,其他符号都移除(上架App使用)

16116708029533.png

  • Deployment Postprocessing的英文原意是:
If enabled, indicates that binaries should be stripped and file mode, owner, and group information should be set to standard values.
复制代码

也就是打开后,在编译阶段就会运行strip

  • Strip Debug Symbols During Copy的英文原意是:
Specifies whether binary files that are copied during the build, such as in a Copy Bundle Resources or Copy Files build phase, should be stripped of debugging symbols. It does not cause the linked product of a target to be stripped。
复制代码

通俗来讲,就是当你的应用在编译阶段copy了某些二进制文件时,打开该选项会脱掉该二进制的调试符号。但是不会脱去链接的最终产物(可执行文件\动态库)的符号信息。要脱去链接的产物(App的可执行文件)的符号信息。

  • Strip Linked Product的英文原意是:
If enabled, the linked product of the build will be stripped of symbols when performing deployment postprocessing.
复制代码

如果没有打开Deployment Postprocessing,则会在Archive处理链接的最终产物(可执行文件)的符号信息。否则,在链接完成之后就会处理符号信息。

查看App Size报告

  • 方式一:通过App Store Connect提供准确的App大小;
  • 方式二:通过Xcode内置报告工具,创建App尺寸报告
    1. Archive App
    2. 通过Ad HocDevelopment或者Enterprise等分发方式导出Archive App
    3. 在设置开发分发选项的列表中,选择All compatible device variants以进行应用程序精简,然后启用Rebuild from Bitcode
    4. 签名并且导出。 此过程将创建一个包含App的文件夹,里面有:
    5. 一个Universal IPA,包含多个平台的资源文件和二进制程序;
    6. 一个Thinned IPA,指定平台的资源文件和二进制程序。 同时还包含一个App Thinning Size Report.txt,里面详细记录了App的体积占用情况:
App Thinning Size Report for All Variants of ExampleApp

Variant: ExampleApp.ipa
Supported variant descriptors: [device: iPhone11,4, os-version: 12.0], [device: iPhone9,4, os-version: 12.0], [device: iPhone10,3, os-version: 12.0], [device: iPhone11,6, os-version: 12.0], [device: iPhone10,6, os-version: 12.0], [device: iPhone9,2, os-version: 12.0], [device: iPhone10,5, os-version: 12.0], [device: iPhone11,2, os-version: 12.0], and [device: iPhone10,2, os-version: 12.0]
App + On Demand Resources size: 6.7 MB compressed, 18.6 MB uncompressed
App size: 6.7 MB compressed, 18.6 MB uncompressed
On Demand Resources size: Zero KB compressed, Zero KB uncompressed

// Other Variants of Your App.
复制代码
  • 方式三:通过脚本的方式指定输出App Size报告:
xcodebuild -exportArchive -archivePath iOSApp.xcarchive -exportPath Release/MyApp -exportOptionsPlist OptionsPlist.plist
复制代码
分类:
iOS
标签: