Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

- Reduce excessive CPU usage when serializing breadcrumbs to disk for ANRs ([#4181](https://github.com/getsentry/sentry-java/pull/4181))
- Ensure app start type is set, even when ActivityLifecycleIntegration is not running ([#4250](https://github.com/getsentry/sentry-java/pull/4250))
- Do not override user-defined `SentryOptions` ([#4262](https://github.com/getsentry/sentry-java/pull/4262))

### Behavioral Changes

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import io.sentry.ISentryLifecycleToken;
import io.sentry.ITransactionProfiler;
import io.sentry.NoOpConnectionStatusProvider;
import io.sentry.NoOpTransactionPerformanceCollector;
import io.sentry.ScopeType;
import io.sentry.SendFireAndForgetEnvelopeSender;
import io.sentry.SendFireAndForgetOutboxSender;
Expand All @@ -32,12 +33,16 @@
import io.sentry.cache.PersistingScopeObserver;
import io.sentry.compose.gestures.ComposeGestureTargetLocator;
import io.sentry.compose.viewhierarchy.ComposeViewHierarchyExporter;
import io.sentry.internal.debugmeta.NoOpDebugMetaLoader;
import io.sentry.internal.gestures.GestureTargetLocator;
import io.sentry.internal.modules.NoOpModulesLoader;
import io.sentry.internal.viewhierarchy.ViewHierarchyExporter;
import io.sentry.transport.CurrentDateProvider;
import io.sentry.transport.NoOpEnvelopeCache;
import io.sentry.transport.NoOpTransportGate;
import io.sentry.util.LazyEvaluator;
import io.sentry.util.Objects;
import io.sentry.util.thread.NoOpThreadChecker;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -160,7 +165,9 @@ static void initializeIntegrationsAndProcessors(
options.addEventProcessor(new ScreenshotEventProcessor(options, buildInfoProvider));
options.addEventProcessor(new ViewHierarchyEventProcessor(options));
options.addEventProcessor(new AnrV2EventProcessor(context, options, buildInfoProvider));
options.setTransportGate(new AndroidTransportGate(options));
if (options.getTransportGate() instanceof NoOpTransportGate) {
options.setTransportGate(new AndroidTransportGate(options));
}

// Check if the profiler was already instantiated in the app start.
// We use the Android profiler, that uses a global start/stop api, so we need to preserve the
Expand All @@ -182,8 +189,12 @@ static void initializeIntegrationsAndProcessors(
"options.getFrameMetricsCollector is required")));
}
}
options.setModulesLoader(new AssetsModulesLoader(context, options.getLogger()));
options.setDebugMetaLoader(new AssetsDebugMetaLoader(context, options.getLogger()));
if (options.getModulesLoader() instanceof NoOpModulesLoader) {
options.setModulesLoader(new AssetsModulesLoader(context, options.getLogger()));
}
if (options.getDebugMetaLoader() instanceof NoOpDebugMetaLoader) {
options.setDebugMetaLoader(new AssetsDebugMetaLoader(context, options.getLogger()));
}

final boolean isAndroidXScrollViewAvailable =
loadClass.isClassAvailable("androidx.core.view.ScrollingView", options);
Expand Down Expand Up @@ -215,7 +226,9 @@ static void initializeIntegrationsAndProcessors(
options.setViewHierarchyExporters(viewHierarchyExporters);
}

options.setThreadChecker(AndroidThreadChecker.getInstance());
if (options.getThreadChecker() instanceof NoOpThreadChecker) {
options.setThreadChecker(AndroidThreadChecker.getInstance());
}
if (options.getPerformanceCollectors().isEmpty()) {
options.addPerformanceCollector(new AndroidMemoryCollector());
options.addPerformanceCollector(new AndroidCpuCollector(options.getLogger()));
Expand All @@ -229,7 +242,11 @@ static void initializeIntegrationsAndProcessors(
"options.getFrameMetricsCollector is required")));
}
}
options.setTransactionPerformanceCollector(new DefaultTransactionPerformanceCollector(options));
if (options.getTransactionPerformanceCollector()
instanceof NoOpTransactionPerformanceCollector) {
options.setTransactionPerformanceCollector(
new DefaultTransactionPerformanceCollector(options));
}
}

static void installDefaultIntegrations(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,29 @@ import android.os.Bundle
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.sentry.DefaultTransactionPerformanceCollector
import io.sentry.IConnectionStatusProvider
import io.sentry.ILogger
import io.sentry.MainEventProcessor
import io.sentry.SentryOptions
import io.sentry.TransactionPerformanceCollector
import io.sentry.android.core.cache.AndroidEnvelopeCache
import io.sentry.android.core.internal.debugmeta.AssetsDebugMetaLoader
import io.sentry.android.core.internal.gestures.AndroidViewGestureTargetLocator
import io.sentry.android.core.internal.modules.AssetsModulesLoader
import io.sentry.android.core.internal.util.AndroidConnectionStatusProvider
import io.sentry.android.core.internal.util.AndroidThreadChecker
import io.sentry.android.fragment.FragmentLifecycleIntegration
import io.sentry.android.replay.ReplayIntegration
import io.sentry.android.timber.SentryTimberIntegration
import io.sentry.cache.IEnvelopeCache
import io.sentry.cache.PersistingOptionsObserver
import io.sentry.cache.PersistingScopeObserver
import io.sentry.compose.gestures.ComposeGestureTargetLocator
import io.sentry.internal.debugmeta.IDebugMetaLoader
import io.sentry.internal.modules.IModulesLoader
import io.sentry.test.ImmediateExecutorService
import io.sentry.transport.ITransportGate
import io.sentry.util.thread.IThreadChecker
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.eq
Expand Down Expand Up @@ -732,4 +741,25 @@ class AndroidOptionsInitializerTest {
fixture.sentryOptions.findPersistingScopeObserver()?.setTags(mapOf("key" to "value"))
assertFalse(File(AndroidOptionsInitializer.getCacheDir(fixture.context), PersistingScopeObserver.SCOPE_CACHE).exists())
}

@Test
fun `user options have precedence over defaults`() {
fixture.initSut(configureOptions = {
setTransportGate(mock<ITransportGate>())
setEnvelopeDiskCache(mock<IEnvelopeCache>())
connectionStatusProvider = mock<IConnectionStatusProvider>()
setModulesLoader(mock<IModulesLoader>())
setDebugMetaLoader(mock<IDebugMetaLoader>())
threadChecker = mock<IThreadChecker>()
transactionPerformanceCollector = mock<TransactionPerformanceCollector>()
})

assertFalse { fixture.sentryOptions.transportGate is AndroidTransportGate }
assertFalse { fixture.sentryOptions.envelopeDiskCache is AndroidEnvelopeCache }
assertFalse { fixture.sentryOptions.connectionStatusProvider is AndroidConnectionStatusProvider }
assertFalse { fixture.sentryOptions.modulesLoader is AssetsModulesLoader }
assertFalse { fixture.sentryOptions.debugMetaLoader is AssetsDebugMetaLoader }
assertFalse { fixture.sentryOptions.threadChecker is AndroidThreadChecker }
assertFalse { fixture.sentryOptions.transactionPerformanceCollector is DefaultTransactionPerformanceCollector }
}
}
Loading