随着业务的不断发展,大型app对于包体会比较敏感,本篇主要针对自己在项目中实际进行优化的方向进行一次记录。
主要方向如下几点:
- .app包体内容整体归类分析
- 图片差异比较和优化(包括解析Assets.car)
- 无用函数
- 无用类
- 无用图片
- 重复资源检测
- linkmap分析(二进制文件)
- armv7架构去除统计
- __Text段迁移
1. .app包体内容整体归类分析
通过分析.app包体内容,主要是如下内容:
- Assets.car大小
- Frameworks大小
- 二进制文件大小
- bundle文件大小
- iconFont大小
- 其他零散资源(非Assets.car中的图片、apng、svga等文件格式)
通过以上文件的分析,可以获取到优化的方向。
1.1 Assets文件比较
通过工具cartool获取Assets文件夹,再通过diff命令或者工具/脚本和上一个版本的Assets文件夹进行比较,获取新增图片(大小),进行相关处理(压缩等)。
1.2 FrameWorks
包体分析得到当前的所有Frameworks大小,和之前版本进行比较,如果有差异,可以在包体大小分析中遍历输出所有Framework和对应的大小,详细查看
1.3 bundle
bundle文件的分析同上FrameWorks
1.4 iconFont
iconFont文件的分析同上FrameWorks,遍历的时候可输出每个ttf文件
1.5 其他零散文件
这里的资源文件指的是非Assets文件夹中的资源,比心项目里包含了apng、png、svga、m4a等等在主工程中文件。在包体分析中,可以将他们单独copy一份到单独文件夹中,后面再对该文件夹进行diff分析,分析方案同1.1。
1.6 二进制文件
包体分析中,会将二进制文件的大小输出,如果需要详细查看,这需要去解析二进制文件,主要是对linkmap文件进行解析。
对linkmap分析,可以获取到工程中每个模块的大小,同时也可以对两个linkmap文件进行比较,可以直观的查看相同模块的差异,包括是否是新增模块等等。
2. 无用类
通过脚本classunrefs去静态检测二进制文件,可以获得一些没有使用到的类。因为是静态分析,所以这里检测出来的类需要我们二次确认。一般无用类的频率并不高,这个可以定期清理一下。
3. 无用函数
通过脚本selectorsunref去静态检测二进制文件,同上无用类,也需要二次确认。
4. 无用图片
通过工具LSUnusedResources检测工程,得到的图片也是需要二次确认的,因为有的图片在工程中可能是拼接形式引用的。
5. 重复图片
重复图片主要通过fdupes命令执行,可以通过脚本运行该命令,将重复信息输出到指定文件中。如果是多个项目pod库中的重复,可以采取建立公共资源库。
6. __TEXT段迁移
针对iOS13以下系统,迁移__TEXT段,绕过苹果加密,提升ipa压缩效率,可以使包体减小30%-40%左右。
可参考之前写的这篇文章iOS13以下包体优化方案
7. armv7架构移除
armv7架构支持的是iPhone4s之前的设备,这个是否需要移除要根据统计的用户设备数量和支付情况等具体衡量。移除掉大概减小60M左右。
以上就是本人在项目中的优化方案,后续有其他方向也会在这边更新。