From c4f401e109194a9eb4d8154a2dcd1e49b141cbe1 Mon Sep 17 00:00:00 2001 From: GitHub Date: Thu, 16 Apr 2026 14:15:02 +0000 Subject: [PATCH 1/5] chore: update scripts/update-java.ps1 to 8.39.0 --- src/Sentry.Bindings.Android/Sentry.Bindings.Android.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Sentry.Bindings.Android/Sentry.Bindings.Android.csproj b/src/Sentry.Bindings.Android/Sentry.Bindings.Android.csproj index 282a9a90d3..3bdcaf54f2 100644 --- a/src/Sentry.Bindings.Android/Sentry.Bindings.Android.csproj +++ b/src/Sentry.Bindings.Android/Sentry.Bindings.Android.csproj @@ -1,7 +1,7 @@ $(LatestAndroidTfm);$(PreviousAndroidTfm) - 8.38.0 + 8.39.0 $(BaseIntermediateOutputPath)sdks\$(TargetFramework)\Sentry\Android\$(SentryAndroidSdkVersion)\ From 12cb11f8f893407ae56be6bf086b250a22c166ae Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Wed, 18 Mar 2026 10:11:15 +0100 Subject: [PATCH 2/5] fix(android): preload NDK integration for CoreCLR Enable the io.sentry.ndk.preload metadata so that SentryNdkPreloadProvider installs sentry-native's signal handlers before .NET/CoreCLR. This ensures the correct handler chain order (.NET -> sentry-native -> debuggerd) where .NET handles managed exceptions first, and native crashes chain to sentry-native. Co-Authored-By: Claude Opus 4.6 (1M context) --- integration-test/Directory.Build.targets | 4 ++++ integration-test/android.Tests.ps1 | 12 ++++++++---- src/Sentry/Platforms/Android/SentrySdk.cs | 8 ++++++++ src/Sentry/buildTransitive/Sentry.props | 1 + src/Sentry/buildTransitive/Sentry.targets | 16 ++++++++++++++++ 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/integration-test/Directory.Build.targets b/integration-test/Directory.Build.targets index 09c9320b2a..79b6564725 100644 --- a/integration-test/Directory.Build.targets +++ b/integration-test/Directory.Build.targets @@ -1,3 +1,7 @@ + + + + diff --git a/integration-test/android.Tests.ps1 b/integration-test/android.Tests.ps1 index 60f16293d3..46df6a6a21 100644 --- a/integration-test/android.Tests.ps1 +++ b/integration-test/android.Tests.ps1 @@ -18,10 +18,12 @@ BeforeDiscovery { } $cases = @( - @{ configuration = 'Release' } - @{ configuration = 'Debug' } + @{ configuration = 'Release'; runtime = 'mono' } + @{ configuration = 'Release'; runtime = 'coreclr' } + @{ configuration = 'Debug'; runtime = 'mono' } + @{ configuration = 'Debug'; runtime = 'coreclr' } ) -Describe 'MAUI app (, )' -ForEach $cases -Skip:(-not $script:emulator) { +Describe 'MAUI app (, , )' -ForEach $cases -Skip:(-not $script:emulator) { BeforeAll { $tfm = "$dotnet_version-android$(GetAndroidTpv $dotnet_version)" @@ -38,10 +40,12 @@ Describe 'MAUI app (, )' -ForEach $cases -Skip:(- $rid = "android-$arch" Write-Host "::group::Build Sentry.Maui.Device.IntegrationTestApp.csproj" + $useMonoRuntime = if ($runtime -eq 'mono') { 'true' } else { 'false' } dotnet build Sentry.Maui.Device.IntegrationTestApp.csproj ` --configuration $configuration ` --framework $tfm ` - --runtime $rid + --runtime $rid ` + -p:UseMonoRuntime=$useMonoRuntime | ForEach-Object { Write-Host $_ } Write-Host '::endgroup::' $LASTEXITCODE | Should -Be 0 diff --git a/src/Sentry/Platforms/Android/SentrySdk.cs b/src/Sentry/Platforms/Android/SentrySdk.cs index 7b3971287f..db52174ece 100644 --- a/src/Sentry/Platforms/Android/SentrySdk.cs +++ b/src/Sentry/Platforms/Android/SentrySdk.cs @@ -66,6 +66,14 @@ private static void InitSentryAndroidSdk(SentryOptions options) o.ShutdownTimeoutMillis = (long)options.ShutdownTimeout.TotalMilliseconds; var signalHandlerStrategy = options.Native.ExperimentalOptions.SignalHandlerStrategy; + if (signalHandlerStrategy == SignalHandlerStrategy.ChainAtStart + && Type.GetType("Mono.RuntimeStructs") == null) + { + options.LogDebug( + "SignalHandlerStrategy.ChainAtStart is not compatible with .NET CoreCLR runtime. " + + "Falling back to SignalHandlerStrategy.Default."); + signalHandlerStrategy = SignalHandlerStrategy.Default; + } if (signalHandlerStrategy == SignalHandlerStrategy.ChainAtStart && System.Environment.Version is { Major: 10, Minor: 0, Build: < 4 }) { diff --git a/src/Sentry/buildTransitive/Sentry.props b/src/Sentry/buildTransitive/Sentry.props index c837e9af9e..1fa1e8ab69 100644 --- a/src/Sentry/buildTransitive/Sentry.props +++ b/src/Sentry/buildTransitive/Sentry.props @@ -5,5 +5,6 @@ <_SentryTargetFrameworkVersion>$([MSBuild]::GetTargetFrameworkVersion($(TargetFramework))) <_SentryIsNet8OrGreater>$([MSBuild]::VersionGreaterThanOrEquals($(_SentryTargetFrameworkVersion), 8.0)) <_SentryIsNet9OrGreater>$([MSBuild]::VersionGreaterThanOrEquals($(_SentryTargetFrameworkVersion), 9.0)) + <_SentryIsNet10OrGreater>$([MSBuild]::VersionGreaterThanOrEquals($(_SentryTargetFrameworkVersion), 10.0)) diff --git a/src/Sentry/buildTransitive/Sentry.targets b/src/Sentry/buildTransitive/Sentry.targets index 168036eec3..5351f6e93c 100644 --- a/src/Sentry/buildTransitive/Sentry.targets +++ b/src/Sentry/buildTransitive/Sentry.targets @@ -281,6 +281,22 @@ + + + + + <_Parameter1>io.sentry.ndk.preload + true + + + + From f67553d4831dd3e0bda8f6eaf776690eb091f8c6 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Thu, 16 Apr 2026 16:45:06 +0200 Subject: [PATCH 3/5] clarify CoreCLR signal handler fallback log Co-Authored-By: Claude Opus 4.6 (1M context) --- src/Sentry/Platforms/Android/SentrySdk.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Sentry/Platforms/Android/SentrySdk.cs b/src/Sentry/Platforms/Android/SentrySdk.cs index db52174ece..d47fe75664 100644 --- a/src/Sentry/Platforms/Android/SentrySdk.cs +++ b/src/Sentry/Platforms/Android/SentrySdk.cs @@ -69,9 +69,9 @@ private static void InitSentryAndroidSdk(SentryOptions options) if (signalHandlerStrategy == SignalHandlerStrategy.ChainAtStart && Type.GetType("Mono.RuntimeStructs") == null) { - options.LogDebug( - "SignalHandlerStrategy.ChainAtStart is not compatible with .NET CoreCLR runtime. " + - "Falling back to SignalHandlerStrategy.Default."); + options.LogInfo( + "Using SignalHandlerStrategy.Default on .NET CoreCLR. " + + "SignalHandlerStrategy.ChainAtStart is only required on the Mono runtime."); signalHandlerStrategy = SignalHandlerStrategy.Default; } if (signalHandlerStrategy == SignalHandlerStrategy.ChainAtStart From ca55eebb796e9ac63c12f8328fc36ae4afebb1ff Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Thu, 16 Apr 2026 16:49:19 +0200 Subject: [PATCH 4/5] scope NDK preload imports to the maui test app Keeps the source-tree Sentry.targets import out of the shared integration-test/Directory.Build.targets so non-Android integration tests (AOT, runtime, console) aren't affected. Co-Authored-By: Claude Opus 4.6 (1M context) --- integration-test/Directory.Build.targets | 4 ---- .../net9-maui/Sentry.Maui.Device.IntegrationTestApp.csproj | 6 ++++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/integration-test/Directory.Build.targets b/integration-test/Directory.Build.targets index 79b6564725..09c9320b2a 100644 --- a/integration-test/Directory.Build.targets +++ b/integration-test/Directory.Build.targets @@ -1,7 +1,3 @@ - - - - diff --git a/integration-test/net9-maui/Sentry.Maui.Device.IntegrationTestApp.csproj b/integration-test/net9-maui/Sentry.Maui.Device.IntegrationTestApp.csproj index b609446eba..6bb40698cf 100644 --- a/integration-test/net9-maui/Sentry.Maui.Device.IntegrationTestApp.csproj +++ b/integration-test/net9-maui/Sentry.Maui.Device.IntegrationTestApp.csproj @@ -64,4 +64,10 @@ + + + + + + From 2fe4c85fd46c37cbf4f02ae15b4f1425080ccbc0 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Thu, 16 Apr 2026 16:59:27 +0200 Subject: [PATCH 5/5] skip CoreCLR variants on .NET 9 Android CoreCLR support starts with .NET 10; running the coreclr cases on net9.0 would fail at build time. Co-Authored-By: Claude Opus 4.6 (1M context) --- integration-test/android.Tests.ps1 | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/integration-test/android.Tests.ps1 b/integration-test/android.Tests.ps1 index 46df6a6a21..d06783bde0 100644 --- a/integration-test/android.Tests.ps1 +++ b/integration-test/android.Tests.ps1 @@ -18,11 +18,16 @@ BeforeDiscovery { } $cases = @( - @{ configuration = 'Release'; runtime = 'mono' } - @{ configuration = 'Release'; runtime = 'coreclr' } - @{ configuration = 'Debug'; runtime = 'mono' } - @{ configuration = 'Debug'; runtime = 'coreclr' } + @{ configuration = 'Release'; runtime = 'mono' } + @{ configuration = 'Debug'; runtime = 'mono' } ) +# CoreCLR on Android requires .NET 10 or later +if ($dotnet_version -ne 'net9.0') { + $cases += @( + @{ configuration = 'Release'; runtime = 'coreclr' } + @{ configuration = 'Debug'; runtime = 'coreclr' } + ) +} Describe 'MAUI app (, , )' -ForEach $cases -Skip:(-not $script:emulator) { BeforeAll { $tfm = "$dotnet_version-android$(GetAndroidTpv $dotnet_version)"