随着项目的不停迭代复杂,app的启动时间越来越慢,影响了用户体验。所以,我们决定进行一次app的冷启动优化,减少用户的启动等待时间,提升用户体验。
一个完整的冷启动过程大致可以分为3个阶段
- main 函数前
- main 函数 到
didFinishLaunchingWithOptions
阶段 -
didFinishLaunchingWithOptions
至 首页渲染完成
(个人观点首页渲染完成用户才可以操作app的业务,对用户来讲算是业务起点。如果用户进入首页一直卡在那里那体验也不是很好)。
问题:如何量化耗时操作?
Xcode集成的Profile和火焰图可以查看各个阶段的耗时,定位到具体哪些操作拖慢了了冷启动。由于Profile的使用教程网上一大堆,这里就不做详述。
笔者通过Profile分析冷启动过程,发现了最耗时的操作大致是以下几点:
1.main函数到didFinishLaunchingWithOptions阶段集中了大量的sdk初始化,配置和各种数据的初始化。
2.执行了大量+load()方法
3.首页一些比较隐晦的耗时操作
解决方案
1、根据业务的优先级与紧急程度整理初始化配置项的加载顺序
根据我们APP的业务场景,大致分为了三个优先级等级(A、B、C,优先级一依次降低)
优先级A:一些防止越界保护的分类,环境设置等,app一开始就需要的
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions
优先级B:必要的正常业务,比如定位,埋点,热修复的初始化等
优先级C:比如城市数据库加载等,首页
viewDidDisappear
方法渲染完成以后开始加载
2、我们的项目有用到路由跳转,当时框架设计的时候,+()load里进行路由注册,后期业务迭代,load方法越来越多,耗时达到了700ms左右。后来将路由注册的操作放在application didbecomActivite
方法了统一注册,耗时减少了300ms左右。
思路:在编译的时候,通过attribute((section()))将方法注册到指定输入段中,在启动后某个时机一起进行注册
详情请看demo。
3、整理首页UI初始化和加载逻辑,将一些耗时的操作初始化懒加载,可以后置的业务尽量后置
经过整理App的启动速度大概提升了50%左右。
网友评论