From 0ed09ae7bc7a022c21f4a8b3a4796a58325c5308 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 13 Apr 2026 20:39:15 +0000 Subject: [PATCH] Guard continuous profiling below API 35 Co-authored-by: Matthew Jay Williams <43jay@users.noreply.github.com> --- .../sentry/android/core/AndroidOptionsInitializer.java | 10 ++++++++++ .../sentry/android/core/SentryPerformanceProvider.java | 4 ++++ .../android/core/AndroidOptionsInitializerTest.kt | 9 +++++++++ .../android/core/SentryPerformanceProviderTest.kt | 10 ++++++++++ 4 files changed, 33 insertions(+) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java index 5f7fad69b5d..5ff52f5e8b1 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java @@ -326,6 +326,16 @@ private static void setupProfiler( if (appStartTransactionProfiler != null) { appStartTransactionProfiler.close(); } + if (buildInfoProvider.getSdkInfoVersion() < Build.VERSION_CODES.VANILLA_ICE_CREAM) { + options + .getLogger() + .log(SentryLevel.INFO, "Continuous profiling is disabled on API levels below 35."); + if (appStartContinuousProfiler != null) { + appStartContinuousProfiler.close(true); + } + options.setContinuousProfiler(NoOpContinuousProfiler.getInstance()); + return; + } if (appStartContinuousProfiler != null) { options.setContinuousProfiler(appStartContinuousProfiler); // If the profiler is running, we start the performance collector too, otherwise we'd miss diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SentryPerformanceProvider.java b/sentry-android-core/src/main/java/io/sentry/android/core/SentryPerformanceProvider.java index 7e43d626b34..a930a33ae42 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/SentryPerformanceProvider.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/SentryPerformanceProvider.java @@ -155,6 +155,10 @@ private void createAndStartContinuousProfiler( final @NotNull Context context, final @NotNull SentryAppStartProfilingOptions profilingOptions, final @NotNull AppStartMetrics appStartMetrics) { + if (buildInfoProvider.getSdkInfoVersion() < Build.VERSION_CODES.VANILLA_ICE_CREAM) { + logger.log(SentryLevel.INFO, "Continuous profiling is disabled on API levels below 35."); + return; + } if (!profilingOptions.isContinuousProfileSampled()) { logger.log(SentryLevel.DEBUG, "App start profiling was not sampled. It will not start."); diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt index be54bf7768b..416dae3fb12 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt @@ -497,6 +497,15 @@ class AndroidOptionsInitializerTest { assertNull(AppStartMetrics.getInstance().appStartContinuousProfiler) } + @Config(sdk = [Build.VERSION_CODES.UPSIDE_DOWN_CAKE]) + @Test + fun `init with continuous profiling on API below 35 sets no-op continuous profiler`() { + fixture.initSut(useRealContext = true) + + assertEquals(NoOpTransactionProfiler.getInstance(), fixture.sentryOptions.transactionProfiler) + assertEquals(NoOpContinuousProfiler.getInstance(), fixture.sentryOptions.continuousProfiler) + } + @Test fun `NdkIntegration will load SentryNdk class and add to the integration list`() { fixture.initSutWithClassLoader( diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/SentryPerformanceProviderTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/SentryPerformanceProviderTest.kt index 58dc56d1493..ee65be38b70 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/SentryPerformanceProviderTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/SentryPerformanceProviderTest.kt @@ -290,6 +290,16 @@ class SentryPerformanceProviderTest { assertNull(AppStartMetrics.getInstance().appStartContinuousProfiler) } + @Test + fun `when sdk is below api 35, continuous profiler is not started`() { + fixture.getSut(sdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { config -> + writeConfig(config, profilingEnabled = false, continuousProfilingEnabled = true) + } + assertNull(AppStartMetrics.getInstance().appStartContinuousProfiler) + verify(fixture.logger) + .log(eq(SentryLevel.INFO), eq("Continuous profiling is disabled on API levels below 35.")) + } + @Test fun `when provider is closed, continuous profiler is stopped`() { val provider = fixture.getSut { config -> writeConfig(config, profilingEnabled = false) }