diff --git a/CHANGELOG.md b/CHANGELOG.md index c48d4551e1..82d61072c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## Unreleased + +- Add support for setting sentry-native handler_strategy ([#3671](https://github.com/getsentry/sentry-java/pull/3671)) + +### Dependencies + +- Bump Native SDK from v0.7.8 to v0.7.16 ([#3671](https://github.com/getsentry/sentry-java/pull/3671)) + - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0716) + - [diff](https://github.com/getsentry/sentry-native/compare/0.7.8...0.7.16) + ## 7.18.1 ### Fixes diff --git a/sentry-android-core/api/sentry-android-core.api b/sentry-android-core/api/sentry-android-core.api index f525e056f6..0215008608 100644 --- a/sentry-android-core/api/sentry-android-core.api +++ b/sentry-android-core/api/sentry-android-core.api @@ -220,6 +220,14 @@ public final class io/sentry/android/core/LoadClass { public fun loadClass (Ljava/lang/String;Lio/sentry/ILogger;)Ljava/lang/Class; } +public final class io/sentry/android/core/NdkHandlerStrategy : java/lang/Enum { + public static final field SENTRY_HANDLER_STRATEGY_CHAIN_AT_START Lio/sentry/android/core/NdkHandlerStrategy; + public static final field SENTRY_HANDLER_STRATEGY_DEFAULT Lio/sentry/android/core/NdkHandlerStrategy; + public fun getValue ()I + public static fun valueOf (Ljava/lang/String;)Lio/sentry/android/core/NdkHandlerStrategy; + public static fun values ()[Lio/sentry/android/core/NdkHandlerStrategy; +} + public final class io/sentry/android/core/NdkIntegration : io/sentry/Integration, java/io/Closeable { public static final field SENTRY_NDK_CLASS_NAME Ljava/lang/String; public fun (Ljava/lang/Class;)V @@ -266,6 +274,7 @@ public final class io/sentry/android/core/SentryAndroidOptions : io/sentry/Sentr public fun getDebugImagesLoader ()Lio/sentry/android/core/IDebugImagesLoader; public fun getFrameMetricsCollector ()Lio/sentry/android/core/internal/util/SentryFrameMetricsCollector; public fun getNativeSdkName ()Ljava/lang/String; + public fun getNdkHandlerStrategy ()I public fun getProfilingTracesIntervalMillis ()I public fun getStartupCrashDurationThresholdMillis ()J public fun isAnrEnabled ()Z @@ -310,6 +319,7 @@ public final class io/sentry/android/core/SentryAndroidOptions : io/sentry/Sentr public fun setEnableScopeSync (Z)V public fun setEnableSystemEventBreadcrumbs (Z)V public fun setFrameMetricsCollector (Lio/sentry/android/core/internal/util/SentryFrameMetricsCollector;)V + public fun setNativeHandlerStrategy (Lio/sentry/android/core/NdkHandlerStrategy;)V public fun setNativeSdkName (Ljava/lang/String;)V public fun setProfilingTracesIntervalMillis (I)V public fun setReportHistoricalAnrs (Z)V diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/NdkHandlerStrategy.java b/sentry-android-core/src/main/java/io/sentry/android/core/NdkHandlerStrategy.java new file mode 100644 index 0000000000..74b446658d --- /dev/null +++ b/sentry-android-core/src/main/java/io/sentry/android/core/NdkHandlerStrategy.java @@ -0,0 +1,19 @@ +package io.sentry.android.core; + +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public enum NdkHandlerStrategy { + SENTRY_HANDLER_STRATEGY_DEFAULT(0), + SENTRY_HANDLER_STRATEGY_CHAIN_AT_START(1); + + private final int value; + + NdkHandlerStrategy(final int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java index 449834574a..6ac168fd8f 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java @@ -157,6 +157,9 @@ public final class SentryAndroidOptions extends SentryOptions { /** Turns NDK on or off. Default is enabled. */ private boolean enableNdk = true; + @NotNull + private NdkHandlerStrategy ndkHandlerStrategy = + NdkHandlerStrategy.SENTRY_HANDLER_STRATEGY_DEFAULT; /** * Enable the Java to NDK Scope sync. The default value for sentry-java is disabled and enabled * for sentry-android. @@ -472,6 +475,16 @@ public void setNativeSdkName(final @Nullable String nativeSdkName) { this.nativeSdkName = nativeSdkName; } + @ApiStatus.Internal + public void setNativeHandlerStrategy(final @NotNull NdkHandlerStrategy ndkHandlerStrategy) { + this.ndkHandlerStrategy = ndkHandlerStrategy; + } + + @ApiStatus.Internal + public int getNdkHandlerStrategy() { + return ndkHandlerStrategy.getValue(); + } + /** * Returns the sdk name for the sentry native ndk module. * diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidOptionsTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidOptionsTest.kt index 5ed5de1c04..aa266d5c7a 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidOptionsTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidOptionsTest.kt @@ -167,6 +167,19 @@ class SentryAndroidOptionsTest { assertTrue(SentryAndroidOptions().isEnableScopeSync) } + @Test + fun `ndk handler option defaults to default strategy`() { + val sentryOptions = SentryAndroidOptions() + assertEquals(NdkHandlerStrategy.SENTRY_HANDLER_STRATEGY_DEFAULT.value, sentryOptions.ndkHandlerStrategy) + } + + @Test + fun `ndk handler strategy option can be changed`() { + val sentryOptions = SentryAndroidOptions() + sentryOptions.setNativeHandlerStrategy(NdkHandlerStrategy.SENTRY_HANDLER_STRATEGY_CHAIN_AT_START) + assertEquals(NdkHandlerStrategy.SENTRY_HANDLER_STRATEGY_CHAIN_AT_START.value, sentryOptions.ndkHandlerStrategy) + } + private class CustomDebugImagesLoader : IDebugImagesLoader { override fun loadDebugImages(): List? = null override fun clearDebugImages() {} diff --git a/sentry-android-ndk/sentry-native b/sentry-android-ndk/sentry-native index f44ab0be7c..39445fe251 160000 --- a/sentry-android-ndk/sentry-native +++ b/sentry-android-ndk/sentry-native @@ -1 +1 @@ -Subproject commit f44ab0be7c9d46bbaf24536fb15e7d55b98d6716 +Subproject commit 39445fe2512a83e6e8f8e031a64e0c5d90457263 diff --git a/sentry-android-ndk/src/main/jni/sentry.c b/sentry-android-ndk/src/main/jni/sentry.c index d62ef56123..b92e849523 100644 --- a/sentry-android-ndk/src/main/jni/sentry.c +++ b/sentry-android-ndk/src/main/jni/sentry.c @@ -255,6 +255,8 @@ Java_io_sentry_android_ndk_SentryNdk_initSentryNative( jmethodID native_sdk_name_mid = (*env)->GetMethodID(env, options_cls, "getNativeSdkName", "()Ljava/lang/String;"); + jmethodID handler_strategy_mid = (*env)->GetMethodID(env, options_cls, "getNdkHandlerStrategy", "()I"); + (*env)->DeleteLocalRef(env, options_cls); char *outbox_path = NULL; @@ -337,6 +339,9 @@ Java_io_sentry_android_ndk_SentryNdk_initSentryNative( sentry_free(native_sdk_name_str); } + jint handler_strategy = (jint) (*env)->CallIntMethod(env, sentry_sdk_options, handler_strategy_mid); + sentry_options_set_handler_strategy(options, handler_strategy); + sentry_init(options); return;