包大小优化
type
status
date
slug
summary
tags
category
icon
password
官方 App Thining
App Thinning 有三种方式,包括:App Slicing、Bitcode、On-Demand Resources。
- App Slicing,会在你向 iTunes Connect 上传 App 后,对 App 做切割,创建不同的变体,这样就可以适用到不同的设备。
- On-Demand Resources,主要是为游戏多关卡场景服务的。它会根据用户的关卡进度下载随后几个关卡的资源,并且已经过关的资源也会被删掉,这样就可以减少初装 App 的包大小。
- Bitcode ,是针对特定设备进行包大小优化,优化不明显。
以上的瘦身基本只需要根据常规的操作,在Asset Catalog里面添加2x和3x的图片就可以了,大部分工作都是由 Xcode 和 App Store 来帮你完成的。
删除无用图片资源
删除无用图片的过程,可以概括为下面这 6 大步。
- 通过 find 命令获取 App 安装包中的所有资源文件,比如 find Users_daiming_Project -name。
- 设置用到的资源的类型,比如 jpg、gif、png、webp。
- 使用正则匹配在源码中找出使用到的资源名,比如 pattern = @“@“(.+?)””。
- 使用 find 命令找到的所有资源文件,再去掉代码中使用到的资源文件,剩下的就是无用资源了。
- 对于按照规则设置的资源名,我们需要在匹配使用资源的正则表达式里添加相应的规则,比如 @“image_%d”。
- 确认无用资源后,就可以对这些无用资源执行删除操作了。这个删除操作,你可以使用 NSFileManger 系统类提供的功能来完成。
除了自己写,还可以使用开源的工具GitHub - tinymind/LSUnusedResources
图片资源压缩
如果我们使用png图片,可以在TinyPNG – Compress PNG images while preserving transparency上进行图片压缩。
另一种方式是转化成webp文件:
优点是: 1.压缩率高,同时支持有损和无损两种压缩模式。2. 支持Alpha透明和14-bit颜色数。
缺点是:1. 需要代码适配。2. Xcode不能实时预览。3. webP在CPU消耗和解码时间上比PNG高两倍。
我们可以使用压缩工具Precompiled Utilities | WebP | Google Developers或者iSparta-PNG压缩与格式转换工具来转化成WebP。使用的时候需要使用 libwebp 来解析,这里是使用样例WebP-iOS-example。
具体该如何取舍,如果图片超过100kb,可以考虑使用webp,如果小于100kb,可以使用Tinypng进行压缩。
代码瘦身
App的安装包主要是由资源和可执行文件组成,资源前面已经进行了处理,接下来就是可执行文件的瘦身方法。
对可执行文件进行瘦身就是找到并且删除无用代码的过程。
- 找出方法和类的全集。
- 找出使用过的方法和类。
- 取差集得到无用代码。
- 确认无用代码可删除后,进行删除。
LinkMap结合Mach-O找无用代码
按照图中设置好LinkMap的路径,编译后得到LinkMap文件。
LinkMap文件分成三个部分:Object File、Section 和 Symbols。
- Object File 包含了代码工程的所有文件;
- Section 描述了代码段在生成的 Mach-O 里的偏移位置和大小;
- Symbols 会列出每个方法、类、block,以及它们的大小。
iOS的方法都会通过objc_msgSend来调用,而objc_msgSend 在 Mach-O 文件里是通过 __objc_selrefs 这个 section 来获取 selector 这个参数的。
所以,__objc_selrefs 里的方法一定是被调用了的。__objc_classrefs 里是被调用过的类,__objc_superrefs 是调用过 super 的类。通过 __objc_classrefs 和 __objc_superrefs,我们就可以找出使用过的类和子类。
我们可以使用MachOView download | SourceForge.net这个软件来查看Mach-O里面的信息。
但是,这种查看方法并不是完美的,还会有些问题。原因在于, Objective-C 是门动态语言,方法调用可以写成在运行时动态调用,这样就无法收集全所有调用的方法和类。所以,我们通过这种方法找出的无用方法和类就只能作为参考,还需要二次确认。
通过AppCode找出无用代码
如果代码量不大的时候,直接使用AppCode分析更加合适。
用 AppCode 做分析的方法很简单,直接在 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 是无用全局声明。
但是AppCode也有一些静态检查的问题,同样需要人工确认才能够安全删除。
- Giscus