美文网首页iOS集合
iOS包体积优化-谈一下两个编译选项

iOS包体积优化-谈一下两个编译选项

作者: Thanatos_defy | 来源:发表于2018-11-26 17:32 被阅读47次

前言

包体积的问题,尤其是作为第三方需要准入某个体量比较大的app时,通常有体积的要求,减少包体积的方式网上有不少文章,抛开减少资源文件和砍业务的方法,今天谈一下还有两个值得关注的编译选项:Enable Exceptions, Link-Time Optimazition.

Enable Exceptions

Xcode中有两个关于异常捕获的选项,分别是Enable C++ Exceptions, Enable Objective-C Exceptions. 一般默认都是开启的。如果你想要在代码中使用try catch,那么一定需要开启这两个选项。

基本上Objective-C/Swift项目都使用了ARC + LLVM,在LLVM的文档中关于异常捕获是这么说的:

The standard Cocoa convention is that exceptions signal programmer error and are not intended to be recovered from. Making code exceptions-safe by default would impose severe runtime and code size penalties on code that typically does not actually care about exceptions safety. Therefore, ARC-generated code leaks by default on exceptions, which is just fine if the process is going to be immediately terminated anyway.

Google翻译:

Cocoa的习惯就是当遇到异常的时候并不打算鸟它。如果你并不关心你的破代码是不是异常安全,支持异常捕获会让你的代码运行效率降低并且增加代码体积。所以我们的处理是,当遇到异常情况时,ARC自己产生的代码就会立即崩掉,我们觉得这样挺好的。

所以如果你的项目不需要从异常中恢复,那么按照文档的说法,关掉
Exception可以减少包体积并且增加运行速度。

从我们的项目来看,因为我们项目中只用了非常少量的try catch来处理一些异常,把这些代码注释掉并且关闭Enable C++ Exceptions, Enable Objective-C Exceptions这两个选项之后,项目的linkmap体积从3.7mb减少了约140kb。

那如果整个项目99%的代码都不需要异常捕获,单独就几个地方要,能不能单独为整个文件开启异常捕获呢?理论上是可以的,在微信的文章中[1],提到可以单独对文件设置-fexceptions来对某些文件单独支持异常捕获,不过我做来一些尝试都没有成功,Google上面也没有多少相关的信息...如果有成功的同学请回复交流(捂脸哭)。

Link-Time Optimization

先介绍一下什么是Link-Time Optimization (LTO),原版的文档可以看WWDC2016的PDF[2] :

What is Link-Time Optimization (LTO)?
Maximize runtime performance by optimizing at link-time
Inline functions across source files
Remove dead code
Enable powerful whole program optimizations

Google翻译:

在链接时而非编译时的优化方式,可以增加程序运行时的速度
优化内联函数(个人认为是文件间的函数做内联优化)
移除没有被调用的方法和代码
整体优化-让你的程序变得更屌

性能:

LTO Runtime Performance
Apple uses LTO extensively internally
Typically 10% faster than executables from regular Release builds
Multiplies with Profile Guided Optimization (PGO)
Reduces code size when optimizing for size

Google翻译:

Apple已经在自己的程序里大量使用
一般来说比常规不带LTO选项要快10%
可以与按配置优化(PGO)叠加
可以用来减少代码体积

这里值得注意的是,LTO选项需要配合编译时选项来减少包体积。在Xcode的Optimization level中,如果使用-O3(让代码运行更快但是体积变大),那么配合LTO可以实现运行效率的提高,但是代码体积会变大;如果使用-Os,那么LTO才会真的的优化体积。

LTO已经做了移除无用代码的操作,即移除没有被调用的selector,这样一来我们就不用手动去搜索并移除无用的方法了,这本身就是减少包体积的方法之一(待确认)。

从实践情况来看,把开启LTO的SDK变成.ipa来看,并没有很大的体积变化,稍微减少了100k以内。如果使用link-map来做统计的话,需要计算sdk-lto.thin,目前工具还不支持,所以没有跑出来具体link-map的减少数据,待之后补充。


相关链接

  1. iOS微信安装包瘦身

  2. What's new in LLVM

相关文章

  • iOS包体积优化-谈一下两个编译选项

    前言 包体积的问题,尤其是作为第三方需要准入某个体量比较大的app时,通常有体积的要求,减少包体积的方式网上有不少...

  • iOS包体积优化-谈一下两个编译选项

    前言 包体积的问题,尤其是作为第三方需要准入某个体量比较大的app时,通常有体积的要求,减少包体积的方式网上有不少...

  • iOS的性能优化

    1、ipa包体积优化 1.1 编译配置优化:编译器代码层面优化Optimize Level;Bitcode(较难...

  • iOS 如何缩小包体的大小 (IPA)

    下面介绍了 iOS 优化 ipa 安装包大小的几种方法。 一、配置编译选项 Genetate Debug Symb...

  • iOS打包ipa廋身

    下面介绍了 iOS 优化 ipa 安装包大小的几种方法。 一、配置编译选项 Genetate Debug Symb...

  • iOS包大小——编译选项优化

    可执行文件中的[符号]是指程序中的所有的变量、类、函数、枚举、变量和地址映射关系,以及一些在调试的时候使用到的用于...

  • Mac上提取assets.car图片

    我们在进行包体积优化时,会去查看分析ipa包,因为看到这篇文章iOS 优化IPA包体积(今日头条)[https:/...

  • IOS App体积优化篇

    接上篇《Android App体积优化篇 》IOS的App的体积过大达到了ipa安装包达到了84.1M的体积,提出...

  • 【iOS性能优化】-包体积优化

    一、背景 随着项目需求变化,那些没有用的图片、视频或者冗余的代码逻辑就垃圾存在在我们的工程里,趁着这两天需求没有堆...

  • iOS项目包体积优化

    记录优秀的文章,?iOS瘦身:https://www.jianshu.com/p/5972eba9dfda IOS...

网友评论

    本文标题:iOS包体积优化-谈一下两个编译选项

    本文链接:https://www.haomeiwen.com/subject/rgxsqqtx.html