【iOS】—— APP启动流程

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.rootViewControllerdidFinishLaunchWithOptions方法作用域结束。

这个阶段,首屏已经渲染完成。

需要做的事:

  • 初始化一些首屏展示不需要的功能。
  • 优化主线程,先处理会卡住主线程的方法,不能影响到用户的后续操作。

Mach-O

mach-oiOS/macOS二进制文件的格式,mach-o又分为几种不同的类型。本文介绍了常见的mach-o文件类型以及它们的不同之处。
Xcode->Build Setting ->Mach-O Type中,我们可以选择下面几种类型:

  • Executable(产物为ipa包)
  • Dynamic Library(产物为动态库)
  • Bundle(产物为bundle文件)
  • Static Library(产物为静态库)
  • Relocatable Object File(重定向文件)

编译链接过程:【iOS】—— 编译链接

猜你喜欢

转载自blog.csdn.net/m0_62386635/article/details/132018355