谈谈 iOS 包瘦身方案
包瘦身方案
相信大家都会遇到随着项目需求的变化,工程中的代码和资源文件会伴随着增长,很多时候,我们都不会轻易的去删除某些代码,或者资源文件。但是这样带来的代价就是包的体积越来越大。
当包的体积超过 200MB
时,那么就引起了数据部门的注意,数据部门分析新用户的减少可能跟应用商店包大小超限,用户流量无法下载的问题所致。那么此时再去做包大小优化意味着我们就会流失很多新用户,并且也会拉高我们的新用户成本。所以包大小优化不能在问题发生后再去做,应该及时去做,当下就该做,我们也应该把 200MB
看成“红线”。
接下来我们看看包大小优化有哪些方案:
首先,就是资源文件优化
,这种方案在瘦包上最容易看到成效,如果你的包大小急需要瘦身,不妨先试试这个。资源文件优化你可以从图片资源压缩
、无用资源检查
、资源文件上传
中入手,或者使用官方提供的App Thinning
。
其次,是代码文件优化
, 代码文件优化 投入时间可能要比资源文件优化的时间长很多,而且成效没有那么明显。但是代码文件优化可以检查很多无用代码,以及删除很多不必要文件,清理项目结构,使项目可持续性维护。
资源文件优化
相比较而言,资源优化的时间是最快的,成果是最好的,我们只需要做好平时的资源压缩处理,定期清理无用资源,做好资源文件合理分配,那么包体积大小就不会太大。
图片资源压缩
图片压缩我们可以选择的工具其实有很多,重点就是要注意检查压缩的图片资源会不会在显示上有问题。工具推荐:ImageOptim[1] 、图压[2] 。
图片资源压缩也有很多公司使用webp
格式图片,这种格式对比png
、jpg
要小很多,但客户端性能对解码webp
图片会有一定的影响。在一些老的机型上,表现不是很好。所以需要做一些取舍。这里有webp
和png
格式转换的工具 isparta[3]
其实我觉得这两种方案可以共存,团队内部设定一个资源文件的最大值,比如超过 100KB
就选择使用 webp
格式的图片,小于 100KB
就使用压缩工具。这样就可以极大的减少资源文件的大小,同时减少包的体积。
无用资源检查
无用资源检查可以通过工具 LSUnusedResources[4]。
删除无用图片的过程,可以概括为下面几步操作。
通过
find
命令获取 App 安装包中的所有资源文件,比如find /Users/daiming/Project/ -name
。设置用到的资源的类型,比如
jpg、gif、png、webp
。使用正则匹配在源码中找出使用到的资源名,比如 pattern = @"@"(.+?)""。
使用
find
命令找到的所有资源文件,再去掉代码中使用到的资源文件,剩下的就是无用资源了。对于按照规则设置的资源名,我们需要在匹配使用资源的正则表达式里添加相应的规则,比如 @“image_%d”。
确认无用资源后,就可以对这些无用资源执行删除操作了。这个删除操作,你可以使用
NSFileManger
系统类提供的功能来完成。
需要注意的是:在使用的过程中,你需要检查有些资源文件后缀是否有拼接上的,如“home_btn_normal”,“home_btn_select” 或者 “bg_1”,“bg_2” 就按照第5步去添加相关正则表达式来检查这种资源文件。
资源文件上传
如果涉及到的资源文件还是有很多的时候,那么我们可以考虑合理的将某些资源文件上传至服务器,有服务器下发至移动端。这种方案通常需要多个端来统一制定方案,从而达到最大化的利用。
App Thinning
苹果公司推出 App Thinning 是为了解决用户下载 App 耗费过高流量的问题,同时还可以节省用户 iOS 设备的存储空间。
App Thinning 会专门针对不同的设备来选择只适用于当前设备的内容以供下载。比如,iPhone 8 只会下载 2x 分辨率的图片资源,iPhone 8plus 则只会下载 3x 分辨率的图片资源。
App Thinning
有三种方式,包括:App Slicing
、Bitcode
、On-Demand Resources
。
App Slicing
,会在你向 iTunes Connect 上传 App 后,对 App 做切割,创建不同的变体,这样就可以适用到不同的设备。Bitcode
,是针对特定设备进行包大小优化,优化不明显。On-Demand Resources
,主要是为游戏多关卡场景服务的。它会根据用户的关卡进度下载随后几个关卡的资源,并且已经过关的资源也会被删掉,这样就可以减少初装 App 的包大小。
那么,如何在你项目里使用 App Thinning 呢?其实,这里的大部分工作都是由 Xcode 和 App Store 来帮你完成的,你只需要通过 Xcode 添加 xcassets 目录,然后将图片添加进来即可。
代码文件优化
代码文件优化其实也可以看成是对可执行文件 Mach-O
的优化,其大小是由代码量来决定的。所以对 Mach-O
瘦身 其实就是查找并减少无用的代码。
无用代码检查
使用 AppCode
分析
无用代码一般也可以使用简单的工具来检查,如 AppCode
,当然如果代码量过大,可能这个会分析不过来。据说百万行代码可能会吃不消。
用 AppCode
做分析的方法很简单,直接在 AppCode
里选择 Code -> Inspect Code
就可以进行静态分析。静态分析完以后,我们可以在 Unused code
里看到所有的无用代码。
虽然可以检测出很多无用代码,但这些并不准确,所以还需要人工二次确认才能够安全删除掉。
分析 Mach-O
文件
还有一种就是分析 Mach-O
文件,使用MachOView 这个软件[5]来查看Mach-O 文件里的信息,然后依据 Mach-O
文件的 __objc_selrefs
、__objc_classrefs
和 __objc_superrefs
来查看使用过的类和子类。
这种查看方法也不是完美的,原因在于, Objective-C
是门动态语言,方法调用可以写成在运行时动态调用,这样就无法收集全所有调用的方法和类。所以,我们通过这种方法找出的无用方法和类就只能作为参考,还需要二次确认。
减少第三方SDK
如果在项目中使用很多第三方库,你还需要检查是否导入了相同的功能的库,避免导入过多的库而造成资源过大。
有时候有些第三方库大小占比很高的时候,你也需要去思考是否要替换掉它。
参考资料
ImageOptim: https://imageoptim.com/mac
[2]图压: https://tuya.xinxiao.tech/
[3]isparta: http://isparta.github.io/
[4]LSUnusedResources: https://github.com/tinymind/LSUnusedResources
[5]MachOView 这个软件: https://sourceforge.net/projects/machoview/
来源:新生代农民工No1
https://juejin.cn/post/7069046589293068318
-End-
最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!
面试题
】即可获取