详细回顾下整个启动过程,以及各个阶段耗时的影响因素:
- 点击图标,创建进程
- mmap 主二进制,找到 dyld 的路径
- mmap dyld,把入口地址设为
_dyld_start
- 重启手机/更新/下载 App 的第一次启动,会创建启动闭包
- 把没有加载的动态库 mmap 进来,动态库的数量会影响这个阶段
- 对每个二进制做 bind 和 rebase,主要耗时在 Page In,影响 Page In 数量的是 objc 的元数据
- 初始化 objc 的 runtime,由于闭包已经初始化了大部分,这里只会注册 sel 和装载 category
- +load 和静态初始化被调用,除了方法本身耗时,这里还会引起大量 Page In
- 初始化
UIApplication
,启动 Main Runloop - 执行
will/didFinishLaunch
,这里主要是业务代码耗时 - Layout,
viewDidLoad
和Layoutsubviews
会在这里调用,Autolayout
太多会影响这部分时间 - Display,
drawRect
会调用 - Prepare,图片解码发生在这一步
- Commit,首帧渲染数据打包发给 RenderServer,启动结束
作者:字节跳动技术团队
链接:https://juejin.cn/post/6887741815529832456
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。