iOS包体积优化的系列文章,其间包括:

  • iOS 包体积优化1 – 总览
  • iOS 包体积优化2 – 怎么剖析ipa包?
  • iOS 包体积优化3 – 代码办理
  • iOS 包体积优化4 – 资源办理
  • iOS 包体积优化5 – 编译优化
  • iOS 包体积优化6 – 长时间保护

依据剖析ipa包成果,可知道资源文件类型:

  • 图片资源文件
  • json资源文件
  • zip资源文件
  • plist资源文件

关于资源文件的处理方法:

  • 能删去的就删去
  • 能紧缩的就紧缩
  • 能替换的就替换
  • 能复用的就复用

大部分app资源首要是图片,图片一般以三种方法存在于 安装包中:

  • 在主项目中运用Images.xcassets办理的图片,会平铺紧缩到 Assets.car 文件中。
  • 在主项目中直接放工程途径中的图片,会存在于ipa的一级目录中。
  • 还有一些存在于bundle中图片。

一. 清理抛弃图片

1. LSUnusedResources

1.1 简介

用于查找 Xcode 项目中未运用的图画和资源的 Mac App。

这个app的原理是,对某一文件目录下一切的源代码文件进行扫描,用正则表达式匹配出一切的@”xxx”字符串(会依据不同类型的源代码文件运用不同的匹配规矩),构成“运用到的图片的调集”,然后扫描一切的图片文件名,检查哪些图片文件名不在“运用到的图片的调集”中,然后将这些图片文件呈现在成果中。

  • Project Path: 项目途径
  • Exclude Folder: 排除的文件夹, 假如有多个用 “|” 离隔。例如: EmptyView|MainImage
  • Resource Suffix: 要查找的资源后缀,用“|” 离隔。
  • Ignore similar name: 过滤掉相似命名的资源。例如:“tag_1.png”,“tag_2.png”
  • Name (click to Copy) : 点击能够复制名称。
  • Size(KB) :文件巨细,点击能够排序。

1.2 地址

地址: github.com/tinymind/LS…

1.3 运用

  1. 点击 Browse.. 挑选工程文件目录。
  2. 点按 Search 以开端查找。
  3. 等候几秒钟,成果将显示在表视图中。

1.4 留意

  • 查找完一定要人工承认无误之后再删去。
  • 主张按批次处理,承认一部分,删一部分,提交一次。

2. WHC_ScanUnreferenceImageTool

2.1 简介

用于查找 Xcode 项目中未运用的图画和资源的 Mac App

  • 高效 : Mac扫描项目图片东西(扫描项目里没有运用的资源图片)
  • 好处 : 删去没有运用的资源图片以减小打包体积
  • 强壮 : 支撑iOS 和 Android项目

iOS 包体积优化4 - 资源管理

2.2 地址

地址: github.com/netyouli/WH…

2.3 运用

  • 运转项目
  • 经过 翻开目录 按钮,翻开项目目录(根目录即可)。
  • 点击 开端扫描 按钮,等候一段时间即可出成果。

2.4 留意

  • 查找完一定要人工承认无误之后再删去。
  • 留意拼接图片名的情况,防止误删。
  • 最好采用 double check 的方法,双人验证。

二. 大图片的查找

大图的处理,首要难在查找比较费事,经过以下4种途径,相信能够找到要处理的大图片范围了。

怎么界说大图片? 一般以为单张图片大于200KB,就算大图片了。 需要依据具体情况进行剖析,例如: 假如这个图片是一个背景图(能够承受拉伸,适当模糊)这个临界点就能够小一点。

1. 直接经过Images.xcassets查找大图片

直接 show in finder翻开 Images.scassets 文件,将文件夹展开到最后一层(后缀为 .imageset)。将大的图片集文件名记录下来。

iOS 包体积优化4 - 资源管理

2. 经过剖析car文件查找大图片

咱们将ipa包解压之后取得的 Assets.car 文件,是没办法针对图片巨细排序的。 能够经过东西 AssetCatalogTinkerer 达到依据文件巨细排序的意图。

  1. 下载并安装 AssetCatalogTinkerer

地址: github.com/insidegui/A…

  1. 翻开项目,此时不会有程序框出来, 菜单栏中 -> File -> Open -> 挑选 .car文件

iOS 包体积优化4 - 资源管理

  1. 挑选导出文件, 菜单栏 -> File -> Export All Images -> 导出到指定的文件夹内

iOS 包体积优化4 - 资源管理

对导出的图片排序剖析(运用Finder供给的依据巨细排序功用)(导出来的图片会自动包括_Normal, 查找的时分自行去掉)

iOS 包体积优化4 - 资源管理

  • 怎么将导出的图片对应到 项目中的Assets.car 文件 中?

拿到图片的名称,在工程目录下,查找图片,能够看到图片的途径,就能够知道 图片对应的 .imageset 的名称。

3. 检查ipa的一级目录中的图片

在ipa的一级目录中,筛选出大图片。

4. 检查存在bundle中的图片。

检查bundle的包内容,经过检查car文件,筛选出大图片。

三. 对大图片进行的处理

紧缩处理

