给ipa瘦身

2019/04/04 17:08
阅读数 68

所谓的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大步:

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

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

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

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

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

  6. 确认无用资源后,就可以对这些无用资源执行删除操作了。这个删除操作你可以使用NSFileManager系统类提供的功能来完成。


整个过程如下图:


如果你不想自己重写一个工具的话,可以选择开源的工具直接使用,目前最好用的是LSUnusedResources,GitHub上可搜到。这是一个可视化工具,页面如下:

配置到工程路径以后,直接点击右下角的search按钮,就可以检索没有用到的图片了~


搜索完成后,如下:

这样我们就可以将无用资源删除了~


图片资源压缩


无用图片资源处理完了,那么有用的图片还有瘦身的空间吗?答案是有的。


对于APP而言,图片资源总会在安装包里占个大头儿。对它们最好的处理,就是在不损失图片质量的前提下尽可能地做压缩。目前比较好的压缩方案是,将图片转成webP。webp是Google的一个开源项目。


首先,我们来看一下选择 webP 的理由

  • webP压缩率高,而且肉眼看不出差异,同时支持有损和无损两种压缩模式。比如,将 Gif 图转为 Animated WebP,有损压缩模式下可减少 64% 大小,无损压缩模式下可减少 19% 大小。

  • WebP 支持 Alpha 透明和 24-bit 颜色数,不会像PNG8那样因为色彩不够而出现毛边。


那么怎么将图片转成WebP呢?


  • Google在开源 WebP 的同时,还提供了一个图片压缩工具 cwebp 来将其他图片转成WebP。cwebp如何使用,可自行百度。

  • 腾讯公司开发的 iSparta 是一个GUI工具,也可以将PNG格式转WebP。如果其他格式的图片要转成WebP格式的话,需要先将其转成PNG格式,再转成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自动压缩图片后,图片的大小会不降反增,具体原因大家可自行百度,这里不做过多解释。


代码瘦身


APP的安装包主要是由资源和可执行文件组成的,所以我们在掌握了对图片资源的处理方式后,需要再一起来看看对可执行文件的瘦身方法。


可执行文件就是 Mach-O 文件,其大小是由代码量决定的。通常情况下,对可执行文件进行瘦身,就是找到并删除无用代码的过程。而查找无用代码时,我们可以按照找无用图片的思路,即:

  • 首先,找出方法和类的全集;

  • 然后,找出使用过的方法和类;

  • 接下来,取二者的差集得到无用代码;

  • 最后,由人工确认无用代码可删除后,进行删除即可。


具体怎么去实现我就不做过多介绍了,在这里给大家介绍一款好用的工具:App Code


App Code是付费软件,对于任何付费软件,大家其实都可以去淘宝上去买账号或者激活码,很便宜也很方便。


用App Code做分析的方法也很简单,直接在APPCode里选择 Code->Inspect Code就可以做静态分析了。


静态分析完,我们可以在Unused Code里看到所有的无用代码,如下图所示:


接下来说说这些无用代码的主要类型:


  • 无用类:Unused class是无用类,Unused import statement 是无用类引入声明;Unused property是无用的属性;

  • 无用方法:Unused method是无用的方法,Unused parameter是无用参数,Unused Instance variable是无用的实例变量,Unused local variable是无用的局部变量,Unused value是无用的值;

  • 无用宏:Unused macro是无用的宏;

  • 无用全局:Unused global declaration是无用全局声明。


使用APP Code做代码的静态分析检查,其实并不是100%准确的,所以我们使用App Code检查出的无用代码,还需要人工二次确认才能够安全删除掉


小结


本文主要分享的是App安装包的一些瘦身方案,主要从图片资源和代码两个层面进行优化:删除无用资源、压缩图片、删除无用代码


其实做好这3步,就已经可以取得不错的瘦身效果了。


以上。

本文分享自微信公众号 - iOS小生活(iOSHappyLife)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部