iOS app启动速度优化总结

App 启动时

一般app分为冷启动和热启动

  • 冷启动: app点击启动前,它的进程不在系统里,需要系统新创建一个进程分配给它启动
  • 热启动,app在冷启动后用户将app退到后台,app的进程还在系统中的情况下,用户重新启动进入app的过程,当然这个过程做的事情非常少
    因此一般app启动速度都是指冷启动的优化

用户能感知到启动慢,其实都是发生在主线程上。而主线程慢的原因有很多,比如在主线程上执行大文件读写操作,在渲染周期中执行大量计算等。

app启动时的过程(用户点击app开始,到用户看到第一个界面之间的时间):
  1. main()函数执行之前;
  2. main()函数执行之后;
  3. 首屏渲染完成后。
main()函数执行之前

在main()函数执行前,系统主要会做以下几件事:

  • 加载可执行文件(app的.o文件的集合)
  • 加载动态链接库,进行rebase指针调整和bind符号绑定
  • Objc 运行时的初始处理,包括Objc相关类的注册,category注册,selector唯一性检查
  • 初始化,包括了执行 +load()方法,attribute((constructor)) 修饰的函数的调用,创建c++静态全局变量
    因此在这个阶段,对于优化启动速度如下:
  • 减少动态库加载
  • 加少加载启动后不会去使用的类或方法
  • +load() 方法里的内容可以放到首屏渲染完成后在执行,或使用 +initialize() 方法替换掉。
  • 控制 C++ 全局变量的数量
    main() 函数执行后:
    main() 函数执行后的阶段,是指从main() 函数执行开始,到AppDelegate 的 didFinishLaunchingWithOptions 方法里首屏渲染相关方法执行完成。
    首页的业务代码都是要在这个阶段(渲染前执行)
  • 首屏初始化所需配置文件的读写操作
  • 首屏列表大数据的读取
  • 首批渲染的大量计算
    因此梳理出哪些时首屏渲染必要的初始化功能,哪些是app启动必要的初始化功能,哪些是只需要在对应功能开始使用时才需要初始化的
    首屏渲染完成后
    首屏渲染后的阶段,主要完成的是,非首屏其他业务服务模块的初始化,监听的注册,配置文件的读取等,也就是 didFinishLaunchingWithOptions 作用域内执行首屏渲染之后所有方法执行完成
    这个阶段用户已经能够看到app的首页信息
总结
  • main() 函数开始执行后渲染完成前只处理首屏相关的业务,其他无关的业务放在首屏渲染完成后去做
  • 在首屏渲染完成前主线程中一个耗时的操作滞后或者通过异步执行

你可能感兴趣的:(iOS app启动速度优化总结)