iOS开发—APP启动时间优化

96
小呀小苹果呀
2019.02.20 11:36 字数 396

这里只讨论APP冷启动的情况。启动时间由 pre-main 时间和 main 函数到第一个界面渲染完成时间这两个部分组成。

一. 度量 iOS App 的pre-main启动时间

Xcode设置.png
pre-main流程.png
总过程.png
详情.png

二. pre-main启动时间分析

App启动过程

  1. 解析Info.plist
    加载相关信息,例如闪屏
    沙箱建立、权限检查
  2. Mach-O加载
    如果是胖二进制文件,寻找合适当前CPU类别的部分
    加载所有依赖的Mach-O文件(递归调用Mach-O加载的方法)
    定位内部、外部指针引用,例如字符串、函数等
    执行声明为attribute((constructor))的C函数
    加载类扩展(Category)中的方法
    C++静态对象加载、调用ObjC的 +load 函数
  3. 程序执行
    调用main()
    调用UIApplicationMain()
    调用applicationWillFinishLaunching
  1. dylib loading time
    加载系统的动态库使很快的,因为可以缓存,而加载内嵌的动态库速度较慢。所以,提高这一步的效率的关键是:减少动态库的数量,可以通过合并动态库进行优化。
  2. rebase/binding time
    Rebase和Bind都是为了解决指针引用的问题,减少指针数量才会减少这部分工作的耗时。对于 ObjC 来说就是减少 Class,selector 和 category 这些元数据的数量,可通过合并Category和功能类似的类,删除无用的方法和类,多用Swift Structs(因为Swfit Structs是静态分发的)等方式优化。
  3. Objc setup
日记本