From 9f84bada71a84bd7734afce4bb2d46949eae9dcc Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Tue, 30 Jun 2026 16:22:44 +0200 Subject: [PATCH] set up app hang capture --- modules/sentry-java | 2 +- modules/sentry-native | 2 +- src/Sentry.Unity.Android/SentryJava.cs | 3 +++ src/Sentry.Unity.Android/SentryNative.cs | 10 ++++++++++ src/Sentry.Unity.Android/SentryNativeAndroid.cs | 11 +++++++++++ src/Sentry.Unity/ExperimentalSentryUnityOptions.cs | 4 ++-- 6 files changed, 28 insertions(+), 4 deletions(-) diff --git a/modules/sentry-java b/modules/sentry-java index 8c43a107a..75c422606 160000 --- a/modules/sentry-java +++ b/modules/sentry-java @@ -1 +1 @@ -Subproject commit 8c43a107a007ae5e2aea365bdf434318784049d7 +Subproject commit 75c4226064c4a139b1d932769f3d9a8816a641c6 diff --git a/modules/sentry-native b/modules/sentry-native index fea16b84e..83d829ad6 160000 --- a/modules/sentry-native +++ b/modules/sentry-native @@ -1 +1 @@ -Subproject commit fea16b84ef4e723dd3a0e7f5e76f1737973dd349 +Subproject commit 83d829ad6624247d6263d8dd1d4e8acc07338de9 diff --git a/src/Sentry.Unity.Android/SentryJava.cs b/src/Sentry.Unity.Android/SentryJava.cs index 232b465a8..246d526bd 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("setEnableAppHangTracking", options.Experimental.EnableNativeAppHangTracking); + androidOptions.Call("setAppHangTimeoutIntervalMillis", (long)options.AppHangTimeout.TotalMilliseconds); + using (var logsOptions = androidOptions.Call("getLogs")) { logsOptions.Call("setEnabled", options.EnableLogs); diff --git a/src/Sentry.Unity.Android/SentryNative.cs b/src/Sentry.Unity.Android/SentryNative.cs index ee1d96d02..3e2e02289 100644 --- a/src/Sentry.Unity.Android/SentryNative.cs +++ b/src/Sentry.Unity.Android/SentryNative.cs @@ -26,10 +26,20 @@ public static class SentryNative /// public static void ReinstallBackend() => ReinstallSentryNativeBackendStrategy(); + /// + /// Records an app-hang heartbeat with sentry-native from the calling thread. The first call + /// latches the calling thread as the monitored target, so this must run on the Unity main thread. + /// + public static void AppHangHeartbeat() => AppHangHeartbeatStrategy(); + // libsentry.io [DllImport("sentry")] private static extern void sentry_reinstall_backend(); + [DllImport("sentry")] + private static extern void sentry_app_hang_heartbeat(); + // Testing internal static Action ReinstallSentryNativeBackendStrategy = sentry_reinstall_backend; + internal static Action AppHangHeartbeatStrategy = sentry_app_hang_heartbeat; } diff --git a/src/Sentry.Unity.Android/SentryNativeAndroid.cs b/src/Sentry.Unity.Android/SentryNativeAndroid.cs index 468e796f4..ab30cac79 100644 --- a/src/Sentry.Unity.Android/SentryNativeAndroid.cs +++ b/src/Sentry.Unity.Android/SentryNativeAndroid.cs @@ -110,6 +110,17 @@ public static void Configure(SentryUnityOptions options) options.NativeSupportCloseCallback = () => Close(options); + if (options.Experimental.EnableNativeAppHangTracking) + { + Logger?.LogDebug("Starting the app-hang heartbeat coroutine."); + SentryMonoBehaviour.Instance.StartAppHangHeartbeat(SentryNative.AppHangHeartbeat); + + // sentry-native handles app-hang detection on the monitored main thread. Skip the C# ANR + // watchdog so a hang isn't reported twice (mirrors the iOS/sentry-cocoa and desktop behavior). + Logger?.LogDebug("Disabling the C# ANR watchdog - sentry-native handles app hang detection."); + options.DisableAnrIntegration(); + } + Logger?.LogDebug("Fetching installation ID"); var installationId = SentryJava.GetInstallationId(); diff --git a/src/Sentry.Unity/ExperimentalSentryUnityOptions.cs b/src/Sentry.Unity/ExperimentalSentryUnityOptions.cs index bd03043e8..19ff098cf 100644 --- a/src/Sentry.Unity/ExperimentalSentryUnityOptions.cs +++ b/src/Sentry.Unity/ExperimentalSentryUnityOptions.cs @@ -40,9 +40,9 @@ public class ExperimentalSentryUnityOptions [field: SerializeField] public LinuxBackend LinuxBackend { get; set; } = LinuxBackend.Breakpad; /// - /// Enables app hang detection via sentry-native on macOS, Windows, and Linux. Defaults to + /// Enables app hang detection via sentry-native on macOS, Windows, Linux, and Android. Defaults to /// false. Requires the backend to be switched to - /// on macOS. sentry-native monitors the main thread and + /// on macOS. On Android it is routed through the NDK integration. sentry-native monitors the main thread and /// produces an app hang event including a stack trace. When enabled, the C# watchdog is skipped to avoid /// duplicate reports. The timeout is taken from AppHangTimeout. ///