对iOS安装包瘦身是很多App都必须要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源。这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大,又因为AppStore会对可执行文件加密,导致可执行文件的压缩率低,压缩后可执行文件占整个APP安装包的体积比例大约有80%~90%,优化还是有意义的。
分析ipa文件:iOS可执行文件的组成
通过生成LinkMap文件,分析源代码生成的编译文件的大小。在Build Settings中Write Link Map File设置为Yes (记住release时候不要设置为Yes)。
编译之后会在build目录中生成两个LinkMap文件: XXX-LinkMap-normal-i386和XXX-LinkMap-normal-x86_64,分别代表在模拟器中32位和64位指令集生成的LinkMap文件。
LinkMap的文件详细结构解释
LinkMap会包含每个可执行文件的偏移量及大小,所以可以很方便的知道每个可执行文件的大小。
编译目录文件:~/Library/Developer/Xcode/DerivedData/XXX-eumsvrzbvgfofvbfsoqokmjprvuh/Build/Intermediates/XXX.build/Debug-iphoneos/XXX.build/
LinkMap分析工具
App瘦身checkList
image.png 参考图片.png编译选项
1.编译器优化级别
Build Settings->Optimization Level
有几个编译优化选项,release版应该选择Fastest, Smalllest
,这个选项会开启那些不增加代码大小的全部优化,并让可执行文件尽可能小。
2.去除符号信息
Strip Linked Product / Deployment Postprocessing / Symbols Hidden by Default 在release版本应该设为yes,可以去除不必要的调试符号。Symbols Hidden by Default
会把所有符号都定义成”private extern”,详细信息见官方文档。
这些选项目前都是XCode里release的默认选项,但旧版XCode生成的项目可能不是,可以检查一下。
资源瘦身:
1.清理无用图片
2.清理重复图片
3.无损压缩图片
代码瘦身
- 已经下线的陈旧代码,AB试验已经下线的代码
- 通过转H5、Hybrid或者RN实现的Native功能,可以定期清理
- 一些非核心Hybrid或者RN模块,可以考虑不要打包进入APP,通过动态下发的方式获取
- 代码的重构,UI组件、业务逻辑的重用等等
- 冗余字符串
代码上定义的所有静态字符串都会记录在在可执行文件的__cstring段,如果项目里Log非常多,这个空间占用也是可观的,也有几百K的大小,可以考虑清理所有冗余的字符串。另外如果有特别长的字符串,建议抽离保存成静态文件,因为AppStore对可执行文件加密导致压缩率低,特别长的字符串抽离成静态资源文件后压缩率会比在可执行文件里高很多。
资源瘦身
1、删除无用的图片文件
LSUnusedResources查找无用的图片文件
image.png2、重复的图片文件
查找重复图像文件,使用Duplicate Photo Finder(App Store有免费下载)
image.png
3、无损压缩图片
ImageOptim进行png文件的无损压缩
注意:
实际生产的安装包体积没有变小,因为COMPRESS_PNG_FILES
和STRIP_PNG_TEXT
设置成了YES,Xcode会重新压缩一次图片,但是压缩之后的图反而比ImageOptim处理之后的图更大。改成NO就能让项目中的PNG保持不变。如果搜不到,手动添加一下。
image.png image.png
4、WebP图片压缩 WebP转换工具
WebP是Google提供的一种图片编码格式,通常情况下WebP格式的图片是原始JPG/PNG图片的1/3,所以对于重度依赖图片显示的应用,转换使用WebP可以节省大量的网络传输数据和时间。对于APP瘦身,使用WebP格式可能是一种方式,可以使用WebP格式的图片替代现有的图片资源,可以一定程度的节省空间。
注:iOS原生并不支持WebP格式加载,需要引入SDWebImage/WebP
代码瘦身
1、AppCode代码静态检查
AppCode提供了非常强大的代码静态检查工具,使用Inspect Code,可以找到很多代码优化的地方。可以参考AppCode inspections for your code perfection
2、清除无用代码
清除无用类
fui find
fui --path=~/source/project/Name --ignore-path=Pods --ignore-path=Libraries find
- 清除无用的Import
fui -g --path=~/source/project/Name --ignore-path=Pods find
fui -l --path=~/source/project/Name --ignore-path=Pods find
-
清除无用的Method
-
查找相似的代码:SameCodeFinder可以查找到相似的代码,最后一位数字代表两个文件的海明距离,数字越小说明两个文件越类似。
-
静态库瘦身
暂时还没选择,可以参考文章iOS APP安装包瘦身实践
项目中多少都会引入一些第三方静态库,通过lipo
工具可以查看支持的指令集,比如:
lipo -info libWeChatSDK.a
i386,x86_64,这不是模拟器的指令集么?去掉看能不能减少体积?armv7可以兼容armv7s,armv7s也可以删了,只保留armv7和arm64lipo libWeChatSDK.a -thin armv7 -output libWeChatSDK-armv7.a lipo libWeChatSDK.a -thin arm64 -output libWeChatSDK-arm64.a lipo create libWeChatSDK-armv7.a libWeChatSDK-arm64.a -output libWeChatSDK-device.a ls -ll -rw-r--r-- 1 Vic staff 5957080 Jan 6 14:40 libWeChatSDK-device.a -rw-r--r-- 1 Vic staff 14410376 Nov 25 11:53 libWeChatSDK.a
ipa优化了5M左右。大部分是图片资源,和无用的文件。
参考文章
iOS可执行文件瘦身
iOS APP瘦身实践,资源优化、编译器配置优化、可执行文件优化
滴滴出行iOS端瘦身实践, 提供了查找无用图片的工具、WebP图片压缩、基于clang plugin实现查找无用代码、查找类似代码
基于clang插件的一种iOS包大小瘦身方案
检测出objc项目中无用方法,然后一键全部清理
lipo command(Mac)
iOS APP分析无用代码
网友评论