前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >给ipa瘦身

给ipa瘦身

作者头像
拉维
发布2024-02-22 14:51:21
1020
发布2024-02-22 14:51:21
举报
文章被收录于专栏:iOS小生活iOS小生活

所谓的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自动压缩图片后,图片的大小会不降反增,具体原因大家可自行百度,这里不做过多解释。

图片资源压缩工具除了ImageOptim之外,还可以使用Tinypng(https://tinypng.com/),可以选取一个自己喜欢的GUI工具,具体使用和ImageOptim差不多。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

代码瘦身

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步,就已经可以取得不错的瘦身效果了。

以上。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-01-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iOS小生活 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图片处理
图片处理(Image Processing,IP)是由腾讯云数据万象提供的丰富的图片处理服务,广泛应用于腾讯内部各产品。支持对腾讯云对象存储 COS 或第三方源的图片进行处理,提供基础处理能力(图片裁剪、转格式、缩放、打水印等)、图片瘦身能力(Guetzli 压缩、AVIF 转码压缩)、盲水印版权保护能力,同时支持先进的图像 AI 功能(图像增强、图像标签、图像评分、图像修复、商品抠图等),满足多种业务场景下的图片处理需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档