官方 App Thinning
App Thinning 有三种方式
包括:App Slicing、Bitcode、On-Demand Resources。
- App Slicing,会在你向 iTunes Connect 上传 App 后,对 App 做切割,创建不同的变体,这样就可以适用到不同的设备。
- On-Demand Resources,主要是为游戏多关卡场景服务的。它会根据用户的关卡进度下载随后几个关卡的资源,并且已经过关的资源也会被删掉,这样就可以减少初装 App 的包大小。
- Bitcode ,是针对特定设备进行包大小优化,优化不明显。
同时,按照 Asset Catalog 的模板添加图片资源
总结下来就是,App Thinning是官方提供的支持,要多了解官方文档获取最新的瘦身方案。
无用图片资源删除
自己写工具步骤
- 通过 find 命令获取 App 安装包中的所有资源文件,比如 find /Users/daiming/Project/ -name。
- 设置用到的资源的类型,比如 jpg、gif、png、webp。
- 使用正则匹配在源码中找出使用到的资源名,比如 pattern = @"@"(.+?)""。
- 使用 find 命令找到的所有资源文件,再去掉代码中使用到的资源文件,剩下的就是无用资源了。
- 对于按照规则设置的资源名,我们需要在匹配使用资源的正则表达式里添加相应的规则,比如 @“image_%d”。
也可以选择开源的工具直接使用,如 LSUnusedResources,特别是对于使用编号规则的图片来说,可以通过直接添加规则来处理。
图片资源压缩
对于 App 来说,图片资源总会在安装包里占个大头儿。对它们最好的处理,就是在不损失图片质量的前提下尽可能地作压缩。目前比较好的压缩方案是,将图片转成 WebP。
WebP 是 Google 公司的一个开源项目。首先,我们一起看看选择 WebP 的理由:
- WebP 压缩率高,而且肉眼看不出差异,同时支持有损和无损两种压缩模式。比如,将 Gif 图转为 Animated WebP ,有损压缩模式下可减少 64% 大小,无损压缩模式下可减少 19% 大小。
- WebP 支持 Alpha 透明和 24-bit 颜色数,不会像 PNG8 那样因为色彩不够而出现毛边。
使用命令行方式
Google 公司在开源 WebP 的同时,还提供了一个图片压缩工具 cwebp来将其他图片转成 WebP。cwebp 使用起来也很简单,只要根据图片情况设置好参数就行。
cwebp [options] input_file -o output_file.webp
// 选择无损压缩模式的话,可以使用如下所示的命令
cwebp -lossless original.png -o new.webp
图片色值在不同情况下,可以选择用 -q 参数来进行设置,在不损失图片质量情况下进行最大化压缩:
- 小于 256 色适合无损压缩,压缩率高,参数使用 -lossless -q 100;
- 大于 256 色使用 75% 有损压缩,参数使用 -q 75;
- 远大于 256 色使用 75% 以下压缩率,参数 -q 50 -m 6。
使用工具
除了 cwebp 工具外,你还可以选择由腾讯公司开发的iSparta。iSpart 是一个 GUI 工具,操作方便快捷,可以实现 PNG 格式转 WebP,同时提供批量处理和记录操作配置的功能。如果是其他格式的图片要转成 WebP 格式的话,需要先将其转成 PNG 格式,再转成 WebP 格式。
不过,WebP 在 CPU 消耗和解码时间上会比 PNG 高两倍。所以,我们有时候还需要在性能和体积上做取舍。建议如果图片大小超过了 100KB,你可以考虑使用 WebP;而小于 100KB 时,你可以使用网页工具 TinyPng或者 GUI 工具ImageOptim进行图片压缩。这两个工具的压缩率没有 WebP 那么高,不会改变图片压缩方式,所以解析时对性能损耗也不会增加。
代码瘦身
App 的安装包主要是由资源和可执行文件组成的,所以我们在掌握了对图片资源的处理方式后,需要再一起来看看对可执行文件的瘦身方法。
可执行文件就是 Mach-O 文件,其大小是由代码量决定的。通常情况下,对可执行文件进行瘦身,就是找到并删除无用代码的过程。而查找无用代码时,我们可以按照找无用图片的思路,即:
- 首先,找出方法和类的全集;
- 然后,找到使用过的方法和类;
- 接下来,取二者的差集得到无用代码;
- 最后,由人工确认无用代码可删除后,进行删除即可。
发散思考
除了上面提到的,还有个给app瘦身的方法是动态库,但是动态库又会消耗启动时间,所以实际情况下需要去平衡选择。