iOS基础篇-App瘦身

随着Apple不断更新系统,Xcode不断升级,我们会发现打包出来的App包文件会越来越大。我司最近导入了百度语音识别合成,App瞬间飙升到70MB,于是着手记录App瘦身之道。App瘦身可以从资源层面和代码层面入手。

一、去除重复的,无用资源文件,解决名字重复问题。

1、压缩和删除无用的图片资源:
在我们工程中经常用到的轮播图、启动图、页面引导图,比如课程大厅的首页图片,UI给我们的@1x @2x @3x图片,大小分别为15K/46K/91K,使用图片压缩工具Tinypng压缩后,大小变为2.8K/6.0K/9.3K,平均压缩大小85%,非常节省资源。

iOS基础篇-App瘦身_第1张图片
46K压缩到6K

这里我推荐使用工具: LSUnusedResources-GitHub来查找未使用资源,ReadMe里有详细介绍。

2、尽可能替换占用体积较大的第三方库


iOS基础篇-App瘦身_第2张图片
百度语音转文字
iOS基础篇-App瘦身_第3张图片
百度语音识别

如图所示,百度SDK几乎占据App体积的一半,将来随着业务发展,尽可能选择替换掉。

二、为你的工程开启Bitcode

关于Bitcode,苹果官方文档解释:

Bitcode is an intermediate representation of a compiled program. Apps
you upload to iTunes Connect that contain bitcode will be compiled and
linked on the App Store. Including bitcode will allow Apple to
re-optimize your app binary in the future without the need to submit a
new version of your app to the store.

大致意思是:Bitcode是被编译程序的一种中间形式的代码。包含Bitcode配置的程序将会在App store上被编译和链接。Bitcode允许Apple在后期重新优化我们程序的二进制文件,而不需要我们重新提交一个新的版本到App store上。当我们提交程序到App store上时,Xcode会将程序编译为一个中间表现形式(bitcode)。然后App store会再将这个botcode编译为可执行的64位或32位程序。可以参考喵神的博客

三、类/方法名长度

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

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

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

四、冗余字符串

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

五、二进制包优化

查找编译二进制包
Finder查找路径:~/Library/Developer/Xcode/DerivedData/xxx-edjnerxnagccjeeoyqxvlfbksgoq/Build/Intermediates.noindex/xxx.build/Debug-iphoneos/xxx.build/xxx-LinkMap-normal-arm64.txt
这个LinkMap展示了可执行文件的全貌,列出了编译之后每个文件的信息:

iOS基础篇-App瘦身_第4张图片
编译后的二进制文件.jpg
通过对上面的文件进行分析,就知道每个类在最终的可执行文件中占据的大小, 然后有针对性的进行优化就可以了。这里我使用到了 LinkMap工具来展示问个文件大小,很直观方便。

六、开发之前需要思考的

1、不要因为某一个功能模块,而引入一个庞大的,复杂的工具。 有时候你只想接入一个base64编码的函数,结果接入了一个有几十个类文件的util库,除了你用到的这个函数,其余的可能再也不会有人用到。那些类文件都是成本,类文件,函数,甚至不同长度的函数名字都对最终的安装包大小产生影响。 积少成多, 安装包会越来越大。 而且代码量越大,app启动耗时也会变长。

2、对于要接入到app的资源文件,要check一下大小,一个200*200大小的图片,可能UI给我们的时候有100K,其实已经很大了,使用压缩工具可以降低到15-20左右,所以工程里导入的图片,最好是都压缩。

3、养成良好的开发习惯,定期做review,及时清理废弃代码。同类型的开源库(网络请求的AFnetworking vs ASIHttpRequest 或者自动布局),只需要使用一种即可。多借鉴成功的开源项目,来优化自己的代码。

你可能感兴趣的:(iOS基础篇-App瘦身)