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