iOS APP瘦身之可执行文件瘦身

缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源。这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大,又因为AppStore会对可执行文件加密,导致可执行文件的压缩率低,压缩后可执行文件占整个APP安装包的体积比例大约有80%~90%,还是挺值得优化的。下面介绍一下在研究可执行文件过程中发现的可以优化的点。研究的过程使用了linkmap,linkmap的介绍跟生成可以参考另一篇文章—iOS可执行文件的组成

编译器优化级别设置

Build Settings->Optimization Level有几个编译优化选项,release版应该选择Fastest, Smalllest,这个选项会开启那些不增加代码大小的全部优化,并让可执行文件尽可能小。

去除不必要的调试符号信息

Strip Linked Product , Deployment Postprocessing, Symbols Hidden by Default 在release版本应该设为yes,可以去除不必要的调试符号。Symbols Hidden by Default会把所有符号都定义成”private extern”,详细信息见官方文档
这些选项目前都是XCode里release的默认选项,但旧版XCode生成的项目可能不是,可以检查一下。

无用的代码

无用的代码可能包括包括:类,分类,协议,方法,实例变量,局部变量等。我们可以利用工具进行查找。

  • 开启编译器警告来查找无用的方法,实例变量,局部变量


    fAbGw.png

    如上图,开启Unused Functions, Unused Ivars, Unused Variables。

  • 查找没有使用的类
    Github上有个工具可以使用:fui

冗余的代码

如果某些代码,在工程里反复出现多次,那么应该进行提取和封装。

冗余的字符串

代码上定义的所有静态字符串都会记录在在可执行文件的__cstring段,如果项目里Log非常多,这个空间占用也是可观的,也有几百K的大小,可以考虑清理所有冗余的字符串。另外如果有特别长的字符串,建议抽离保存成静态文件,因为AppStore对可执行文件加密导致压缩率低,特别长的字符串抽离成静态资源文件后压缩率会比在可执行文件里高很多。

将链接后的可执行文件中的成份,按大小排序,看是否有可以优化的项目

项目里会引入很多第三方静态库,如果能知道这些第三方库在可执行文件里占用的大小,就可以评估是否值得去找替代方案去掉这个第三方库。我们可以从linkmap中统计出这个信息。
首先我们要想办法得到LinkMap文件,可以通过打开Write Link Map File这个编译选项来生成该文件:

屏幕快照 2017-09-17 上午9.51.49.png

生成的位置是在~/Library/Developer/Xcode/DerivedData/XXX-eumsvrzbvgfofvbfsoqokmjprvuh/Build/Intermediates/XXX.build/Debug-iphoneos/XXX.build/,是一个txt文件,例如:Talking Tyler-LinkMap-normal-arm64.txt

接下来通过工具,对此文件进行解析,生成按大小排序的列表。推荐如下两个工具:
XCode Linkmap Parser:需要安装node.js环境才能使用。
LinkMap解析工具:是一个图形界面的MAC应用程序。

使用第二个工具,对上面的LinkMap文件进行解析,得到的结果如下:


WX20170917-095926.png

有了这样的清单,我们在优化时,就能够做到有的放矢。

参考

iOS可执行文件瘦身方法

推荐阅读更多精彩内容