如何精确统计SDK体积?
客户端拿到的SDK可能是多个架构的,比如armv7、armv7s、i386、x86_64、arm64,而最终打到ipa里面却不可能包含这么多架构,中间经过裁剪优化,可能最终体积会大大减少。
我就碰到了一个类似的问题,升级sdk,单纯从.a和.framework的体积来计算升级前后的体积,结论是升级后,sdk体积会降低12.35M的大小。但是,打出ipa进行比对,发现升级后ipa反而增长2.1M。看到这样的结果,我也不知道如何解释。
查看Mach-O文件__TEXT段大小
1 | $ xcrun size -lm <binary-path> |
使用上面的指令,可以查看Mach-O文件Data部分结构和各Segment/Section的大小信息。
通过比较两个ipa文件中Mach-O文件__TEXT段的大小,发现升级后的Mach-O文件的确增大了3M左右。
开启LinkMap选项,使用LinkMap分析SDK大小
- 普通项目,开启LinkMap,需要在
XCode -> Project -> Build Settings -> 把Write Link Map File选项设为yes,并指定好linkMap的存储位置
- Bazel项目,开启LinkMap,需要在
.bazelrc
配置文件中添加下面几行配置:然后,找到1
2
3aquery --objc_generate_linkmap=1
build --objc_generate_linkmap=1
cquery --objc_generate_linkmap=1Edit Scheme
选项,切换到release模式,编译项目,获取到编辑后的Mach-O文件和LinkMap文件。如果不清楚LinkMap文件位置,可以在Xcode的编辑日志中搜索LinkMap关键字,编辑的时候会打印相关日志。
使用LinkMap文件分析SDK的大小
使用LinkMap分析工具来分析,选择LinkMap文件,勾选”分组解析”,点击开始,最终会列出全部的库文件所占用的体积。
最终通过比较两个LinkMap分析的数据,发现升级之后 SDK体积确实增长了3.26M。
参考链接
今日头条优化实践: iOS 包大小二进制优化,一行代码减少 60 MB 下载大小
深入探索 iOS 包体积优化
iOS性能优化-包大小+linkMap分析和查找未使用类和方法
iOS使用LinkMap分析包大小
LinkMap分析工具