iOS启动优化基础概念

304 阅读3分钟

APP 的启动时长对保证用户粘性有很大影响,一款加载时长过长的应该可能会直接被用户放弃或给用户带来不良的用户体验,接下来我们就先来看看iOS的APP启动时间与哪些因素有关系

冷启动和热启动

冷启动

是指应用从不持有任何资源,一切从头开始启动的过程。现在iOS应用在第一次打开,把应用切入后台并打开其他的大量应用,都会进行冷启动。

热启动

当用户按下home键的时候,iOS 的 App 并不会马上被 kill 掉,还会继续保有一些资源。理想情况下,用户点击 App 的图标再次回来的时候,App几乎不需要做什么,就可以还原到退出前的状态,继续为用户服务。这种持续存活的情况下启动 App,我们称为热启动。

注意,当我们手动杀死应用时,再打开应用时,并不一定就是冷启动,因为查看加载资源时会发现和热启动加载的资源是差不多大小,并不是从头开始加载,只是界面的感官给人是冷启动的感觉

启动的不同阶段

启动阶段可以按照执行main函数来区别,分别是main函数执行之前和main函数执行之后

main函数执行之前

首先我们在应用里添加一个环境变量,DYLD_PRINT_STATISTICS, 然后运行程序,就可以打印出main函数执行之前的启动时间 image.png

image.png

现在我们的应用pre-main时间是1s,里面会把各个阶段的时间显示出来:
dylib loading time : 动态库的加载时间,苹果的系统库做了高速优化,要尽量使用系统库,开发者自己的动态库(framework)会比较耗时,苹果建议不超过6个,如果超过6个建议合并
rebase/binding time : 修正绑定内部偏移指针(ASLR)和外部符号时间,优化可能性较少,减少OC类
ObjC setup time : 注册OC类的时间,优化可能性较少,减少OC类,网上测试数据是减少200个类,可以减少8ms
initializer time : load加载时间,slowest intializers会列举出最耗时的几个部分,优化是减少load里的代码,因为load是编译时就写入内存,可以使用initializer方法,initializer是在类第一次调用时调用\

main函数执行之后

main开始 -> 第一个界面出现的时间,可以使用BLStopwatch进行打点操作,去监听从main开始到第一个见面出现的时间

main之后优化思路:

懒加载

开启多线程执行初始化

启动界面最好用代码,避免使用storyboard、xib

这里优化就是要根据具体的程序业务来优化,每个的情况不同,每个人的水平不同,所以只能提供一点思路,具体情况具体分析