美文网首页iOS开发经验收集
[iOS]可执行文件瘦身

[iOS]可执行文件瘦身

作者: 雨影 | 来源:发表于2017-11-02 15:22 被阅读76次

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

编译选项

1. 编译器优化级别

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

2.Architectures选用:


如果不是特别要求,建议只用arm64,生成的包是最小的.

3.去除符号信息
Strip Debug Symbols During Copy 和 Symbols Hidden by Default 在release版本应该设为yes,可以去除不必要的调试符号。Symbols Hidden by Default会把所有符号都定义成”private extern”,具体意思和作用我还不清楚,有待研究,但设了后会减小体积。这些选项目前都是XCode默认选项,但旧版XCode生成的项目可能不是,可以检查一下。
其他优化还可以参考苹果的官方文档—CodeFootprint.pdf

第三方库统计

项目里会引入很多第三方静态库,如果能知道这些第三方库在可执行文件里占用的大小,就可以评估是否值得去找替代方案去掉这个第三方库。

无用代码

在项目里新建一个类,给它添加几个方法,但不要在任何地方import它,build完项目后观察linkmap,你会发现这个类还是被编译进可执行文件了。

按C++的经验,没有被使用到的类和方法编译器都会优化掉,不会编进最终的可执行文件,但object-c不一样,因为object-c的动态特性,它可以通过类和方法名反射获得这个类和方法进行调用,所以就算在代码里某个类没被使用到,编译器也没法保证这个类不会在运行时通过反射去调用,所以只要是在项目里的文件,无论是否又被使用到都会被编译进可执行文件。

对此我们可以通过脚本,遍历整个项目的文件,找出所有没有被引用的类文件和没有被调用的方法,在保证没有其他地方动态调用的情况下把它们去掉。如果整个项目历时很长,历时代码遗留较多,这个清理对可执行文件省出的空间还是挺可观的。

类/方法名长度

观察linkmap可以发现每个类和方法名都在__cstring段里都存了相应的字符串值,所以类和方法名的长短也是对可执行文件大小是有影响的,原因还是object-c的动态特性,因为需要通过类/方法名反射找到这个类/方法进行调用,object-c对象模型会把类名,方法名列表都保存下来。

可以考虑在编译前把所有类和方法名进行混淆,把长名字替换成短名字,这样做的好处除了缩小体积外,还对安全性有很大提升,别人拿到可执行文件对它class-dump出来的结果都是混淆后的类和方法名,就无法从类和方法名中猜出某个方法是做什么的,就难以挂钩子进行hack。不过这样有个缺点就是crash堆栈反解出来的堆栈方法名会是混淆后的,需要再加一层混淆->原名的转换,实现和使用成本有点高。

实际上这部分占用的长度比较小,中型项目也就几百K,对安全性要求高的情况可以试试。

冗余字符串

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

CheckList

最后简单把缩减iOS安装包大小的各种方法列出来作为CheckList:

附录

图片高效压缩网站:https://tinypng.com

相关文章

  • [iOS]可执行文件瘦身

    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源。这些...

  • iOS 应用包大小瘦身解决办法

    本文是借鉴 戴铭老师 iOS开发高手课 内容总结。 App 的安装包主要是由资源和可执行文件组成的。 App瘦身:...

  • iOS代码瘦身实践

    iOS代码瘦身实践 iOS代码瘦身实践

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

    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源。这些...

  • iOS可执行文件分析工具MachoOView

    什么是可执行文件### iOS上的可执行文件相当于windows上的.exe可执行文件。在iOS上,主要的可执行文...

  • iOS瘦身各种方案

    iOS瘦身之删除无用的mach-O文件 iOS微信安装包瘦身 基于clang插件的一种iOS包大小瘦身方案 以往C...

  • iOS项目优化:可执行文件瘦身

    删除无用资源文件 1X的图片可以全部删掉重复的图片分两种:1. 是名字一样的图片,如果你使用.xcassets来管...

  • Mach-O相关

    了解iOS上的可执行文件和Mach-O格式 iOS可执行文件 ipa包,也就是iOS的APP安装包,实际上是一种变...

  • 性能优化:iOS APP安装包瘦身

    APP安装包瘦身 安装包(IPA)主要由可执行文件、资源组成 资源优化瘦身 资源(图片、音频、视频等)采取无损压缩...

  • 漫谈iOS的应用瘦身

    漫谈iOS的应用瘦身

网友评论

    本文标题:[iOS]可执行文件瘦身

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