iOS应用瘦身

原文地址web

随着业务的不断迭代,APP安装包会愈来愈大。包过大既影响用户体验、影响升级率、致使没法提交App Store和非WiFi环境下没法下载的问题。怎样对App进行瘦身成了重中之重。swift

APP Thinning

App Thinning是由苹果公司推出的一项能够改善App下载进程的技术,它只适用于iOS9及以上系统。主要解决了用户下载App耗费太高流量问题,同时还能够节省用户iOS设备的存储空间。架构

如今,市面上的iOS设备多种多样,若是想在多种屏幕上都能视觉效果良好,就须要大量的优化资源来匹配不一样分辨率的屏幕。同时,APP还包含针对arm6四、arm7s、arm7等多种架构的优化,3D图形技术(OpenGL, Metal等),还有音频以及其余不一样的文件。若是这些资源都在一个包里,势必会使用户的安装包变大。app

App Thinning 会自动检测用户的设备类型,而且只下载当前设备所适用的内容。。如:iPhone 6只会下载 2x分辨率的图片资源,iPhone 6plus则只会下载3x分辨率的图片资源。用户仅需下载本身当前使用的特定设备所需的内容,这不只加快了下载速度,还节约了设备的存储空间。工具

App Thinning类型

App Thinning由三个方面构成:App Slicing、On Demand Resources以及Bitcode。性能

App Slicing

向iTunes Connect上传App后,会对App进行切割,建立不一样的变体,一个变体只包含针对某个目标设备的可执行架构与资源等,这样就能够适应到不一样的设备。优化

On Demand Resources

按需加载资源是在app第一次安装后可下载的文件。举例说明,当玩家解锁游戏的特定关卡后能够下载新关卡相关的内容。此外,玩家已经经过的关卡能够被移除以便节约设备上的存储空间。ui

经过设置Xcode中的Build Settings设置,能够开启按需加载。ssr

Bitcode

Bitcode有些抽象,但在本质上它也是苹果在用户下载前优化app的新方式。Bitcode使得app不管在何设备上都能快速高效地运行。Bitcode使用最新的编译器自动编译app而且针对特定架构进行优化(ps:优化效果并不明显)。code

Bitcode不会下载应用针对不一样架构的优化,而仅下载与特定设备相关的优化,使得下载量更小。

能够经过Build Settings下的选项进行设置,将bitcode设为YES来完成。

如何使用App Thinning?

虽然Xcode和App Store帮你完成了App Thinning的主要流程,可是你须要确保你的app支持这项新技术。首先,你必须启用资产目录。

而后添加xcassets目录,将图片添加进来便可。

按照Asset Catalog的模板添加图片资源便可,添加的2x分辨率的图片和3x分辨率的图片,会在上传到 App Store后被建立成不一样的变体以减少App安装包的大小。架构文件只须要按照默认的设置, App Store就会根据设备建立不一样的变体,每一个变体里只有当前设备须要的那个架构文件。

图片资源优化

图片资源的优化,主要体如今删除无用图片和图片资源压缩这两方面。

清除无用图片资源

删除无用图片的过程,能够归纳为下面这几步:

  • 找到全部的图片资源文件名(后缀为.imageset、.jpg、.png、.gif、 .pdf类型的文件名)。
  • 在项目中的全部代码文件及资源配置文件(后缀为.m、.mm、 .swift、 .xib, .storyboard、 .plist的文件)中,查找第一步中找到的文件名。
  • 获得全部未使用的图片资源名。
  • 确认无用资源后,就能够对这些无用资源执行删除操做了。

**注意:**对于"image_%d"这种方式的图片不要误删。

若是你不想本身从新写一个工具的话,能够选择开源的工具直接使用。我建议的有2个开源的工具比较好用:FengNiao和LSUnusedResources。关于这个两个工具的对比,你们能够参考:www.avanderlee.com/optimizatio… 这篇文章。

清除重复图片资源

重复资源不是指命名重复而是内容相同。

fdupes 是Linux下的一个工具,能够在指定的目录及子目录中查找重复的文件。fdupes经过对比文件的MD5签名,以及逐字节比较文件来识别重复内容。

图片压缩

目前比较好的压缩方案是,将图片转成WebP。WebP是Google公司的一个开源项目。关于WebP的原理及好处已经在iOS启动优化之首屏图片加载优化这篇文章中写过了,感兴趣的同窗能够查阅这篇文章。

Google公司在开源WebP时,提供了一个图片压缩工具cwebp来将其余图片转成WebP

值得注意的是:WebP在CPU消耗和解码时间上会比PNG高一些。因此,咱们有时候还须要在性能和体积上作取舍。

因此要具体状况具体分析,若是图片较大,能够考虑使用WebP;而较小时,可使用网页工具TinyPng或GUI工具ImageOptim进行图片压缩。这两个工具的压缩率没有WebP那么高,不会改变图片压缩方式,解析时对性能损耗也不会增长。

代码优化

对代码进行瘦身,就是找到并删除无用的代码,查找无用代码的过程归纳以下:

  • 找出全部的类和方法。
  • 找到使用的类和方法。
  • 取两者的差集获得无用代码。
  • 人工确认无用代码后,可进行删除。

使用AppCode找出无用代码

经过AppCode能够检查未使用的文件,拼写问题,类型检查等多种潜在疑难杂症。 经过Code->Inspect Code进行静态分析:

使用App Code查找无用代码会存在一些弊端:

  • 若是子类调用了父类的方法,父类的这个方法不会被认为使用了;
  • 经过点的方式使用属性,该属性会被认为没有使用;
  • 没法识别经过字符串拼接方式来建立的类和调用的方法。

LinkMap结合Mach-O找无用代码

能够经过分析LinkMap来得到全部的类和方法的信息。获取LinkMap能够经过将Build Setting里的 Write Link Map File设置为Yes,而后指定Path to Link Map File的路径,就能够获得每次编译后的 LinkMap 文件了,设置选项以下所示:

LinkMap包含三部分:Object File、Section 和 Symbols。

Object File:包含了代码工程的全部文件; Section:描述了代码段在生成的Mach-O里的偏移位置和大小; Symbols:列出每一个方法、类、block、以及它们的大小;

经过LinkMap ,不但能够统计出全部的方法和类,还可以清晰地看到代码所占包大小的具体,进而能够针对性地进行代码优化。

获得了代码的全集信息之后,还须要找到已使用的类和方法,获取到差集,从而找出无用代码。Mach-O文件中包含了全部使用过的类和方法。

iOS中的方法都是经过objc_msgSend来调用的,而objc_msgSend在Mach-O文件里是经过__objc_selrefs这个section来获取selector这个参数的,因此__objc_selrefs里的方法必定是被调用了的。__objc_classrefs里是被调用过的类,__objc_superrefs是调用过super的类。经过__objc_classrefs和__objc_superrefs,咱们就能够找出使用过的类和子类。

可使用MachOView这个软件来查看Mach-O文件里的信息。


扫一扫关注咱们,get更多iOS技能

相关文章
相关标签/搜索