App 启动分类
冷启动:启动时,App 的进程不在系统里,需要开启新进程。
热启动:启动时,App 的进程还在系统里,不需要开启新进程。
冷启动过程
App完整的启动流程
主要分为三个阶段:
(1)main()
函数执行前( pre-main
阶段)
(2)main()
函数执行后(从 main
函数执行,到设置 self.window.rootViewController
执行完成)
(3)首屏渲染完成后(从 self.window.rootViewController
执行完成到 didFinishLaunchWithOptions
方法作用域结束)
1.main
函数执行前
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++ 静态全局变量。
2.main
函数执行后
main
函数执行后的阶段,指的是:从 main
函数执行开始,到 appDelegate
的 didFinishLaunchingWithOptions
方法里首屏渲染相关方法执行完成。
即,从 main
函数执行到设置 self.window.rootViewController
执行完成的阶段。
3.首屏渲染完成后
首屏渲染完成后的阶段,指的是:didFinishLaunchingWithOptions
方法作用域
内执行首屏渲染后的所有方法执行。
即从设置 self.window.rootViewController
到 didFinishLaunchWithOptions
方法作用域结束。