diff --git a/CHANGELOG.md b/CHANGELOG.md index d4b04fdc1..166c5e401 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Features + +- Added `options.AndroidNativeTombstoneEnabled` (default `false`) and `options.AndroidReportHistoricalTombstones` (default `false`) to enable reporting of native crashes captured by Android's `ApplicationExitInfo` API as Tombstones ([#2749](https://github.com/getsentry/sentry-unity/pull/2749)) + ### Fixes - Fixed an issue with the updated dependency resolution introduced in `4.6.0` where usage of the `Metrics` API would cause Unity to error with `The type 'ReadOnlySpan<>' is defined in an assembly that is not referenced`. ([#2754](https://github.com/getsentry/sentry-unity/pull/2754)) diff --git a/src/Sentry.Unity.Android/SentryJava.cs b/src/Sentry.Unity.Android/SentryJava.cs index 232b465a8..2f172083f 100644 --- a/src/Sentry.Unity.Android/SentryJava.cs +++ b/src/Sentry.Unity.Android/SentryJava.cs @@ -145,6 +145,9 @@ public void Init(SentryUnityOptions options) androidOptions.Call("setReportHistoricalAnrs", options.AndroidReportHistoricalAnrs); androidOptions.Call("setAttachAnrThreadDump", options.AndroidAttachAnrThreadDump); + androidOptions.Call("setTombstoneEnabled", options.AndroidTombstoneEnabled); + androidOptions.Call("setReportHistoricalTombstones", options.AndroidReportHistoricalTombstones); + using (var logsOptions = androidOptions.Call("getLogs")) { logsOptions.Call("setEnabled", options.EnableLogs); diff --git a/src/Sentry.Unity.Editor/Android/AndroidManifestConfiguration.cs b/src/Sentry.Unity.Editor/Android/AndroidManifestConfiguration.cs index 8ab05ac8c..6ac76943d 100644 --- a/src/Sentry.Unity.Editor/Android/AndroidManifestConfiguration.cs +++ b/src/Sentry.Unity.Editor/Android/AndroidManifestConfiguration.cs @@ -221,6 +221,8 @@ internal void ModifyManifest(string basePath) androidManifest.SetAnr(_options.AndroidNativeAnrEnabled); androidManifest.SetPersistentScopeObserver(_options.AndroidNativeAnrEnabled); androidManifest.SetAttachAnrThreadDump(_options.AndroidAttachAnrThreadDump); + androidManifest.SetTombstone(_options.AndroidTombstoneEnabled); + androidManifest.SetTombstoneReportHistorical(_options.AndroidReportHistoricalTombstones); // Disable user interaction tracking to prevent conflicts with VR platforms (e.g., Oculus InputHooks) androidManifest.SetEnableUserInteractionBreadcrumbs(false); androidManifest.SetEnableUserInteractionTracing(false); @@ -499,6 +501,12 @@ internal void SetPersistentScopeObserver(bool enableScopePersistence) internal void SetAttachAnrThreadDump(bool attachAnrThreadDump) => SetMetaData($"{SentryPrefix}.anr.attach-thread-dumps", attachAnrThreadDump.ToString()); + internal void SetTombstone(bool enableTombstone) + => SetMetaData($"{SentryPrefix}.tombstone.enable", enableTombstone.ToString()); + + internal void SetTombstoneReportHistorical(bool enableTombstoneReportHistorical) + => SetMetaData($"{SentryPrefix}.tombstone.report-historical", enableTombstoneReportHistorical.ToString()); + internal void SetNdkEnabled(bool enableNdk) => SetMetaData($"{SentryPrefix}.ndk.enable", enableNdk.ToString()); diff --git a/src/Sentry.Unity/SentryUnityOptions.cs b/src/Sentry.Unity/SentryUnityOptions.cs index 50128d4f2..9c7fd9166 100644 --- a/src/Sentry.Unity/SentryUnityOptions.cs +++ b/src/Sentry.Unity/SentryUnityOptions.cs @@ -257,6 +257,19 @@ public sealed class SentryUnityOptions : SentryOptions /// public bool AndroidAttachAnrThreadDump { get; set; } = false; + /// + /// Enables reporting of native crashes captured by Android's ApplicationExitInfo API as Tombstones + /// (REASON_CRASH_NATIVE) through the sentry-java SDK. + /// + public bool AndroidTombstoneEnabled { get; set; } = false; + + /// + /// When is enabled, controls whether sentry-java reports historical + /// Tombstones recorded by the OS (ApplicationExitInfo) from prior runs. Has no effect when + /// is false. + /// + public bool AndroidReportHistoricalTombstones { get; set; } = false; + /// /// Whether the SDK should add the NDK integration for Android /// diff --git a/test/Sentry.Unity.Editor.Tests/Android/AndroidManifestConfigurationTests.cs b/test/Sentry.Unity.Editor.Tests/Android/AndroidManifestConfigurationTests.cs index 7985af700..3bc73051e 100644 --- a/test/Sentry.Unity.Editor.Tests/Android/AndroidManifestConfigurationTests.cs +++ b/test/Sentry.Unity.Editor.Tests/Android/AndroidManifestConfigurationTests.cs @@ -185,6 +185,50 @@ public void ModifyManifest_AndroidAttachAnrThreadDump_FlowsThroughToManifest() StringAssert.Contains("", manifest); } + [Test] + public void ModifyManifest_AndroidTombstoneEnabledTrue_WritesCorrectMetaData() + { + _fixture.SentryUnityOptions!.AndroidTombstoneEnabled = true; + var sut = _fixture.GetSut(); + + var manifest = WithAndroidManifest(basePath => sut.ModifyManifest(basePath)); + + StringAssert.Contains("", manifest); + } + + [Test] + public void ModifyManifest_AndroidTombstoneEnabledFalse_WritesCorrectMetaData() + { + _fixture.SentryUnityOptions!.AndroidTombstoneEnabled = false; + var sut = _fixture.GetSut(); + + var manifest = WithAndroidManifest(basePath => sut.ModifyManifest(basePath)); + + StringAssert.Contains("", manifest); + } + + [Test] + public void ModifyManifest_AndroidTombstoneReportHistoricalTrue_WritesCorrectMetaData() + { + _fixture.SentryUnityOptions!.AndroidReportHistoricalTombstones = true; + var sut = _fixture.GetSut(); + + var manifest = WithAndroidManifest(basePath => sut.ModifyManifest(basePath)); + + StringAssert.Contains("", manifest); + } + + [Test] + public void ModifyManifest_AndroidTombstoneReportHistoricalFalse_WritesCorrectMetaData() + { + _fixture.SentryUnityOptions!.AndroidReportHistoricalTombstones = false; + var sut = _fixture.GetSut(); + + var manifest = WithAndroidManifest(basePath => sut.ModifyManifest(basePath)); + + StringAssert.Contains("", manifest); + } + [Test] public void ModifyManifest_ManifestHasDsn() {