Skip to content

Commit be261f6

Browse files
fix(android): Gate headless app start end time
Resolve the headless app start end timestamp only when standalone headless tracing is active. This avoids stopping legacy app start spans before a later foreground Activity can finish them. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent d1262c2 commit be261f6

2 files changed

Lines changed: 15 additions & 2 deletions

File tree

sentry-android-core/src/main/java/io/sentry/android/core/performance/AppStartMetrics.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -445,10 +445,9 @@ private void handleHeadlessAppStartIfNeededOnMain() {
445445
appStartContinuousProfiler = null;
446446
}
447447

448-
resolveHeadlessAppStartEndTime();
449-
450448
final @Nullable HeadlessAppStartListener listener = headlessAppStartListener;
451449
if (listener != null) {
450+
resolveHeadlessAppStartEndTime();
452451
listener.onHeadlessAppStart();
453452
}
454453
}

sentry-android-core/src/test/java/io/sentry/android/core/performance/AppStartMetricsTest.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ class AppStartMetricsTest {
265265
fun `resolveHeadlessAppStartEndTime uses applicationOnCreate stop when Gradle plugin instrumented`() {
266266
val metrics = AppStartMetrics.getInstance()
267267
metrics.appStartTimeSpan.setStartedAt(100)
268+
metrics.setHeadlessAppStartListener {}
268269
metrics.applicationOnCreateTimeSpan.apply {
269270
setStartedAt(120)
270271
setStoppedAt(200)
@@ -281,6 +282,7 @@ class AppStartMetricsTest {
281282
val metrics = AppStartMetrics.getInstance()
282283
metrics.setClassLoadedUptimeMs(200)
283284
metrics.appStartTimeSpan.setStartedAt(100)
285+
metrics.setHeadlessAppStartListener {}
284286

285287
metrics.registerLifecycleCallbacks(mock<Application>())
286288
waitForMainLooperIdle()
@@ -295,6 +297,7 @@ class AppStartMetricsTest {
295297
setStartedAt(100)
296298
setStoppedAt(150)
297299
}
300+
metrics.setHeadlessAppStartListener {}
298301
metrics.applicationOnCreateTimeSpan.apply {
299302
setStartedAt(120)
300303
setStoppedAt(200)
@@ -306,6 +309,17 @@ class AppStartMetricsTest {
306309
assertEquals(50, metrics.appStartTimeSpan.durationMs)
307310
}
308311

312+
@Test
313+
fun `headless app start without listener does not stop sdkInitTimeSpan`() {
314+
val metrics = AppStartMetrics.getInstance()
315+
metrics.sdkInitTimeSpan.setStartedAt(100)
316+
317+
metrics.registerLifecycleCallbacks(mock<Application>())
318+
waitForMainLooperIdle()
319+
320+
assertTrue(metrics.sdkInitTimeSpan.hasNotStopped())
321+
}
322+
309323
@Test
310324
fun `getAppStartTimeSpanForHeadless falls back to sdkInitTimeSpan when appStartSpan has not stopped`() {
311325
val metrics = AppStartMetrics.getInstance()

0 commit comments

Comments
 (0)