前言
作为程序猿来说,“性能优化”是我们都很熟悉的词,也是我们需要不断努⼒以及持续进⾏的事情;其实优化 是⼀个很⼤的课题,因为细分来说的话有⼤⼤⼩⼩⼗⼏种优化⽅向 ,但是切忌在实际开发过程中不能盲⽬的 为了优化⽽优化,这样有时可能会造成适得其反的负效果,需要我们根据实际场景以及业务需求进⾏合理优 化。接下来进⼊正题,本⽂将会以iOS App的启动优化为展开点进⾏探讨。
启动流程
iOS App 的启动我们都知道分为pre-main
和 main()
两个阶段,并且在这两个阶段中,系统会进⾏⼀系列的加载操作,过程如下:
1、 pre-main阶段
1、加载应⽤的可执⾏⽂件
2、加载dyld
动态连接器
3、dyld
递归加载应⽤所有依赖的动态链接库dylib
2、 main()阶段
1、dyld
调⽤ main()
2、调⽤ UIApplicationMain()
3、调⽤ applicationWillFinishLaunching
4、调⽤ didFinishLaunchingWithOptions
阶段优化项
1、 pre-main阶段
针对 pre-main
阶段做优化时,我们需要先详细了解其加载过程,这个可以在2016年WWDC 的Optimizing App Startup Time 中详细了解到相关材料
1.1 Load dylibs
这⼀阶段dyld
会分析应⽤依赖的 dylib
(xcode7以后.dylib已改为名.tbd),找到其 mach-o
⽂件,打开和读取这些⽂件并验证其有效性,接着会找到代码签名注册到内核,最后对 dylib
的每⼀个segment
调⽤ mmap()
。不过这⾥的 dylib
⼤部分都是系统库,不需要我们去做额外的优化。
优化结论:
1、尽量不使⽤内嵌的dylib
,从⽽避免增加 Load dylibs
开销
2、合并已有的dylib
和使⽤静态库(static archives)
,减少dylib
的使⽤个数
3、懒加载dylib
ÿ