App随着版本迭代、业务扩张、人员更迭、架构变更使项目变得越来越臃肿。废弃的业务代码、冗余无用的类方法和声明、无用的资源文件穿插在项目中使App的包越来越大。为了保持项目整洁,提升开发和用户体验App开启本次Apps瘦身之旅。
ipa文件构成
通过对包内容构成的分析,可以围绕资源文件、可执行文件、xcode编译过程三个方面去做优化。
优化点
资源优化
1、通过工具压缩图片清理无用图片
Imageoptim:图片压缩工具,跟xcode编译设置 compress png files 不能同时启用。详见Imageoptim官网说明。
LSUnusedResources、FengNiao 清理无用图片。
2、压缩音视频文件等可压缩大文件
3、手动清理无效未使用资源(json、text、plist 等文本资源)。
可执行文件优化
1、使用Appcode(code->inspect code) 代码检测分析功能删除无用类和无用方法、清理无效声明、#import/#include、清理未使用变量。
![](http://img.e-com-net.com/image/info10/d7e26f499a5f4976be9d581ea4e88e6d.png)
同时通过Appcode 还能分析出其他项目代码中存在的问题,也可以一并处理,可避免一些潜在crash,内存泄漏等问题。
2、第三方库
整合删除功能相似相近的第三方库,不要为了一个小功能而引入整个库。对第三方库的使用进行严格的准入评估,避免滥用。
xcode编译优化
Optimization Level
该选项表示编译器优化代码性能的不同方式。具体表现为项目大小或者编译时间。实现机制为不同程度的减少代码执行需要的loop unrolling(一种牺牲程序的尺寸来加快程序执行速度的优化方法)。优化程度从fast,faster,fastest依次增强。这些选项会给编译器权限去修改代码的结构以便节省编译时间。任何形式的代码优化都会以时间为代价
Release模式设置为Fastest, Smallest [-Os]可以显著的减小编译文件大小,该选项会自动尝试fastest和smallest两种极端优化方法,选择最合适的值。苹果建议只为Release模式设置该选项
Optimization Leveal各个选项的意义
Xcode Setting
Describtion
None
The compiler does not attempt to optimize code. Use this option during development when you are focused on solving logic errors and need a fast compile time. Do not use this option for shipping your executable.(编译器不进行任何代码优化)
Fast
The compiler performs simple optimizations to boost code performance while minimizing the impact to compile time. This option also uses more memory during compilation(编译器进行小幅度代码优化,同时消耗更多的内存)
Faster
The compiler performs nearly all supported optimizations that do not require a space-time tradeoff. The compiler does not perform loop unrolling or function inlining with this option. This option increases both compilation time and the performance of generated code.(该选项会进行所有可用的优化选项而不用花费额外的时间和内存。该选项不会执行循环展开或者内嵌函数。该选项会在提升代码性能的同时增加编译时间)
Fastest
The compiler performs all optimizations in an attempt to improve the speed of the generated code. This option can increase the size of generated code as the compiler performs aggressive inlining of functions.This option is generally not recommended.(该选项会作出尽可能多的尝试来提高编译性能。但同时会和内嵌函数机制存在冲突。一般不建议使用该选项)
Fastest,Smallest
The compiler performs all optimizations that do not typically increase code size. This is the preferred option for shipping code because it gives your executable a smaller memory footprint.(编译器会进行所有可用的优化而不显著的增加运行空间。该选项是打包代码的最优选项)
Enable bitcode
设置为YES(项目中所有的库都必须支持bitcode)
Bitcode为LLVM编译器的中间代码的一种编码,LLVM的编译原理是前端负责把项目代码翻译成Bitcode中间码,然后再根据不同目标机器芯片平台转换为相应的汇编指令以及翻译机器码。使用Bitcode的不便之处是无法还原崩溃现场找到原因。
Strip Symbol Information
1、Deployment Postprocessing2、Strip Linked Product3、Strip Debug Symbols During Copy4、Symbols hidden by default
设置为YES可以去掉不必要的符号信息,可以减少可执行文件大小。
Release 设置为YES Debug 设置为NO,
Dead Code Stripping
删除静态链接的可执行文件中未引用的代码
Debug 设置为NO Release 设置为YES 可减少可执行文件大小
Assert Catalog Compiler
optimization 选项设置为 space 可以减少包大小
Generate Debug Symbols
Enables or disables generation of debug symbols. When debug symbols are enabled, the level of detail can be controlled by the build ‘Level of Debug Symbols’ setting.
调试符号是在编译时生成的。当Generate Debug Symbols选项设置为YES时,打包会生成symbols 文件。设置为NO则ipa中不会生成symbol文件,可以减少ipa 大小
xcode 默认选择为YES,不建议关闭该选项,可能会影响到app调试。
Reference
Xcode缩小ipa包大小及symbols设置等
App Thinning (iOS.tvOS,wtchOS)
Build Setting Reference
Tuning for Performance and Responsiveness