App启动流程

App的完整启动流程(冷启动流程)

冷启动主要分为三个阶段:

  1. main() 函数执行前(pre-main阶段)
  2. main() 函数执行后(从main函数执行,到设置self.window.rootViewController执行完成)
  3. 首屏渲染完成后(从self.window.rootViewController执行完成到didFinishLaunchWithOptions方法作用域结束)

main函数执行前,系统会做的事:

image.png
  1. 加载可执行文件。(App里的所有.o文件)
  2. 加载动态链接库,进行rebase指针调整和bind符号绑定。
  3. ObjC的runtime初始化。
    • 包括:ObjC相关Class的注册、category注册、selector唯一性检查等。
  4. 初始化。
    • 包括:执行+load()方法、用attribute((constructor))修饰的函数的调用、创建C++静态全局变量等。

简单来说:
App启动后,首先,系统内核(Kernel)创建一个进程。
其次,加载可执行文件。(可执行文件是指Mach-O格式的文件,也就是App中所有.o文件的集合体)这时,能获取到dyld(dyld是苹果的动态链接器)的路径。
然后,加载dyld,主要分为4步:
1 . load dylibs:这一阶段dyld会分析应用依赖的dylib,找到其mach-o文件,打开和读取这些文件并验证其有效性,接着会找到代码签名注册到内核,最后对dylib的每一个segment调用mmap()。
2 . rebase/bind:进行rebase指针调整和bind符号绑定。
3 . ObjC setup:runtime运行时初始化。包括ObjC相关Class的注册、category注册、selector唯一性检查等。
4 . Initializers:调用每个ObjC类与分类的+load方法,调用attribute((constructor))修饰的函数、创建C++静态全局变量。

main函数之后

main函数之后

iOS App启动优化(一)—— 了解App的启动流程:https://www.jianshu.com/p/024b3d847fe0
iOS操作系统-- App启动流程分析与优化:https://juejin.im/post/6844903735395631118
深入理解iOS App的启动过程:https://www.jianshu.com/p/a51fcabc9c71
iOS App从点击到启动https://www.jianshu.com/p/231b1cebf477

推荐阅读更多精彩内容