美文网首页
iOS冷启动速度提升50%

iOS冷启动速度提升50%

作者: Michale_Zuo | 来源:发表于2020-09-14 15:44 被阅读0次

     随着项目的不停迭代复杂,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

    image.png
    优先级B:必要的正常业务,比如定位,埋点,热修复的初始化等
    优先级C:比如城市数据库加载等,首页viewDidDisappear方法渲染完成以后开始加载

     2、我们的项目有用到路由跳转,当时框架设计的时候,+()load里进行路由注册,后期业务迭代,load方法越来越多,耗时达到了700ms左右。后来将路由注册的操作放在application didbecomActivite方法了统一注册,耗时减少了300ms左右。
    思路:在编译的时候,通过attribute((section()))将方法注册到指定输入段中,在启动后某个时机一起进行注册
    详情请看demo

     3、整理首页UI初始化和加载逻辑,将一些耗时的操作初始化懒加载,可以后置的业务尽量后置

     经过整理App的启动速度大概提升了50%左右。

    相关文章

      网友评论

          本文标题:iOS冷启动速度提升50%

          本文链接:https://www.haomeiwen.com/subject/zvmqohtx.html