App Starts

Learn how to monitor your mobile application's performance by using App Starts to identify slow or regressed screens.

The App Starts dashboard in Sentry Dashboards shows an overview of the amount of time it takes for your application to complete cold and warm starts. It helps you identify slow or regressed screens and gives additional information so you can better understand the factors contributing to the slowness of your application start times.

For Android:

  • >=7.4.0 for automatic instrumentation of app start spans and app start profiling
  • Performance-V2 feature flag (<8.0.0) and App Start Profiling must also be enabled in the SDK, e.g.:
MyApplication.java
Copied
import io.sentry.android.core.SentryAndroid;

SentryAndroid.init(this, options -> {
  options.setEnablePerformanceV2(true);
  options.setEnableAppStartProfiling(true);
});

For iOS:

  • >=7.2.0 for automatic instrumentation of app start spans
  • >=8.21.0 for app start profiling

For React Native:

By default, the App Starts dashboard displays metrics for the two releases with the highest screen counts for the time range you've selected. To choose a different set of releases to compare, use the "release selector" at the top of the dashboard. To change the app start type (cold or warm), use the "App Start" selector at the top of the dashboard.

The charts display the following metrics (using cold starts as an example):

  • Average Cold Start
    • The overall time it takes your application to start, compared by release.
  • Cold Start Device Distribution
    • The average cold start time grouped by device class (high, medium, low, or unknown).

Reasons Why You Might Not Be Seeing Any Data:

  • You don't have any transactions with op ui.load
  • Your SDKs don't meet the minimum SDK requirements

The table at the bottom shows spans that have changed from one release to the next and allows you to filter for specific span operations and device classes. Being able to narrow down to specific event samples helps debug slow starts.

Clicking the "By Event" toggle in the top right corner of this table will show you events split by release and you'll be able to see overall changes in start times between the two releases you've selected.

The following table describes the span operations that are surfaced in the spans table:

PlatformSpan Operations
Common
  • file.write
  • ui.load
  • http.client
  • db
  • db.sql.query
  • db.sql.transaction
iOS
  • app.start.cold
  • app.start.warm
Android
  • activity.load
  • application.load
  • contentprovider.load
  • process.load

Both Android and iOS distinguish between cold and warm starts, but the exact definitions and measurement approaches differ between platforms:

AndroidiOS
Cold startProcess doesn't exist; app starts from scratchFirst launch ever, after a reboot or update
Warm startAny start that isn't cold — includes background returns, activity recreation, and late launchesAnytime except 3 cases above
Measurement startProcess fork time (API 24+), with fallback to ContentProvider creationProcess creation
Measurement endFirst frame drawn
  • didFinishLaunching notification (Standalone App Starts)
  • First frame drawn (Legacy App Starts)
Recommended thresholdCold < 5s, Warm < 2s (Google Play Console)< 400ms for first frame (Apple)
PrewarmingN/AiOS 15+ may prewarm processes, with standalone app starts, check app.vitals.start.prewarmed value and for legacy app starts check the reported start types (cold.prewarmed, warm.prewarmed).

For full details, see the Android app start and iOS app start SDK documentation.

A headless app start occurs when your Android application's process is created without launching a visible Activity. This can happen when the app is started by a broadcast receiver, a content provider, or a background service — the process initializes but no UI is displayed to the user.

By default, Sentry only tracks app starts that result in a foreground Activity being displayed. With headless app start tracking, Sentry can also capture these non-UI process launches, giving you visibility into background initialization performance.

Headless app start tracking requires standalone app start tracing to be enabled in your Android SDK configuration:

AndroidManifest.xml
Copied
<application>
    <meta-data
    android:name="io.sentry.standalone-app-start-tracing.enable"
    android:value="true"
  />
</application>

Clicking on a span description opens up the Traces page, where you can see sampled spans.

In the table, you'll see a list of sampled spans. Click into one to get a waterfall view of the span.

Was this helpful?
Help improve this content
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").