Skip to content
Draft
Show file tree
Hide file tree
Changes from all 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
3 changes: 3 additions & 0 deletions src/Sentry.Unity.Android/SentryJava.cs
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,9 @@ public void Init(SentryUnityOptions options)
androidOptions.Call("setReportHistoricalAnrs", options.AndroidReportHistoricalAnrs);
androidOptions.Call("setAttachAnrThreadDump", options.AndroidAttachAnrThreadDump);

androidOptions.Call("setTombstoneEnabled", options.AndroidNativeTombstoneEnabled);
androidOptions.Call("setReportHistoricalTombstones", options.AndroidReportHistoricalTombstones);

using (var logsOptions = androidOptions.Call<AndroidJavaObject>("getLogs"))
{
logsOptions.Call("setEnabled", options.EnableLogs);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ internal void ModifyManifest(string basePath)
androidManifest.SetAnr(_options.AndroidNativeAnrEnabled);
androidManifest.SetPersistentScopeObserver(_options.AndroidNativeAnrEnabled);
androidManifest.SetAttachAnrThreadDump(_options.AndroidAttachAnrThreadDump);
androidManifest.SetTombstone(_options.AndroidNativeTombstoneEnabled);
// Disable user interaction tracking to prevent conflicts with VR platforms (e.g., Oculus InputHooks)
androidManifest.SetEnableUserInteractionBreadcrumbs(false);
androidManifest.SetEnableUserInteractionTracing(false);
Expand Down Expand Up @@ -499,6 +500,9 @@ 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 SetNdkEnabled(bool enableNdk)
=> SetMetaData($"{SentryPrefix}.ndk.enable", enableNdk.ToString());

Expand Down
17 changes: 17 additions & 0 deletions src/Sentry.Unity/SentryUnityOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,23 @@ public sealed class SentryUnityOptions : SentryOptions
/// </summary>
public bool AndroidAttachAnrThreadDump { get; set; } = false;

/// <summary>
/// Enables reporting of native crashes captured by Android's <c>ApplicationExitInfo</c> API as Tombstones
/// (<c>REASON_CRASH_NATIVE</c>) through the native (sentry-java) SDK.
/// </summary>
public bool AndroidNativeTombstoneEnabled { get; set; } = false;

/// <summary>
/// When <see cref="AndroidNativeTombstoneEnabled"/> is enabled, controls whether sentry-java reports historical
/// Tombstones recorded by the OS (<c>ApplicationExitInfo</c>) from prior runs. Has no effect when
/// <see cref="AndroidNativeTombstoneEnabled"/> is <c>false</c>.
/// </summary>
/// <remarks>
/// Runtime-only. There is no <c>AndroidManifest</c> meta-data tag for this option, so it is only
/// applied when <see cref="AndroidNativeInitializationType"/> is <see cref="NativeInitializationType.Runtime"/>.
/// </remarks>
public bool AndroidReportHistoricalTombstones { get; set; } = false;

/// <summary>
/// Whether the SDK should add the NDK integration for Android
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,28 @@ public void ModifyManifest_AndroidAttachAnrThreadDump_FlowsThroughToManifest()
StringAssert.Contains("<meta-data android:name=\"io.sentry.anr.attach-thread-dumps\" android:value=\"True\" />", manifest);
}

[Test]
public void ModifyManifest_AndroidNativeTombstoneEnabled_True_WritesTombstoneMetadataEnabled()
{
_fixture.SentryUnityOptions!.AndroidNativeTombstoneEnabled = true;
var sut = _fixture.GetSut();

var manifest = WithAndroidManifest(basePath => sut.ModifyManifest(basePath));

StringAssert.Contains("<meta-data android:name=\"io.sentry.tombstone.enable\" android:value=\"True\" />", manifest);
}

[Test]
public void ModifyManifest_AndroidNativeTombstoneEnabled_False_WritesTombstoneMetadataDisabled()
{
_fixture.SentryUnityOptions!.AndroidNativeTombstoneEnabled = false;
var sut = _fixture.GetSut();

var manifest = WithAndroidManifest(basePath => sut.ModifyManifest(basePath));

StringAssert.Contains("<meta-data android:name=\"io.sentry.tombstone.enable\" android:value=\"False\" />", manifest);
}

[Test]
public void ModifyManifest_ManifestHasDsn()
{
Expand Down
Loading