一、FPRAppActivityTracker(APP启动时间点统计)
1. 关键时间点变量
-
appStartTime:程序类加载时记录的应用启动近似时间。 -
applicationDidFinishLaunchTime:应用完成启动的时间,监听UIApplicationDidFinishLaunchingNotification赋值。 -
isActivePrewarm:是否为预热启动,检测环境变量ActivePrewarm。说明 当应用被预热时,Apple 会设置环境变量
ActivePrewarm=1,该环境变量在didFinishLaunching后被删除。 代码示例:isActivePrewarm = [NSProcessInfo.processInfo.environment[@"ActivePrewarm"] isEqualToString:@"1"];
2. 启动时间点统计流程
-
类加载时 (
+load):- 记录
appStartTime。 - 判断是否预热启动。
- 收集 CPU 和内存指标。
- 监听
UIWindowDidBecomeVisibleNotification和UIApplicationDidFinishLaunchingNotification。
- 记录
-
窗口可见时 (
windowDidBecomeVisible:):-
调用
startAppActivityTracking,开始监听应用活跃状态通知:UIApplicationDidBecomeActiveNotificationUIApplicationWillResignActiveNotification
-
移除该通知监听。
-
-
应用完成启动时 (
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 启动性能的精准监控与分析。