Skip to main content

启动监控使用指引

iOS

冷启动

冷启动耗时 = 第一帧UI上屏时间 - App 进程创建时间。
  • App 进程创建时间:从进程的processInfo获取进程的启动时间
  • main函数执行时间:业务调用相关接口主动打点
  • 第一帧UI上屏时间:通过首个CA::Transaction::commit执行时间获取近似值

启动上报默认包含4个打点(Span) 信息。

  • _RM_Cold_Launch:从进程创建到启动结束,和冷启动指标范围一致
  • _RM_Before_Main:从进程创建到全局变量初始化的时间
  • _RM_After_Main:从main 函数执行时间到启动结束的时间
由于 iOS 15 引入了预热(prewarming)的特性,系统会在用户启动应用程序之前预先加载一些资源,以提高应用程序的启动速度。然而,这也会导致 Bugly 获取的应用程序启动耗时数据异常,因为预热过程并不是用户主动启动应用程序所需的时间。因此,为了保证数据的准确性,Bugly 会过滤掉这类数据。

iOS prewarming 的介绍可以参考 About the app launch sequence

前后台切换

前后台切换耗时 = applicationBecomeActive - applicationWillEnterForeground
  • applicationWillEnterForeground:接收到 UIApplicationWillEnterForegroundNotification 通知时间

  • applicationBecomeActive:接收到 UIApplicationDidBecomeActiveNotification 通知时间

    前后台切换上报默认包含1个打点(Span) 信息。

  • _RM_App_Resume:同前后台切换,即为 applicationWillEnterForeground 到 applicationBecomeActive

Android

启动类型

启动类型

启动类型:

  • "first_launch": 属于[冷启动]中的一种特殊情况,即应用安装后的首次[冷启动],通过标签"tag_first_launch"来区分。
  • "pre_launch": 属于[冷启动]中的一种特殊情况,进程被非launch activity的事件所拉起,这个阶段称为预启动,预启动后,直接进入温启动阶段,通过标签"tag_pre_launch" 来区分。
  • "cold_launch": [冷启动],从应用进程创建,到启动页完成首次渲染。除了前面两种特殊的冷启动外,其他普通的冷启动,通过标签"tag_normal_launch"来区分。
  • "warm_launch": [温启动],不存在active的Activity的情况下,从Activity的打开到页面完成首次渲染。

重要接口

  • AppLaunchMonitor#reportAppFullLaunch: 报告应用真正完成启动,非必要操作,适用在onWindowFocusChange并不能真正表示启动完成的情况,通过reportAppFullLaunch来通知启动监控,此时才是真正完成启动。

    AppLaunchProxy.getAppLaunch().reportAppFullLaunch();
  • AppLaunchMonitor#onApplicationCreateEnd: 当不希望使用ActivityThreadHacker来识别,是否launch Activity来触发进程创建,即识别是真正的冷启动,还是进程的预启动,就可以通过调用这个接口来通知启动监控,本次启动标识是否标识为真正的冷启动,还是标识为预启动。

    // 进程由非Launch Activity事件拉起
    AppLaunchProxy.getAppLaunch().onApplicationCreateEnd(false);
    ...
    // 进程由Launch Activity拉起的
    AppLaunchProxy.getAppLaunch().onApplicationCreateEnd(true);
  • AppLaunchMonitor#addTag:

    // 本次启动包含广告页
    AppLaunchProxy.getAppLaunch().addTag("Has_AdvertisePage");
    ...
    // 本次启动需要登陆
    AppLaunchProxy.getAppLaunch().addTag("Need_Login");
  • AppLaunchMonitor#spanStart:业务可以通过spanStart and spanEnd 来添加对于启动阶段的关注任务的耗时统计。

    // 记录登陆耗时,开始执行登陆
    AppLaunchProxy.getAppLaunch().spanStart("Login", null);
    ...
    // [登陆]这个耗时任务下,有一个子任务[RequestVerificationCode]
    AppLaunchProxy.getAppLaunch().spanStart("RequestVerificationCode", "Login");
  • AppLaunchMonitor#spanEnd:

    // 子任务[RequestVerificationCode] 结束
    AppLaunchProxy.getAppLaunch().spanEnd("RequestVerificationCode");
    ...
    // 记录登陆耗时,登陆结束
    AppLaunchProxy.getAppLaunch().spanEnd("Login");

分析启动耗时

指标分析

Bugly 支持平均值、P50、P90、P99 等指标的查看及下钻分析。

image-20230612163403974

Span 耗时分析

用户可以通过 Bugly SDK 中的打点接口在启动阶段添加一些 Span 信息,用于监控及排查启动耗时的逻辑。

image-20230612163446820

查询启动个例

启动个例面板支持通过特定的筛选条件搜索启动个例,以进行详细的耗时分析。

image-20230612161139930