From cba5ef706879d4ca4ca5ba3b6eeb158da2100629 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 18 Feb 2026 08:48:37 +0000 Subject: [PATCH 1/4] feat(flutter): Add enableTombstone option for improved native crash reporting Add `enableTombstone` option to SentryFlutterOptions that enables tombstone-based native crash reporting on Android 12+ (API level 30+). When enabled, uses Android's `ApplicationExitInfo.REASON_CRASH_NATIVE` to capture native crashes with more detailed thread information. The option is disabled by default. Slack thread: https://sentry.slack.com/archives/CP4UUUF1S/p1771404252312029?thread_ts=1769055443.846779&cid=CP4UUUF1S https://claude.ai/code/session_016kkosYW3XG2rhHafEfspqA --- CHANGELOG.md | 6 ++++++ .../lib/src/native/java/sentry_native_java_init.dart | 1 + packages/flutter/lib/src/sentry_flutter_options.dart | 6 ++++++ packages/flutter/test/sentry_flutter_options_test.dart | 7 +++++++ 4 files changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7e379496f..5978411738 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## Unreleased +### Features + +- Add `enableTombstone` option for improved native crash reporting on Android 12+ ([#XXXX](https://github.com/getsentry/sentry-dart/pull/XXXX)) + - When enabled, uses Android's `ApplicationExitInfo.REASON_CRASH_NATIVE` to capture native crashes with more detailed thread information + - Disabled by default + ### Dependencies - Bump Native SDK from v0.12.6 to v0.12.7 ([#3514](https://github.com/getsentry/sentry-dart/pull/3514)) diff --git a/packages/flutter/lib/src/native/java/sentry_native_java_init.dart b/packages/flutter/lib/src/native/java/sentry_native_java_init.dart index 86004d5bc3..bb709dccf9 100644 --- a/packages/flutter/lib/src/native/java/sentry_native_java_init.dart +++ b/packages/flutter/lib/src/native/java/sentry_native_java_init.dart @@ -215,6 +215,7 @@ void configureAndroidOptions({ androidOptions .setAnrTimeoutIntervalMillis(options.anrTimeoutInterval.inMilliseconds); androidOptions.setAnrEnabled(options.anrEnabled); + androidOptions.setTombstoneEnabled(options.enableTombstone); androidOptions.setAttachThreads(options.attachThreads); androidOptions.setAttachStacktrace(options.attachStacktrace); diff --git a/packages/flutter/lib/src/sentry_flutter_options.dart b/packages/flutter/lib/src/sentry_flutter_options.dart index d88afa0209..b66d516b0a 100644 --- a/packages/flutter/lib/src/sentry_flutter_options.dart +++ b/packages/flutter/lib/src/sentry_flutter_options.dart @@ -68,6 +68,12 @@ class SentryFlutterOptions extends SentryOptions { /// Available only for Android. Enabled by default. bool anrEnabled = true; + /// Enable or disable Tombstone reporting for improved native crash reporting. + /// When enabled, uses Android's `ApplicationExitInfo.REASON_CRASH_NATIVE` to + /// capture native crashes with more detailed thread information. + /// Available only for Android 12+ (API level 30+). Disabled by default. + bool enableTombstone = false; + Duration _anrTimeoutInterval = Duration(milliseconds: 5000); /// ANR Timeout internal. Default is 5000 milliseconds or 5 seconds. diff --git a/packages/flutter/test/sentry_flutter_options_test.dart b/packages/flutter/test/sentry_flutter_options_test.dart index 81f723a061..a5b62284ab 100644 --- a/packages/flutter/test/sentry_flutter_options_test.dart +++ b/packages/flutter/test/sentry_flutter_options_test.dart @@ -51,5 +51,12 @@ void main() { expect(options.enableMemoryPressureBreadcrumbs, isTrue); expect(options.enableAutoNativeBreadcrumbs, isFalse); }); + + testWidgets('enableTombstone defaults to false', + (WidgetTester tester) async { + final options = defaultTestOptions(); + + expect(options.enableTombstone, isFalse); + }); }); } From d1b4678bd3cfcf189c881c365c9fc8d99c4e70c2 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Wed, 18 Feb 2026 09:53:30 +0100 Subject: [PATCH 2/4] Apply suggestion from @romtsn --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5978411738..be6f4cdec6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ ### Features -- Add `enableTombstone` option for improved native crash reporting on Android 12+ ([#XXXX](https://github.com/getsentry/sentry-dart/pull/XXXX)) +- Add `enableTombstone` option for improved native crash reporting on Android 12+ ([#3526](https://github.com/getsentry/sentry-dart/pull/3526)) - When enabled, uses Android's `ApplicationExitInfo.REASON_CRASH_NATIVE` to capture native crashes with more detailed thread information - Disabled by default From 729ca7534cba9fa0a9d9dccc35a7b27079fae1e0 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 19 Feb 2026 12:36:27 +0100 Subject: [PATCH 3/4] Add integration test --- .../flutter/example/integration_test/integration_test.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/flutter/example/integration_test/integration_test.dart b/packages/flutter/example/integration_test/integration_test.dart index 787f47a80a..df87d80c3a 100644 --- a/packages/flutter/example/integration_test/integration_test.dart +++ b/packages/flutter/example/integration_test/integration_test.dart @@ -217,6 +217,7 @@ void main() { options.anrTimeoutInterval = const Duration(seconds: 2); options.connectionTimeout = const Duration(milliseconds: 1234); options.readTimeout = const Duration(milliseconds: 2345); + options.enableTombstone = false; }); }); @@ -280,12 +281,15 @@ void main() { expect(findMatchingPackage, isNotNull); } expect(androidOptions.isEnableAutoTraceIdGeneration(), isFalse); + expect(androidOptions.isTombstoneEnabled(), isFalse); + final androidProxy = androidOptions.getProxy(); expect(androidProxy, isNotNull); expect(androidProxy!.getHost()?.toDartString(), 'proxy.local'); expect(androidProxy.getPort()?.toDartString(), '8084'); expect(androidProxy.getUser()?.toDartString(), 'u'); expect(androidProxy.getPass()?.toDartString(), 'p'); + final r = androidOptions.getSessionReplay(); expect(r.getQuality(), jni.SentryReplayOptions$SentryReplayQuality.HIGH); expect(r.getSessionSampleRate(), isNotNull); From 0f464c45835a3e1b97f87a6c0199b547e241c8a5 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 19 Feb 2026 12:56:43 +0100 Subject: [PATCH 4/4] Enable tombstone option in integration test --- .../flutter/example/integration_test/integration_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/flutter/example/integration_test/integration_test.dart b/packages/flutter/example/integration_test/integration_test.dart index df87d80c3a..c90edc5f0a 100644 --- a/packages/flutter/example/integration_test/integration_test.dart +++ b/packages/flutter/example/integration_test/integration_test.dart @@ -217,7 +217,7 @@ void main() { options.anrTimeoutInterval = const Duration(seconds: 2); options.connectionTimeout = const Duration(milliseconds: 1234); options.readTimeout = const Duration(milliseconds: 2345); - options.enableTombstone = false; + options.enableTombstone = true; }); }); @@ -281,7 +281,7 @@ void main() { expect(findMatchingPackage, isNotNull); } expect(androidOptions.isEnableAutoTraceIdGeneration(), isFalse); - expect(androidOptions.isTombstoneEnabled(), isFalse); + expect(androidOptions.isTombstoneEnabled(), isTrue); final androidProxy = androidOptions.getProxy(); expect(androidProxy, isNotNull);