Skip to content

Commit 788d91a

Browse files
committed
feat(profiling): Skip legacy app-start profiling when useProfilingManager is set
When useProfilingManager is true, SentryPerformanceProvider now skips creating the legacy Debug-based profiler at app start. This ensures AndroidOptionsInitializer creates a Perfetto profiler instead, without needing special handover logic between the two profiling engines. The useProfilingManager flag is persisted in SentryAppStartProfilingOptions (written at end of Sentry.init(), read on next app launch) so the decision is available before SDK initialization. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> squash into options commit
1 parent 86e585c commit 788d91a

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -497,8 +497,7 @@ static void applyMetadata(
497497
metadata, logger, ENABLE_APP_START_PROFILING, options.isEnableAppStartProfiling()));
498498

499499
options.setUseProfilingManager(
500-
readBool(
501-
metadata, logger, USE_PROFILING_MANAGER, options.isUseProfilingManager()));
500+
readBool(metadata, logger, USE_PROFILING_MANAGER, options.isUseProfilingManager()));
502501

503502
options.setEnableScopePersistence(
504503
readBool(

sentry-android-core/src/main/java/io/sentry/android/core/SentryPerformanceProvider.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,14 @@ private void launchAppStartProfiler(final @NotNull AppStartMetrics appStartMetri
129129
return;
130130
}
131131

132+
if (profilingOptions.isUseProfilingManager()) {
133+
logger.log(
134+
SentryLevel.DEBUG,
135+
"useProfilingManager is enabled. Skipping legacy app-start profiling — "
136+
+ "ProfilingManager will be initialized after Sentry.init().");
137+
return;
138+
}
139+
132140
if (profilingOptions.isContinuousProfilingEnabled()
133141
&& profilingOptions.isStartProfilerOnAppStart()) {
134142
createAndStartContinuousProfiler(context, profilingOptions, appStartMetrics);
@@ -163,7 +171,7 @@ private void createAndStartContinuousProfiler(
163171

164172
final @NotNull SentryExecutorService startupExecutorService = new SentryExecutorService();
165173
final @NotNull IContinuousProfiler appStartContinuousProfiler =
166-
new AndroidContinuousProfiler(
174+
AndroidContinuousProfiler.createLegacy(
167175
buildInfoProvider,
168176
new SentryFrameMetricsCollector(
169177
context.getApplicationContext(), logger, buildInfoProvider),

sentry/src/main/java/io/sentry/SentryAppStartProfilingOptions.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public final class SentryAppStartProfilingOptions implements JsonUnknown, JsonSe
2424
boolean continuousProfileSampled;
2525
boolean isEnableAppStartProfiling;
2626
boolean isStartProfilerOnAppStart;
27+
boolean useProfilingManager;
2728
@NotNull ProfileLifecycle profileLifecycle;
2829

2930
private @Nullable Map<String, Object> unknown;
@@ -42,6 +43,7 @@ public SentryAppStartProfilingOptions() {
4243
profilingTracesHz = 0;
4344
isEnableAppStartProfiling = true;
4445
isStartProfilerOnAppStart = false;
46+
useProfilingManager = false;
4547
}
4648

4749
SentryAppStartProfilingOptions(
@@ -62,6 +64,7 @@ public SentryAppStartProfilingOptions() {
6264
profilingTracesHz = options.getProfilingTracesHz();
6365
isEnableAppStartProfiling = options.isEnableAppStartProfiling();
6466
isStartProfilerOnAppStart = options.isStartProfilerOnAppStart();
67+
useProfilingManager = options.isUseProfilingManager();
6568
}
6669

6770
public void setProfileSampled(final boolean profileSampled) {
@@ -160,6 +163,14 @@ public boolean isStartProfilerOnAppStart() {
160163
return isStartProfilerOnAppStart;
161164
}
162165

166+
public void setUseProfilingManager(final boolean useProfilingManager) {
167+
this.useProfilingManager = useProfilingManager;
168+
}
169+
170+
public boolean isUseProfilingManager() {
171+
return useProfilingManager;
172+
}
173+
163174
// JsonSerializable
164175

165176
public static final class JsonKeys {
@@ -175,6 +186,7 @@ public static final class JsonKeys {
175186
public static final String PROFILING_TRACES_HZ = "profiling_traces_hz";
176187
public static final String IS_ENABLE_APP_START_PROFILING = "is_enable_app_start_profiling";
177188
public static final String IS_START_PROFILER_ON_APP_START = "is_start_profiler_on_app_start";
189+
public static final String USE_PROFILING_MANAGER = "use_profiling_manager";
178190
}
179191

180192
@Override
@@ -195,6 +207,7 @@ public void serialize(final @NotNull ObjectWriter writer, final @NotNull ILogger
195207
writer.name(JsonKeys.PROFILING_TRACES_HZ).value(logger, profilingTracesHz);
196208
writer.name(JsonKeys.IS_ENABLE_APP_START_PROFILING).value(logger, isEnableAppStartProfiling);
197209
writer.name(JsonKeys.IS_START_PROFILER_ON_APP_START).value(logger, isStartProfilerOnAppStart);
210+
writer.name(JsonKeys.USE_PROFILING_MANAGER).value(logger, useProfilingManager);
198211

199212
if (unknown != null) {
200213
for (String key : unknown.keySet()) {
@@ -308,6 +321,12 @@ public static final class Deserializer
308321
options.isStartProfilerOnAppStart = isStartProfilerOnAppStart;
309322
}
310323
break;
324+
case JsonKeys.USE_PROFILING_MANAGER:
325+
@Nullable Boolean useProfilingManager = reader.nextBooleanOrNull();
326+
if (useProfilingManager != null) {
327+
options.useProfilingManager = useProfilingManager;
328+
}
329+
break;
311330
default:
312331
if (unknown == null) {
313332
unknown = new ConcurrentHashMap<>();

0 commit comments

Comments
 (0)