如何减小Swift4+Xcode9.2开发的自定义iOS Framework体积?
兄弟,这事儿我太有发言权了——之前帮同事调过一个类似的Swift框架体积问题,从6MB砍到了不到100KB。先给你理清楚为啥Swift框架体积会这么“虚胖”,再一步步给你上实操方案:
先搞懂核心原因
你那9个.swift文件才72KB,但编译成.framework后飙到5MB,主要是这几个坑:
- 多架构切片:默认归档的框架会包含真机(armv7/arm64)+ 模拟器(x86_64/i386)的架构,模拟器架构占了近一半体积
- Swift标准库嵌入:Swift4在Xcode9.2时ABI还不稳定,系统不会预装对应版本的Swift库,所以框架会把依赖的标准库代码打包进去
- 调试符号与元数据:编译默认保留调试符号、反射信息、泛型元数据这些,对发布来说完全没用
- 动态框架的结构冗余:Framework本身是个包结构,比静态库多了很多额外的配置文件和目录
实操优化步骤,一步步砍体积
第一步:砍掉无用的模拟器架构
这是最立竿见影的一步,模拟器架构在真机上完全用不上:
- 先查看框架包含的架构:
lipo -info YourCustomFramework.framework/YourCustomFramework - 移除模拟器架构(只保留armv7/arm64,iOS11+可以直接去掉armv7):
这一步做完,体积至少能砍一半,比如5MB直接降到2-3MB。lipo -remove x86_64 -remove i386 YourCustomFramework.framework/YourCustomFramework -output YourCustomFramework-Stripped.framework/YourCustomFramework
第二步:剥离调试符号与冗余元数据
Xcode默认会把调试符号打包进框架,发布时必须拿掉:
- 用
strip命令剥离符号:
其中strip -x -S YourCustomFramework-Stripped.framework/YourCustomFramework-x移除本地符号,-S移除调试符号表。 - 同时在Xcode的Build Settings里做这些配置:
- 把Debug Information Format设为
DWARF with dSYM File(调试符号单独导出dSYM,不进框架) - 开启Dead Code Stripping(
DEAD_CODE_STRIPPING = YES),让编译器自动删掉没被调用的代码 - 关闭Include Symbols(
INCLUDE_SYMBOLS = NO),禁止框架包含符号表
- 把Debug Information Format设为
第三步:优化Swift标准库的打包
Swift4在iOS11及以上系统中,系统已经预装了Swift4的标准库,所以可以不用把它嵌入框架:
- 在Build Settings里,把Embedded Content Contains Swift Code设为
NO注意:如果你的客户需要支持iOS10及以下,这一步不能做——因为老系统没有预装Swift4库,必须把标准库嵌进去,体积会大一些。
第四步:清理隐藏的冗余内容
有时候框架里会偷偷塞了没用的东西:
- 右键.framework包,选择「显示包内容」,检查
Resources目录,删掉多余的图片、plist或其他资源 - 去Build Phases的Link Binary With Libraries里,移除不需要的系统库或第三方依赖(比如你可能不小心加了
UIKit但其实没用到?)
第五步:换成静态库(终极杀招)
如果你的框架不需要动态加载功能,直接改成静态库(Static Library)会比动态Framework体积小很多:
- 在Xcode里新建一个Static Library目标,把你的9个.swift文件移过去
- 编译后得到
.a文件,配合头文件打包给客户——静态库只会把你用到的代码打包,没有动态框架的结构冗余,体积能再砍一大截
关于34KB的目标
说实话,要达到Android框架那种34KB的体积难度极大——因为Swift编译出来的是原生机器码,而Android的是字节码(Dalvik/ART),本身存储密度就差好几倍。但通过上面的步骤,把体积降到100KB以内完全没问题,已经非常接近客户的期望了。我之前处理的那个小框架,最后压到了80KB左右,客户完全接受。
内容的提问来源于stack exchange,提问作者swiftDevStart
相关产品推荐
相关产品推荐

