APP启动流程
冷启动和热启动
冷启动:启动时,App的进程不在系统里,需要开启新进程。
热启动:启动时,App的进程还在系统里,不需要开启新进程。
APP完整的启动流程
主要分为三个阶段:
main()
函数执行前(pre-main
阶段)main()
函数执行后(从main
函数执行,到设置self.window.rootViewController
执行完成)- 首屏渲染完成后(从
self.window.rootViewController
执行完成到didFinishLaunchWithOptions
方法作用域结束)
1.main函数执行前,系统会做的事:
- 加载可执行文件。(App里的所有.o文件)
- 加载动态链接库,进行rebase指针调整和bind符号绑定。
- ObjC的runtime初始化。包括:ObjC相关Class的注册、category注册、selector唯一性检查等。
- 初始化。包括:执行+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++静态全局变量。
2.main函数执行后:
main函数执行后的阶段,指的是:从 main 函数执行开始,到 appDelegate 的 didFinishLaunchingWithOptions方法里首屏渲染相关方法执行完成。
即,从main函数执行到设置self.window.rootViewController执行完成的阶段。
3.首屏渲染完成后:
首屏渲染完成后的阶段,指的是:didFinishLaunchingWithOptions
方法作用域
内执行首屏渲染后的所有方法执行。
即从设置self.window.rootViewController
到didFinishLaunchWithOptions
方法作用域结束。
这个阶段,首屏已经渲染完成。
需要做的事:
- 初始化一些首屏展示不需要的功能。
- 优化主线程,先处理会卡住主线程的方法,不能影响到用户的后续操作。
Mach-O
mach-o
是iOS/macOS
二进制文件的格式,mach-o
又分为几种不同的类型。本文介绍了常见的mach-o
文件类型以及它们的不同之处。
在Xcode->Build Setting ->Mach-O Type
中,我们可以选择下面几种类型:
Executable
(产物为ipa包)Dynamic Library
(产物为动态库)Bundle
(产物为bundle文件)Static Library
(产物为静态库)Relocatable Object File
(重定向文件)
编译链接过程:【iOS】—— 编译链接