dyld2 & dyld3
观看https://developer.apple.com/videos/play/wwdc2017/413/ 记录
在 iOS 13 之前,所有的第三方 App 都是通过 dyld 2 来启动 App 的,主要过程如下:
- 解析 Mach-O 的 Header 和 Load Commands,找到其依赖的库,并递归找到所有依赖的库
- 加载 Mach-O 文件
- 进行符号查找
- 绑定和变基
- 运行初始化程序
上面的所有过程都发生在 App 启动时,包含了大量的计算和I/O,所以苹果开发团队为了加快启动速度,在 WWDC2017 - 413 - App Startup Time: Past, Present, and Future[4] 上正式提出了 dyld3。
dyld3 被分为了三个组件:
(1)本进程外的Mach-O分析器/编译器
-
- 预先处理了所有可能影响启动速度的 search path、@rpaths 和环境变量
- 然后分析 Mach-O 的 Header 和依赖,并完成了所有符号查找的工作
- 最后将这些结果创建成了一个启动闭包
- 这是一个普通的 daemon 进程,可以使用通常的测试架构
(2)本进程内执行”lauch closure“的引擎
- 验证启动闭包的安全性,然后映射到 dylib 之中,再跳转到 main 函数
- 不再需要解析 Mach-O 的 Header 和依赖,也不需要符号查找。
(3)一个启动闭包缓存服务
-
系统 App 的启动闭包被构建在一个 Shared Cache 中, 我们甚至不需要打开一个单独的文件
-
对于第三方的 App,我们会在 App 安装或者升级的时候构建这个启动闭包。
-
在 iOS、tvOS、watchOS中,这一切都是 App 启动之前完成的。在 macOS 上,由于有 Side Load App,进程内引擎会在首次启动的时候启动一个 daemon 进程,之后就可以使用启动闭包启动了。
dyld 3 把很多耗时的查找、计算和 I/O 的事前都预先处理好了,这使得启动速度有了很大的提升。