17年初开始接手公司项目,到七月份上架的项目,再迭代到18年五月的时候发现项目的启动时间有点难以接受,用TimeProfiler检测的话是2.2 到2.7s不等,优化App启动时间已经排到紧急的事情上了。
App启动时间分为pre-main 和 main 函数到第一个界面渲染完成。
对于pre-main这边的时间查看可以用官方提供的方法(如图一),添加一个DYLD_PRINT_STATISTICS 并设置值为1
然后运行项目,再控制台就可以看到图二的输出
这个阶段的优化,笔者因为水平原因,暂且搁置,主要讨论下第二个阶段,也就是main 函数到第一个界面渲染完成时间的优化。
当然,优化之前我们需要先确认下项目中究竟什么地方拖慢了App启动,这里用到的工具xcode自带的工具Instrument中的TimeProfiler(使用方法的话就不做过多的赘述)
先说说笔者自己项目中存在的问题,因为一直是独立开发,然后笔者习惯于每个三方sdk都新建一个appdelegate的分类,然后在分类里写好初始化方法并在appdelegate中调用。
而在appdelegater中的application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions中,笔者将初始化首页、初始化SDK以及需要检测的一些接口请求都堆积在这,其实大可不必的。
为此我新建了一个控制类,将不需要第一时间在 didFinishLaunchingWithOptions调用的方法抽离出来,只保留真的第一时间需要加载的,并且删除各个三方sdk中的appdelegate的分类,并将这些不需要第一时间调用的方法放在首页的viewDidAppear中异步加载调用,因为这里不会影响到app启动的时间,删除appdelegate的分类的原因是因为分类太多的话会影响初始化加载的速度。
实际测试中。删除前和删除后在笔者项目中启动时间还是减少了的。
至此,笔者项目的启动时间从2秒多降低到了0.6s左右,暂时可以满足要求,后期再做更多的优化吧。