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
2 changes: 1 addition & 1 deletion modules/sentry-java
Submodule sentry-java updated 40 files
+3 −3 .github/workflows/agp-matrix.yml
+3 −3 .github/workflows/build.yml
+1 −1 .github/workflows/changelog-preview.yml
+2 −2 .github/workflows/codeql-analysis.yml
+2 −2 .github/workflows/enforce-license-compliance.yml
+2 −2 .github/workflows/format-code.yml
+2 −2 .github/workflows/generate-javadocs.yml
+5 −5 .github/workflows/integration-tests-benchmarks.yml
+3 −3 .github/workflows/integration-tests-size.yml
+3 −3 .github/workflows/integration-tests-ui-critical.yml
+2 −2 .github/workflows/integration-tests-ui.yml
+2 −2 .github/workflows/release-build.yml
+1 −1 .github/workflows/release.yml
+4 −4 .github/workflows/spring-boot-2-matrix.yml
+4 −4 .github/workflows/spring-boot-3-matrix.yml
+4 −4 .github/workflows/spring-boot-4-matrix.yml
+3 −3 .github/workflows/system-tests-backend.yml
+25 −0 CHANGELOG.md
+5 −0 CONTRIBUTING.md
+4 −0 sentry-android-core/api/sentry-android-core.api
+16 −0 sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java
+60 −0 sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java
+67 −21 sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/ViewUtils.java
+50 −0 sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt
+7 −0 sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidOptionsTest.kt
+6 −23 sentry-android-core/src/test/java/io/sentry/android/core/internal/gestures/ViewHelpers.kt
+99 −1 sentry-android-core/src/test/java/io/sentry/android/core/internal/gestures/ViewUtilsTest.kt
+3 −0 sentry-android-ndk/src/main/java/io/sentry/android/ndk/SentryNdk.java
+28 −0 sentry-android-ndk/src/test/java/io/sentry/android/ndk/SentryNdkTest.kt
+4 −0 sentry-android-replay/src/test/java/io/sentry/android/replay/viewhierarchy/ComposeMaskingOptionsTest.kt
+6 −3 sentry-compose/src/androidMain/kotlin/io/sentry/compose/gestures/ComposeGestureTargetLocator.kt
+1 −0 sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpInterceptor.kt
+3 −1 sentry/src/main/java/io/sentry/Scope.java
+31 −3 sentry/src/main/java/io/sentry/util/LoadClass.java
+14 −1 sentry/src/main/java/io/sentry/util/network/NetworkBody.java
+13 −4 sentry/src/main/java/io/sentry/util/network/NetworkBodyParser.java
+7 −1 sentry/src/main/java/io/sentry/util/network/NetworkDetailCaptureUtils.java
+70 −0 sentry/src/test/java/io/sentry/util/LoadClassTest.kt
+21 −0 sentry/src/test/java/io/sentry/util/network/NetworkBodyParserTest.kt
+58 −0 sentry/src/test/java/io/sentry/util/network/NetworkDetailCaptureUtilsTest.kt
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("setEnableAppHangTracking", options.Experimental.EnableNativeAppHangTracking);
androidOptions.Call("setAppHangTimeoutIntervalMillis", (long)options.AppHangTimeout.TotalMilliseconds);

using (var logsOptions = androidOptions.Call<AndroidJavaObject>("getLogs"))
{
logsOptions.Call("setEnabled", options.EnableLogs);
Expand Down
10 changes: 10 additions & 0 deletions src/Sentry.Unity.Android/SentryNative.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,20 @@ public static class SentryNative
/// </summary>
public static void ReinstallBackend() => ReinstallSentryNativeBackendStrategy();

/// <summary>
/// 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.
/// </summary>
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;
}
11 changes: 11 additions & 0 deletions src/Sentry.Unity.Android/SentryNativeAndroid.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
4 changes: 2 additions & 2 deletions src/Sentry.Unity/ExperimentalSentryUnityOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ public class ExperimentalSentryUnityOptions
[field: SerializeField] public LinuxBackend LinuxBackend { get; set; } = LinuxBackend.Breakpad;

/// <summary>
/// Enables app hang detection via <c>sentry-native</c> on macOS, Windows, and Linux. Defaults to
/// Enables app hang detection via <c>sentry-native</c> on macOS, Windows, Linux, and Android. Defaults to
/// <c>false</c>. Requires the backend to be switched to <see cref="Sentry.Unity.MacosBackend.Native"/>
/// on macOS. <c>sentry-native</c> monitors the main thread and
/// on macOS. On Android it is routed through the NDK integration. <c>sentry-native</c> 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 <c>AppHangTimeout</c>.
/// </summary>
Expand Down
Loading