Skip to content
Merged
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

### Features

- Drastically improved performance of scope sync when targeting Android ([#2107](https://github.com/getsentry/sentry-unity/pull/2107))
- When running on Android, Windows or Linux, the SDK now links errors and events originating on different layers (managed, native errors) via `trace ID` ([#1997](https://github.com/getsentry/sentry-unity/pull/1997), [#2089](https://github.com/getsentry/sentry-unity/pull/2089))
- The SDK now reports the game's name as part of the app context ([2083](https://github.com/getsentry/sentry-unity/pull/2083))
- The SDK now reports the active scene's name as part of the `Unity Context` ([2084](https://github.com/getsentry/sentry-unity/pull/2084))
Expand Down
99 changes: 17 additions & 82 deletions src/Sentry.Unity.Android/AndroidJavaScopeObserver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,96 +9,31 @@ namespace Sentry.Unity.Android;
/// <see href="https://github.com/getsentry/sentry-java"/>
internal class AndroidJavaScopeObserver : ScopeObserver
{
private readonly IJniExecutor _jniExecutor;
private ISentryJava _sentryJava;

public AndroidJavaScopeObserver(SentryOptions options, IJniExecutor jniExecutor) : base("Android", options)
public AndroidJavaScopeObserver(SentryOptions options, ISentryJava sentryJava) : base("Android", options)
{
_jniExecutor = jniExecutor;
_sentryJava = sentryJava;
}

private static AndroidJavaObject GetSentryJava() => new AndroidJavaClass("io.sentry.Sentry");
public override void AddBreadcrumbImpl(Breadcrumb breadcrumb) =>
_sentryJava.AddBreadcrumb(breadcrumb);

private static AndroidJavaObject GetInternalSentryJava() => new AndroidJavaClass("io.sentry.android.core.InternalSentrySdk");
public override void SetExtraImpl(string key, string? value) =>
_sentryJava.SetExtra(key, value);

public override void AddBreadcrumbImpl(Breadcrumb breadcrumb)
{
_jniExecutor.Run(() =>
{
using var sentry = GetSentryJava();
using var javaBreadcrumb = new AndroidJavaObject("io.sentry.Breadcrumb");
javaBreadcrumb.Set("message", breadcrumb.Message);
javaBreadcrumb.Set("type", breadcrumb.Type);
javaBreadcrumb.Set("category", breadcrumb.Category);
using var javaLevel = breadcrumb.Level.ToJavaSentryLevel();
javaBreadcrumb.Set("level", javaLevel);
sentry.CallStatic("addBreadcrumb", javaBreadcrumb, null);
});
}
public override void SetTagImpl(string key, string value) =>
_sentryJava.SetTag(key, value);

public override void SetExtraImpl(string key, string? value)
{
_jniExecutor.Run(() =>
{
using var sentry = GetSentryJava();
sentry.CallStatic("setExtra", key, value);
});
}
public override void SetTagImpl(string key, string value)
{
_jniExecutor.Run(() =>
{
using var sentry = GetSentryJava();
sentry.CallStatic("setTag", key, value);
});
}
public override void UnsetTagImpl(string key) =>
_sentryJava.UnsetTag(key);

public override void UnsetTagImpl(string key)
{
_jniExecutor.Run(() =>
{
using var sentry = GetSentryJava();
sentry.CallStatic("removeTag", key);
});
}
public override void SetUserImpl(SentryUser user) =>
_sentryJava.SetUser(user);

public override void SetUserImpl(SentryUser user)
{
_jniExecutor.Run(() =>
{
AndroidJavaObject? javaUser = null;
try
{
javaUser = new AndroidJavaObject("io.sentry.protocol.User");
javaUser.Set("email", user.Email);
javaUser.Set("id", user.Id);
javaUser.Set("username", user.Username);
javaUser.Set("ipAddress", user.IpAddress);
using var sentry = GetSentryJava();
sentry.CallStatic("setUser", javaUser);
}
finally
{
javaUser?.Dispose();
}
});
}
public override void UnsetUserImpl() =>
_sentryJava.UnsetUser();

public override void UnsetUserImpl()
{
_jniExecutor.Run(() =>
{
using var sentry = GetSentryJava();
sentry.CallStatic("setUser", null);
});
}

public override void SetTraceImpl(SentryId traceId, SpanId spanId)
{
_jniExecutor.Run(() =>
{
using var sentry = GetInternalSentryJava();
// We have to explicitly cast to `(Double?)`
sentry.CallStatic("setTrace", traceId.ToString(), spanId.ToString(), (Double?)null, (Double?)null);
});
}
public override void SetTraceImpl(SentryId traceId, SpanId spanId) =>
_sentryJava.SetTrace(traceId, spanId);
}
36 changes: 36 additions & 0 deletions src/Sentry.Unity.Android/AndroidOptionConfiguration.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System;
using Sentry.Extensibility;
using UnityEngine;

namespace Sentry.Unity.Android;

internal class AndroidOptionsConfiguration : AndroidJavaProxy
{
private readonly Action<AndroidJavaObject> _callback;
private readonly IDiagnosticLogger? _logger;

public AndroidOptionsConfiguration(Action<AndroidJavaObject> callback, IDiagnosticLogger? logger)
: base("io.sentry.Sentry$OptionsConfiguration")
{
_callback = callback;
_logger = logger;
}

public override AndroidJavaObject? Invoke(string methodName, AndroidJavaObject[] args)
{
try
{
if (methodName != "configure" || args.Length != 1)
{
throw new Exception($"Invalid invocation: {methodName}({args.Length} args)");
}

_callback(args[0]);
}
catch (Exception e)
{
_logger?.LogError(e, "Error invoking '{0}'.", methodName);
}
return null;
}
}
18 changes: 18 additions & 0 deletions src/Sentry.Unity.Android/IAndroidJNI.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using UnityEngine;

namespace Sentry.Unity.Android;

public interface IAndroidJNI
{
public void AttachCurrentThread();
public void DetachCurrentThread();
}

public class AndroidJNIAdapter : IAndroidJNI
{
public static readonly AndroidJNIAdapter Instance = new();

public void AttachCurrentThread() => AndroidJNI.AttachCurrentThread();

public void DetachCurrentThread() => AndroidJNI.DetachCurrentThread();
}
9 changes: 0 additions & 9 deletions src/Sentry.Unity.Android/IJniExecutor.cs

This file was deleted.

182 changes: 0 additions & 182 deletions src/Sentry.Unity.Android/JniExecutor.cs

This file was deleted.

5 changes: 1 addition & 4 deletions src/Sentry.Unity.Android/NativeContextWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@ namespace Sentry.Unity.Android;

internal class NativeContextWriter : ContextWriter
{
private readonly IJniExecutor _jniExecutor;
private readonly ISentryJava _sentryJava;

public NativeContextWriter(IJniExecutor jniExecutor, ISentryJava sentryJava)
public NativeContextWriter(ISentryJava sentryJava)
{
_jniExecutor = jniExecutor;
_sentryJava = sentryJava;
}

Expand Down Expand Up @@ -53,7 +51,6 @@ protected override void WriteScope(
// the "unity" context, but it doesn't seem so useful and the effort to do is larger because there's no
// class for it in Java - not sure how we could add a generic context object in Java...
_sentryJava.WriteScope(
_jniExecutor,
GpuId,
GpuName,
GpuVendorName,
Expand Down
Loading
Loading