App的启动流程
App启动分为冷启动和热启动
- 冷启动:从0开始启动App
- 热启动:App已经在内存中,但是后台还挂着,再次点击图标启动App。
一般对App启动的优化都是针对冷启动。
App冷启动可分为三个阶段:
- dyld:加载镜像、动态库
- RunTime方法
- main函数初始化
动态库vs静态库
静态库:一堆.o文件的集合(通常是.a后缀),还没有被链接过,缺点是产物体积比较大,优点是链接到App之后体积比较小。
动态库:一个已经链接完全的镜像,优点是产物体积比较小,缺点是链接到App之后体积比较大。
两者最大的区别就是静态库没有被链接过,而动态库被链接过。
一.dyld
dyld是app的动态链接器。主要可以用来装载Mach-O文件(可执行文件、动态库等)
启动APP时,dyld所做的事情有:
加载过程从exec()函数开始,这是一个系统调用。操作系统首先为进程分配一段内存空间。然后执行以下操作:
- 1.把App的可执行文件加载到内存
- 2.把dyld加载到内存
- 3.dyld进行动态链接
具体内容:
- 1、加载动态库
- Dyld从主执行文件的header获取到需要加载的所依赖动态库列表,然后它需要找到每个 dylib,而应用所依赖的 dylib 文件可能会再依赖其他 dylib,所以所需要加载的是动态库列表一个递归依赖的集合
- 2、Rebase和Binding
- 1、Rebase(偏移修正)
任何一个app生成的二进制文件,在二进制文件内部所有的方法、函数调用,都有一个地址,这个地址是在当前二进制文件中的偏移地址。一旦在运行时刻(即运行到内存中),每次系统都会随机分配一个ASLR(Address Space Layout Randomization,地址空间布局随机化)地址值(是一个安全机制,会分配一个随机的数值,插入在二进制文件的开头),例如,二进制文件中有一个 test方法,偏移值是0x0001,而随机分配的ASLR是0x1f00,如果想访问test方法,其内存地址(即真实地址)变为 ASLR+偏移值 = 运行时确定的内存地址(即0x1f00+0x0001 = 0x1f01)
<
- 1、Rebase(偏移修正)