咱们的图片类型一般是 pngjpg 格局的。一般jpg图片是以文件的方法存在于工程目录中的,png图片一般是存在在imageset中的。

作者对找出来的大图片进行无损紧缩,能够运用的紧缩东西: tinypng

图片紧缩之后的图片变小了许多,开心的打包验证之后发现 .car文件 没有明显的改动。仔细对比里边的图片巨细之后,发现图片巨细又回到紧缩之前了。

经过实验发现,不同的情况,紧缩作用不一样:

情况 作用
存在于imageset中的png图片 紧缩无效,甚至有可能是负优化
存在于工程目录中的png图片 没有验证(不该该有存在于工程目录的png图片)
存在于工程目录中的jpg图片 紧缩有效

PNG图片紧缩无效的原因

查了一些材料发现一些端倪:

Xcode 的 Build Setting 设置里边有一个 Compress PNG Files 的选项, 假如挑选了 YES, 那么 Xcode 在编译阶段将会对一切 png 图片进行紧缩。

假如对放入 Images.xcassets 中的png进行无损紧缩。实践后发现,尽管放入 Asset Catalog 的图片巨细有了明显减小,可是构建的产品的巨细却几乎没有改动。原因是Xcode 中,构建 Asset Catalog 的东西 actool 会首要对 Asset Catalog 中的 png 图片进行解码,得到 Bitmap 数据,然后再运用 actool 的编码紧缩算法进行编码紧缩处理。无损紧缩经过变换图片的编码紧缩算法减少巨细,可是不会改动 Bitmap 数据。关于 actool 来说,它接纳的输入没有改动,所以无损紧缩无法优化 Assets.car 的巨细。甚至会有反向增大的情况。

苹果自带了对PNG图片的紧缩方法,所以假如图片格局是PNG的话,将图片Images.xcassets 中办理,能够享用到苹果的紧缩优化。

运用 70% 的有损紧缩是一个不错的方法,既能确保图片清晰度的同时取得更小的巨细。假如关于有半透明作用的图片,采用 70% 的有损紧缩会导致半透明的当地出现噪点,所以紧缩过后的图片最好找设计师同学再承认一次。

推荐运用 ImageOptim 进行 有损紧缩。

iOS 包体积优化4 - 资源管理

大图片的其他处理方法

1. 转化格局

关于较大的PNG图片(Compress PNG Files 导致紧缩无效),能够转为JPG格局图片,存放在工程途径中(不存放在 Images.scassets中),JPG图片自身比PNG图片小许多,差不多要小90%。

2. 考虑运用WebP格局图片

主张实践中比如页面背景图,或许其他 png 格局超过 100KB 巨细的图片都运用 WebP 的方法引进。相较于 PNG 格局,WebP 具有更加优异的图画数据紧缩算法,能带来更小的图片体积,并且拥有肉眼识别无差异的图画质量。 或像素要求不高的图片

3. 云端下载策略

在若干机遇尝试下载zip图片包,对zip包进行版别判别,若云端有更新版别,则依据屏幕是3x仍是2x,下载对应的zip包,解压存入沙盒中;

在读取图片时,首要从bundle中读取,若失利,则从沙盒中读取,若依然失利,则将该图片当作一个网络图片进行恳求,确保图片能被展示。

四. 相同类型图片的处理

1. Tink Color

适合多个图标的形状是完全一致的,仅仅色彩有差异(只要一种色彩)的图片类型。

tint color是苹果在iOS7推出的功用,咱们能够读取一个图标,然后给它赋予一个color值,在手机屏幕上它就能显示出相应的作用。tint color适用于对单色图标进行着色,相比于其他精简图标的解决方案,tint color便利、牢靠、拥有原生支撑。

五. 图片办理方法

1. 主工程中

尽量将PNG图片资源放入 Images.xcassets 中,包括 pod 库的图片。 Images.xcassets 中的图片加载后会有缓存,提高加载速度,并且在终究打包时会自动进行紧缩(Compress PNG Files),再依据终究运转设备进行 2x 和 3x 分发。能够直接享用苹果对PNG的紧缩服务。

主张运用频率高且小的图片放到 Asset.car 中,Asset.car 能确保其加载和渲染的速度最优。而大的图片比如背景图之类的,长宽尺寸就有上千个像素,而这种放到 Asset.car 中会大大的增加安装包的巨细。

2. 组件库中

因为项目采用组件化开发,较多组件的资源图片是放到目录里边,经过bundle的方法导入工程中的,没有运用Images.xcassets 办理,针对这一块图片的紧缩仍是有价值的。

关于内部 Pod 库中的资源文件,咱们能够在 Pod 库里边的 Resources 目录下新建 Asset Catalog 文件,命名为 Images.xcassets,移入一切图片文件,接着手动修正该 组件库 的 podspec 文件指定运用该 Images.xcassets。

s.ios.resource_bundle = { 'BTUIBundle' => '途径' }

Pod 资源文件的引用方法分为 resource_bundlesresources,这里咱们运用的是 resource_bundles,会为为指定的资源打一个 .bundle.bundle包括一个 Assets.car,获取图片的时分要严厉指定 bundle 的位置,能很好的阻隔各个库资源包。