包体积瘦身
包体积是什么
包体积优化前,先要明白包体积是什么,在app store上看到的体积又是什么。
在app store里装的是ipa类型的安装包,他存储了iOS应用程序的归档文件,包含被签名过后的二进制文件app、资源信息、配置信息。
在iTunes Connect可以看到我们的app代销分download size和install size
install size 是指安装在设备后占用磁盘空间
download size 是指下载的安装包ipa大小
需要注意app store提示的大小也是针对download size,也就是ipa大小
包大小包含哪几部分
正如上文提到,app store里的ipa包是包含二进制、资源文件、配置文件等。所以优化包体积可以关注在这三部分的优化上。
苹果的包体积优化方案
在iOS9之后苹果推出了三项优化App Slicing、Bitcode、On-Demand Resources
App Slicing
App Slicing帮助开发者把二进制文件中不需要的架构代码去除,并且把assets中不需要的屏幕适配图片清除。所以本地的包和App Store上最终显示的大小是不一样的,而且各个设备间也有差别。
WWDC App Thinning in Xcode
Bitcode
Bitcode是为了统一编译中间产物的格式语法的中间码,和架构有关,也就是也就是说armv7s、arm64会生成两份.bc文件,他们的作用是经过archive的app包在apple后台进行二次编译链接,并且会把不需要的架构移除,移除armv7的.bc保留arm64的.bv.这样的好处是如果以后apple推出了新的CPU架构或是优化了LLVM,就不用重新发包,因为apple会在后台自动为我们优化。
On-Demand Resource#
资源托管在苹果,独立于app store安装包,应用程序按需请求由操作系统管理下载和存储。资源包括下面类别。
On-demand resource types
二进制大小检测
包体积可以通过linkedmap检测,每个静态库的代码端和数据段都可以获取
linkmap主要包括三大部分:
- Object Files 生成二进制用到的link单元的路径和文件编号
- Sections 记录Mach-O每个Segment/section的起始地址和大小
- Symbols 按顺序记录每个符号的起始地址和大小
推荐一个GUI工具快速查看#
总大小
或者使用CLI,自己开发的CLI工具用来分析linkmap以及资源大小
壳工程二进制大小
系统链接库二进制大小
静态库target二进制大小
推荐一个三方的工具,不过简单使用发现有链接问题😅#
每个静态库都是由独立团队维护,所以我们需要为他们分配大小合理的上限,如果需要超过配额是可以通过降低对应的大小换取,这个过程可以通过CICD过程作自动检测,如果超过大小上限熔断合并即可。
体积优化手段
我们开发了工程化的性能分析优化工具,包括包大小计算和压缩,代码质量扫描、启动性能分析和监控开发提效工具,下面列举包大小相关的特性
- 无用类无用方法扫描:静态检测工程里包含的所有类和方法,未被其他类引用或使用,不包括动态调用方式,按业务线各个库分别输出无用类和方法。
- 重复代码扫描:扫描工程中代码拷贝,代码重复按行数判断,最小重复是100行。主要检查单个工程中代码拷贝情况。
- 线上无用页面、功能等监控:统计创建的页面、网络请求等线上使用情况,没有使用或是低频页面可以建议删除。
- 按日期、版本对比模块包体积变化情况:根据日期和版本对比业务线下各个二进制和资源大小变化情况。
- 竞品IPA包自动下载:自动下载竞品最新版本IPA包,分析包大小以及历史功能溯源。
- 包大小计算:每天定时更新代码并编译然后计算app整体包大小,输出各个模块二进制大小、资源大小以及单个代码文件二进制大小和单个资源文件大小。
- 图片/json文件压缩:将单个图片或者zip包压缩,压缩后大小平均会减少50%以上,色彩较为单一的图片可以压缩70%以上。
- 无用图片、重复图片扫描:支持检测app内imageasset、jpg、png、gif、png、webp、json等资源文件使用情况