iOS APP 包大小优化笔记整理

这是我参与更文挑战的第21天,活动详情查看: 更文挑战

iOS APP 包大小优化整理

  1. App Thinning
  2. 无用图片资源删除 和 现有图片资源压缩
  3. 代码优化
  4. 规范

官方 App Thinning

App Thinning 是一个关于节省 iOS 设备存储空间的功能,它可以让 App Store 和操作系统在安装、更新及运行 iOS 或者 watchOS 的 App 等场景时,通过一系列的优化,尽可能减少安装包的大小,仅下载所需的资源,减少 App 的占用空间,从而节省设备的存储空间。这个过程包括了三个过程:slicing、bitcode、on-demand resources。

App Thinning 有三种方式,包括:App SlicingBitcodeOn-Demand Resources

  1. App Slicing,会在你向 iTunes Connect 上传App后,对 App 做切割,创建不同的变体,这样就可以适用到不同的设备。

  2. On-Demand Resources,主要是为游戏多关卡场景服务的。它会根据用户的关卡进度下载随后几个关卡的资源,并且已经过关的资源也会被删掉,这样就可以减少初装 App 的包大小。

  3. Bitcode ,是针对特定设备进行包大小优化,优化不明显。

    开启 Bitcode 编译后,可以使得开发者上传 App 时只需上传 Intermediate Representation(中间件),而非最终的可执行二进制文件。在用户下载 App 之前,AppStore 会自动编译中间件,产生设备所需的执行文件供用户下载安装。也就是当我们提交程序到 App Store 上时, Xcode 会将程序编译为一个中间表现形式( bitcode )。然后 App store 会再将这个 Bitcode 编译为可执行的 64 位或 32 位程序。苹果会根据下载应用的用户的手机指令集类型生成只有该指令集的二进制,进行下发。从而达到精简安装包体积的目的。

    Bitcode 注意点

    1. Xcode 7 默认开启 Bitcode,如果应用开启 Bitcode,那么其集成的其他第三方库也需要是 Bitcode 编译的包才能真正进行 Bitcode 编译
    2. 开启 Bitcode 编译后,编译产生的 .app 体积会变大(中间代码,不是用户下载的包),且 .dSYM 文件不能用来崩溃日志的符号化(用户下载的包是 Apple 服务重新编译产生的,有产生新的符号文件)
    3. 通过 Archive 方式上传 AppStore 的包,可以在 Xcode 的 Organizer 工具中下载对应安装包的新的符号文件

img

无用图片资源

想到优化包大小,首先想到是无用资源的删除,其次就是图片的质量压缩;像代码这样难啃的应该放到最后面处理。

  1. 删除无用资源
  2. 压缩图片资源

删除无用图片的过程,可以概括为下面这6大步。

  1. 通过 find 命令获取App安装包中的所有资源文件,比如 find /Users/daiming/Project/ -name。
  2. 设置用到的资源的类型,比如 jpg、gif、png、webp。
  3. 使用正则匹配在源码中找出使用到的资源名,比如 pattern = @"@"(.+?)""。
  4. 对于按照规则设置的资源名,我们需要在匹配使用资源的正则表达式里添加相应的规则,比如 @“image_%d”。
  5. 确认无用资源后,就可以对这些无用资源执行删除操作了。这个删除操作,你可以使用 NSFileManger 系统类提供的功能来完成。

这里推荐一个非常好用的工具;LSUnusedResources

img

图片资源压缩

如果图片大小超过了100KB,你可以考虑使用 WebP;而小于100KB时,你可以使用网页工具 TinyPng或者GUI工具ImageOptim进行图片压缩。

无用代码的清理

一般的无用代码筛查方式可以分为动态和静态两种方式。静态的方式主要是通过代码扫描、参与编译构建过程或者分析最终产物来确认哪些代码没有被用到。而动态的方式主要是靠插桩或者运行时信息来获取哪些代码没有执行。由于 Objc 强大的动态特性,我们在样本量足够大的场景使用动态方式会比静态方式准确率高很多。

静态筛查筛查方案:

比较简单的方式是:基于 otool dump 最终产物中的 __objc_class_list & __objc_class_refs 做差集找到未使用的 Objc 类。

如果代码采用 C 、C++ 等静态语言编写代码时,编译期已经确定了基本的代码逻辑,所以编译器会帮助我们将没有使用到的代码标记为 Dead code 最终不会打包到安装包中。

动态筛查方案:

  1. 基于插桩的行级别代码覆盖率:

  2. 基于 Runtime 的轻量级运行时「类覆盖率」方案:

这部分重点参考下:抖音品质建设 – iOS 安装包大小优化实践篇

戴铭 10 | 包大小:如何从资源和代码层面实现全方位瘦身?

参考:

www.wenjiangs.com/article/ios…

www.6hu.cc/archives/10…

www.6hu.cc/archives/10…

参考:

www.jianshu.com/p/bb36b9455…

What is app thinning? (iOS, tvOS, watchOS) On-Demand Resources Essentials App Thinning

www.cnblogs.com/dins/p/1236…

猜你喜欢

转载自juejin.im/post/6976589825126170660