关于此前包大小瘦身的一些浅显认知:
- 资源文件尽量压缩(js或者图片之类的)或者采用服务器CDN下发缓存等
- 代码尽量简洁,冗余代码删减或者注释,打包不会把注释的代码打进去
- 善用条件编译,比如Debug宏,release打包时不会把Debug的代码编译进去
- 导入头文件未被调用的话也不会对打包产物的体积造成影响,一旦调用就会把整个包加进去,App瘦身的话这一点需要注意移除未使用的代码
包大小优化实践
参考博客 http://blog.cnbang.net/tech/2544/
① 编译器优化级别Build Settings->Optimization Level,现在Xcode默认就是Fastest, Smalllest
,这个选项会开启那些不增加代码大小的全部优化,并让可执行文件尽可能小。
② 去除符号信息,Strip Linked Product
/Deployment Postprocessing
/Symbols Hidden by Default
在release
版本应该设为yes
,可以去除不必要的调试符号。Symbols Hidden by Default
会把所有符号都定义成private extern
,详细信息见官方文档。
③ Generate Debug Symbols 设置Release为 NO, 即不产生调试符号 (会影响dsym文件的生成 需考虑线上日志收集/symbols符号翻译等)
④ Dead Code Stripping 设置Release为YES 去掉冗余代码,即裁剪无用代码
⑤Strip Style
符号裁剪类型选择, 主工程选择All Symbols
,静、动态库选择Non-Global Symbols
⑥Link-Time Optimization
设置为Incremental
⑦Build Settings
->Enable Bitcode
-> 设置为YES
(不过老项目一般都不支持这个)
⑧ 将Deployment Postprocessing
设置为NO
,将Strip Linked Product
设置为YES
,将Release
模式的下的Debug Information Format
修改为DWARF with dSYM file
做过一些尝试~ (收效甚微减了十多kb
,还是不如设置编译器优化选项的效果明显,不过有胜于无嘛)
- 删除单例allocWithZone和copyWithZone相关代码(这个有风险,得和团队协商好编码规范)
- 删除机型名称翻译代码,用identifier代替 (这里仅作为埋点收集机型,知道identifier可以事后翻译处理)
- 删除未用到的方法,属性 (可能与Dead Code Stripping作用相同 手动删显得无用功了 求个心安罢了)
- 直接使用魔法数字或者语法糖字面量,尽量不定义额外的变量或者常量,尤其是全局变量
- 非必要不使用@property,使用成员变量代替即可,@property会自动合成setter和getter
- 采用设计模式优化代码,复用公共接口,避免CV重复代码