启动速度优化main()调用之前的耗时我们可以优化的点有:

减少不必要的framework,因为动态链接比较耗时

check framework应当设为 optional 和 required ,如果该framework在当前App支持的所有iOS系统版本都存在,那么就设为required,否则就设为 optional,因为 optional 会有些额外的检查

合并或者删减一些OC类,关于清理项目中没用到的类,使用工具AppCode代码检查功能

删减一些无用的静态变量

删减没有被调用到或者已经废弃的方法 stackoverflow.com/questions/3… developer.Apple.com/library/ios…

将不必须在 +load 方法中做的事情延迟到 +initialize 中

尽量不要用 C++ 虚函数(创建虚函数表有开销)

main()调用之后的加载时间
  • 分析 在main()被调用之后,App的主要工作就是初始化必要的服务,显示首页内容等。而我们的优化也是围绕如何能够快速展现首页来开展。 App通常在 AppDelegate 类中的didFinishLaunchingWithOptions: 方法中创建首页需要展示的view,然后在当前runloop的末尾,主动调用CA::Transaction::commit完成视图的渲染。 而视图的渲染主要涉及三个阶段:
  1. 准备阶段 这里主要是图片的解码
  2. 布局阶段 首页所有UIView的 layoutSubViews 运行
  3. 绘制阶段 首页所有UIView的 drawRect: 运行 再加上启动之后必要服务的启动、必要数据的创建和读取,这些就是我们可以尝试优化的地方
  • main()函数调用之后可以优化的点:
  1. 不使用是storyboard、xib,直接视用代码加载首页视图
  2. NSUserDefaults实际上是在Library文件夹下会生产一个plist文件,如果文件太大的话一次能读取到内存中可能很耗时,这个影响需要评估,如果耗时很大的话需要拆分(需考虑老版本覆盖安装兼容问题)
  3. 每次用NSLog方式打印会隐式的创建一个Calendar,因此需要删减启动时各业务方打的log,或者仅仅针对内测版输出log
  4. 梳理应用启动时发送的所有网络请求,是否可以统一在异步线程请求
具体优化点
  1. 对 didFinishLaunching 里的函数考虑能否挖掘可以延迟加载或者懒加载
  2. 已经下线的业务,删减冗余代码
  3. 一些与UI展示无关的业务,如微博认证过期检查、图片最大缓存空间设置等做延迟加载
  4. 启动之后展示闪屏广告图的同时初始化首页的列表页,当广告展示完成之后列表页也就渲染完成了。经过这一次优化之后的main()之后的启动总时长通过上线之后收集数据的验证达到了预期的效果。
  5. didFinishLaunchingWithOptions:
  • 梳理各个二方/三方库,找到可以延迟加载的库,做延迟加载处理,比如放到首页控制器的viewDidAppear方法里。
  • 梳理业务逻辑,把可以延迟执行的逻辑,做延迟执行处理。比如检查新版本、注册推送通知等逻辑。
  • 避免复杂/多余的计算。避免在首页控制器的viewDidLoad和viewWillAppear做太多事情,这2个方法执行完,首页控制器才能显示,
  • 部分可以延迟创建的视图应做延迟创建/懒加载处理。
  • 采用性能更好的API。
  • 首页控制器用纯代码方式来构建。
文章推荐

阿里数据iOS端启动速度优化的一些经验iOS端启动速度优化iOS性能优化:Instruments使用实战

安装包优化

App安装包(ipa文件)是由资源(图片+文档)和可执行文件(二进制文件)两部分组成,安装包瘦身也是从这两部分进行。

1. 资源文件优化(主要指图片资源)
  • 用LSUnusedResource这个软件查找项目中没有用到的图片,然后删除,当然不一定特别准确,有一些[UIImage imageNamed:[NSString stringWithFormat:@"icon_%d",index]]这样使用的图片也会被列在未使用图片中。
  • 压缩图片资源(用imageoptim压缩图片的大小、一些比较大体积的背景图片压缩成.jpg格式的)
  • 使用Assets.xcassets来管理图片也可以减小安装包的体积
2. 代码优化
  • 技术手段排查冗余代码(删除无用类、方法、第三方库、readme文件)
  • 注意平时的开发习惯,废弃模块及早清理
  • 代码结构重构: 代码重构是对一个或者几个类的重复代码的抽象封装,使代码看上去更清晰,复用性更好。
3. Xcode编译选项优化:
  1. 配置编译选项 (Levels选项内)Generate Debug Symbols 设置为NO,这个配置选项应该会让你减去小半的体积。注意这个如果设置成NO就不会在断点处停下;
  2. 编译器优化级别 Build Settings->Optimization Level有几个编译优化选项,release版应该选择Fastest, Smalllest[-Os],这个选项会开启那些不增加代码大小的全部优化,并让可执行文件尽可能小。
  3. 去除符号信息 Strip Debug Symbols During Copy 和 Symbols Hidden by Default 在release版本应该设为yes,可以去除不必要的调试符号。Symbols Hidden by Default会把所有符号都定义成”private extern”,设了后会减小体积。
  4. Strip Linked Product:DEBUG下设为NO,RELEASE下设为YES,用于RELEASE模式下缩减app的大小;
  5. 编译器优化,去掉异常支持。Enable C++ Exceptions、Enable Objective-C Exceptions设置为NO,Other C Flags添加-fno-exceptions

解释:Generate Debug Symbols:这个设置在DEBUG和RELEASE下均默认为YES。调试符号是在编译时生成的。 在Xcode中查看构建过程,可以发现,当Generate Debug Symbols选项设置为YES时,每个源文件在编译成.o文件时,编译参数多了-g和-gmodules两项。但链接等其他的过程没有变化。 当Generate Debug Symbols设置为YES时,编译产生的.o文件会大一些,当然最终生成的可执行文件也大一些。 当Generate Debug Symbols设置为NO的时候,在Xcode中设置的断点不会中断。但是在程序中打印[NSThread callStackSymbols],依然可以看到类名和方法名。Strip Linked Product:设为NO,在Xcode中设置的断点不会中断。配置具体解释

参考文章:

干货|今日头条iOS端安装包大小优化