diff --git a/CHANGELOG.md b/CHANGELOG.md index 14f9c84fff..9b77cfc096 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Fixes + +- Fix SDK init crash if initialized from background thread while an activiy is resumed ([#4449](https://github.com/getsentry/sentry-java/pull/4449)) + ### Dependencies - Bump Gradle from v8.14 to v8.14.1 ([#4437](https://github.com/getsentry/sentry-java/pull/4437)) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryWindowCallback.java b/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryWindowCallback.java index 473a59b5b0..edb9c9f9da 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryWindowCallback.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryWindowCallback.java @@ -1,6 +1,8 @@ package io.sentry.android.core.internal.gestures; import android.content.Context; +import android.os.Handler; +import android.os.Looper; import android.view.MotionEvent; import android.view.Window; import androidx.core.view.GestureDetectorCompat; @@ -27,7 +29,7 @@ public SentryWindowCallback( final @Nullable SentryOptions options) { this( delegate, - new GestureDetectorCompat(context, gestureListener), + new GestureDetectorCompat(context, gestureListener, new Handler(Looper.getMainLooper())), gestureListener, options, new MotionEventObtainer() {}); diff --git a/sentry/src/main/java/io/sentry/Sentry.java b/sentry/src/main/java/io/sentry/Sentry.java index 5345178f3e..aa6d71e447 100644 --- a/sentry/src/main/java/io/sentry/Sentry.java +++ b/sentry/src/main/java/io/sentry/Sentry.java @@ -345,7 +345,16 @@ private static void init(final @NotNull SentryOptions options, final boolean glo // and Scopes was still NoOp. // Registering integrations here make sure that Scopes is already created. for (final Integration integration : options.getIntegrations()) { - integration.register(ScopesAdapter.getInstance(), options); + try { + integration.register(ScopesAdapter.getInstance(), options); + } catch (Throwable t) { + options + .getLogger() + .log( + SentryLevel.WARNING, + "Failed to register the integration " + integration.getClass().getName(), + t); + } } notifyOptionsObservers(options); diff --git a/sentry/src/test/java/io/sentry/SentryTest.kt b/sentry/src/test/java/io/sentry/SentryTest.kt index 9384d17167..311afce803 100644 --- a/sentry/src/test/java/io/sentry/SentryTest.kt +++ b/sentry/src/test/java/io/sentry/SentryTest.kt @@ -125,6 +125,27 @@ class SentryTest { verify(integration2).close() } + @Test + fun `if a single integration crashes, the SDK and other integrations are still initialized`() { + val goodIntegrationInitialized = AtomicBoolean(false) + val goodIntegration = Integration { scopes, options -> + // no-op + goodIntegrationInitialized.set(true) + } + + val badIntegration = Integration { scopes, options -> throw IllegalStateException("bad integration") } + + Sentry.init { + it.dsn = dsn + it.integrations.clear() + it.integrations.add(badIntegration) + it.integrations.add(goodIntegration) + } + + assertTrue(Sentry.isEnabled()) + assertTrue(goodIntegrationInitialized.get()) + } + interface CloseableIntegration : Integration, Closeable @Test
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: