谈谈 iOS 包瘦身方案

Posted 程序员大咖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谈谈 iOS 包瘦身方案相关的知识,希望对你有一定的参考价值。

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇

包瘦身方案

相信大家都会遇到随着项目需求的变化,工程中的代码和资源文件会伴随着增长,很多时候,我们都不会轻易的去删除某些代码,或者资源文件。但是这样带来的代价就是包的体积越来越大。

当包的体积超过 200MB 时,那么就引起了数据部门的注意,数据部门分析新用户的减少可能跟应用商店包大小超限,用户流量无法下载的问题所致。那么此时再去做包大小优化意味着我们就会流失很多新用户,并且也会拉高我们的新用户成本。所以包大小优化不能在问题发生后再去做,应该及时去做,当下就该做,我们也应该把 200MB 看成“红线”。

接下来我们看看包大小优化有哪些方案:

首先,就是资源文件优化,这种方案在瘦包上最容易看到成效,如果你的包大小急需要瘦身,不妨先试试这个。资源文件优化你可以从图片资源压缩无用资源检查资源文件上传中入手,或者使用官方提供的App Thinning

其次,是代码文件优化, 代码文件优化 投入时间可能要比资源文件优化的时间长很多,而且成效没有那么明显。但是代码文件优化可以检查很多无用代码,以及删除很多不必要文件,清理项目结构,使项目可持续性维护。

资源文件优化

相比较而言,资源优化的时间是最快的,成果是最好的,我们只需要做好平时的资源压缩处理,定期清理无用资源,做好资源文件合理分配,那么包体积大小就不会太大。

图片资源压缩

图片压缩我们可以选择的工具其实有很多,重点就是要注意检查压缩的图片资源会不会在显示上有问题。工具推荐:ImageOptim[1] 、图压[2]

图片资源压缩也有很多公司使用webp格式图片,这种格式对比pngjpg要小很多,但客户端性能对解码webp图片会有一定的影响。在一些老的机型上,表现不是很好。所以需要做一些取舍。这里有webppng格式转换的工具 isparta[3]

其实我觉得这两种方案可以共存,团队内部设定一个资源文件的最大值,比如超过 100KB 就选择使用 webp格式的图片,小于 100KB 就使用压缩工具。这样就可以极大的减少资源文件的大小,同时减少包的体积。

无用资源检查

无用资源检查可以通过工具 LSUnusedResources[4]

删除无用图片的过程,可以概括为下面几步操作。

  1. 通过 find 命令获取 App 安装包中的所有资源文件,比如 find /Users/daiming/Project/ -name

  2. 设置用到的资源的类型,比如 jpg、gif、png、webp

  3. 使用正则匹配在源码中找出使用到的资源名,比如 pattern = @"@"(.+?)""。

  4. 使用 find 命令找到的所有资源文件,再去掉代码中使用到的资源文件,剩下的就是无用资源了。

  5. 对于按照规则设置的资源名,我们需要在匹配使用资源的正则表达式里添加相应的规则,比如 @“image_%d”。

  6. 确认无用资源后,就可以对这些无用资源执行删除操作了。这个删除操作,你可以使用 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 SlicingBitcodeOn-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

如果在项目中使用很多第三方库,你还需要检查是否导入了相同的功能的库,避免导入过多的库而造成资源过大。

有时候有些第三方库大小占比很高的时候,你也需要去思考是否要替换掉它。

参考资料

[1]

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 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!

点击👆卡片,关注后回复【面试题】即可获取

在看点这里好文分享给更多人↓↓

以上是关于谈谈 iOS 包瘦身方案的主要内容,如果未能解决你的问题,请参考以下文章

iOS App 瘦身方案

iOS ipa包瘦身---删除无用图片资源

iOS 优化 - 瘦身

iOS 瘦身!一个让 50% 本地图片消失的方案

自如首创 iOS 图片资源极致优化方案

iOS安装包瘦身的那些事儿