Firebase框架 是如何统计APP 启动时间的?

252 阅读3分钟

一、FPRAppActivityTracker(APP启动时间点统计)

1. 关键时间点变量

  • appStartTime:程序类加载时记录的应用启动近似时间。

  • applicationDidFinishLaunchTime:应用完成启动的时间,监听 UIApplicationDidFinishLaunchingNotification 赋值。

  • isActivePrewarm:是否为预热启动,检测环境变量 ActivePrewarm

    说明 当应用被预热时,Apple 会设置环境变量 ActivePrewarm=1,该环境变量在 didFinishLaunching 后被删除。 代码示例:

    isActivePrewarm = [NSProcessInfo.processInfo.environment[@"ActivePrewarm"] isEqualToString:@"1"];
    

2. 启动时间点统计流程

  • 类加载时 (+load):

    • 记录 appStartTime
    • 判断是否预热启动。
    • 收集 CPU 和内存指标。
    • 监听 UIWindowDidBecomeVisibleNotificationUIApplicationDidFinishLaunchingNotification
  • 窗口可见时 (windowDidBecomeVisible:):

    • 调用 startAppActivityTracking,开始监听应用活跃状态通知:

      • UIApplicationDidBecomeActiveNotification
      • UIApplicationWillResignActiveNotification
    • 移除该通知监听。

  • 应用完成启动时 (applicationDidFinishLaunching:):

    • 记录 applicationDidFinishLaunchTime
    • 移除该通知监听。
  • 应用进入活跃状态 (appDidBecomeActiveNotification:):

    • 设置应用状态为前台。

    • 使用 dispatch_once 创建并启动 appStartTrace

      • appStartTime 作为起始时间。
      • 启动阶段 _astui(TimeToUI)和 _astfd(TimeToFirstDraw)。
    • 停止后台会话追踪,启动前台会话追踪。

    • 启动阶段 _asti(TimeToUserInteraction),在下一个主线程循环中结束启动追踪:

      • 如果启动时间差小于 60 分钟,且启用追踪,且非预热启动,则停止追踪,否则取消。
  • 应用失去活跃状态 (appWillResignActiveNotification:):

    • 发送 CPU 和内存指标(仅发送一次)。
    • 设置应用状态为后台。
    • 停止前台会话追踪,启动后台会话追踪。

3. 预热启动检测

  • 通过环境变量 ActivePrewarm 判断。
  • 结合配置控制是否启用预热检测。
  • 预热启动时,appStartTrace 计数指标增加。

二、FIRTrace(性能追踪核心类)

1. 初始化

  • initWithName::公共初始化,校验名称,判断 SDK 是否启用,数据采集是否允许。
  • initInternalTraceWithName::内部使用初始化,标记为内部追踪。

2. 追踪生命周期

  • start

    • 如果未启动,记录开始时间。
    • 创建后台活动追踪器。
    • 更新会话 ID,监听会话更新通知。
    • 非阶段追踪时,收集一次所有指标。
  • startWithStartTime:

    • 先调用 start,然后用指定时间覆盖开始时间。
  • stop

    • 停止当前活动阶段。
    • 如果追踪处于激活状态,记录停止时间。
    • 发送追踪数据给客户端。
    • 非阶段追踪时,收集一次所有指标。
    • 移除会话更新监听。
  • cancel

    • 停止当前活动阶段。
    • 如果激活状态,记录停止时间,但不发送数据。

3. 阶段管理

  • startStageNamed:startTime:

    • 停止当前活动阶段。
    • 根据是否为内部追踪,创建新阶段并启动。
    • 阶段不跟踪后台状态。
  • stopActiveStage

    • 取消当前活动阶段,保存到阶段列表。

4. 指标管理

  • 支持设置、获取、删除、递增指标。
  • 仅在追踪激活时操作指标。

5. 自定义属性管理

  • 支持设置、获取、删除自定义属性。
  • 属性名称和值均需校验。
  • 最大属性数有限制。
  • 属性操作线程安全。

6. 会话管理

  • 监听会话 ID 更新通知,更新追踪会话信息。

7. 追踪状态判断

  • isTraceStarted:是否开始。
  • isTraceStopped:是否停止。
  • isTraceActive:是否处于激活(开始但未停止)状态。

三、整体启动追踪流程图


四、总结

  • FPRAppActivityTracker 负责监听系统通知,捕捉应用启动各关键时间点,结合预热启动检测(通过环境变量 ActivePrewarm),启动多个阶段追踪(TimeToUI、TimeToFirstDraw、TimeToUserInteraction),并管理前后台会话追踪。
  • FIRTrace 是追踪数据的核心管理类,支持创建、开始、停止追踪,管理阶段、指标和自定义属性,确保数据有效且线程安全。
  • 两者协同实现了 Firebase Performance 对 APP 启动性能的精准监控与分析。