所谓的ipa,其实就是苹果移动端设备中应用程序的安装包,跟安卓应用程序安装包(APK)是一样的道理。
今天我们要聊的就是如何给一个iOS应用程序的安装包瘦身,也就是减少安装包的体积。
试想一下,两个功能差不多的APP,一个安装包是60M,一个安装包是28M,用户会选择哪一个呢?答案显而易见了吧~
官方APP Thinning
现在的iOS设备屏幕尺寸、分辨率越来越多样化,这样也就需要更多的资源来匹配不同的尺寸和分辨率。同时,APP也会有32位、64位不同芯片架构的优化版本。如果这些都在一个包里,那么用户下载包的大小势必就会变大。
App Thinning会专门针对不同的设备来选择只适用于当前设备的内容以供下载。比如 iPhone 6 只会下载 2x 分辨率的图片资源,iPhone 6S 只会下载 3x 分辨率的图片资源。
在苹果公司使用App Thinning之前,每个App包会包含多个芯片的指令集架构文件。使用App Thinning之后,用户下载时就只会下载一个适合自己设备的芯片指令集架构文件。
苹果官方的App Thinning有三种方式,包括:App Slicing、BitCode、On-Demand Resources。
1,App Slicing(APP 切割)
slicing是为应用捆绑包创建、分发不同变体以适应不同目标设备的过程,一个变体只包含针对某个目标设备的可执行架构和资源。换句话说就是,App Thinning仅向设备传送与之相关的资源(取决于屏幕分辨率、架构等等)。事实上,App Slicing负责App Thinning的主要流程。
现在你准备要提交一个版本的APP,于是你向iTunes Connect上传了ipa文件,然后AppStore会对该应用程序进行分割,针对不同的设备来创建不同的变体。
2,On Demand Resources(按需加载资源)
ODR主要是为游戏多关卡场景服务的,它会根据用户的关卡进度下载随后几个关卡的资源,并且已经过关的资源也会被删掉,这样就会减少初装APP的包大小。
开启ODR涉及改变Xcode的设置,如下图:
3,BitCode
BitCode的本质也是在用户下载前优化APP,BitCode仅针对特定设备进行包大小的优化,通过配置Building Settings来开启BitCode,如下图:
那么,如何在我们自己的项目中使用App Thinning呢?
其实,这里大部分的工作都是由Xcode和AppStore帮你来完成的,你只需要通过Xcode添加xcassets目录,然后将图片添加进来即可,如下图:
然后,按照asset catalog 的模板添加图片资源即可,添加的2x分辨率的图片和3x分辨率的图片,会在上传到AppStore后被创建成不同的变体以减少APP安装包的大小。而芯片指令集架构文件只需要按照默认的设置,AppStore就会根据设备创建不同的变体,每个变体里只有当前设备需要的那个芯片指令集架构文件。
以上就是官方APP thinning的过程,如果想要继续瘦身,我们还需要在图片和代码上继续做优化。
无用图片资源
图片资源的优化空间,主要体现在删除无用图片和图片资源优化这两个方面。而删除无用图片资源,又是其中最容易最应该先做的。
删除无用图片的过程,可以概括为下面的这6大步:
整个过程如下图:
如果你不想自己重写一个工具的话,可以选择开源的工具直接使用,目前最好用的是LSUnusedResources,GitHub上可搜到。这是一个可视化工具,页面如下:
配置到工程路径以后,直接点击右下角的search按钮,就可以检索没有用到的图片了~
搜索完成后,如下:
这样我们就可以将无用资源删除了~
图片资源压缩
无用图片资源处理完了,那么有用的图片还有瘦身的空间吗?答案是有的。
对于APP而言,图片资源总会在安装包里占个大头儿。对它们最好的处理,就是在不损失图片质量的前提下尽可能地做压缩。目前比较好的压缩方案是,将图片转成webP。webp是Google的一个开源项目。
首先,我们来看一下选择 webP 的理由:
那么怎么将图片转成WebP呢?
图片压缩完了并不是结束,我们还需要在显示图片时使用 libwebp 进行解析。如下是一个iOS工程使用 libwebp的范例:https://github.com/carsonmcdonald/WebP-iOS-example
不过,WebP在 CPU 消耗和解码时间上会比PNG高两倍。所以我们还需要在性能和体积上做取舍。
我的原则是:如果图片大小超过了100KB,就可以考虑使用WebP;而小于100 KB时,可以使用GUI工具ImageOptim进行图片压缩。ImageOptim的压缩率没有WebP那么高,不会改变图片压缩方式,所以解析时对性能损耗也不会增加。
ImageOptim的页面如下:
其使用也很简单,就是将图片文件夹拖进来即可,这样就会对里面的所有图片进行压缩了。但是在使用ImageOptim进行图片压缩后,要将项目中的COMPRESS_PNG_FILES和STRIP_PNG_TEXT设置成NO。这两个设置默认是YES,也就是说,Xcode会自动将PNG图片进行压缩的,我们既然自己压缩图片了,就没必要让Xcode在将我们压缩过的图片继续压缩了。实际上,Xcode自动压缩图片后,图片的大小会不降反增,具体原因大家可自行百度,这里不做过多解释。
图片资源压缩工具除了ImageOptim之外,还可以使用Tinypng(https://tinypng.com/),可以选取一个自己喜欢的GUI工具,具体使用和ImageOptim差不多。
代码瘦身
APP的安装包主要是由资源和可执行文件组成的,所以我们在掌握了对图片资源的处理方式后,需要再一起来看看对可执行文件的瘦身方法。
可执行文件就是 Mach-O 文件,其大小是由代码量决定的。通常情况下,对可执行文件进行瘦身,就是找到并删除无用代码的过程。而查找无用代码时,我们可以按照找无用图片的思路,即:
具体怎么去实现我就不做过多介绍了,在这里给大家介绍一款好用的工具:App Code。
App Code是付费软件,对于任何付费软件,大家其实都可以去淘宝上去买账号或者激活码,很便宜也很方便。
用App Code做分析的方法也很简单,直接在APPCode里选择 Code->Inspect Code就可以做静态分析了。
静态分析完,我们可以在Unused Code里看到所有的无用代码,如下图所示:
接下来说说这些无用代码的主要类型:
使用APP Code做代码的静态分析检查,其实并不是100%准确的,所以我们使用App Code检查出的无用代码,还需要人工二次确认才能够安全删除掉。
小结
本文主要分享的是App安装包的一些瘦身方案,主要从图片资源和代码两个层面进行优化:删除无用资源、压缩图片、删除无用代码。
其实做好这3步,就已经可以取得不错的瘦身效果了。
以上。