Skip to content

Commit ebc1115

Browse files
Reintroduced experimental support for Session Replay on Android (#4097)
1 parent 455f488 commit ebc1115

File tree

8 files changed

+90
-0
lines changed

8 files changed

+90
-0
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
### Features
6+
7+
- Reintroduced experimental support for Session Replay on Android ([#4097](https://github.com/getsentry/sentry-dotnet/pull/4097))
8+
59
### Fixes
610

711
- Prevent users from disabling AndroidEnableAssemblyCompression which leads to untrappable crash ([#4089](https://github.com/getsentry/sentry-dotnet/pull/4089))

samples/Sentry.Samples.Android/MainActivity.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ protected override void OnCreate(Bundle? savedInstanceState)
2121
// Enable Native Android SDK ANR detection
2222
options.Native.AnrEnabled = true;
2323

24+
// Currently experimental support is only available on Android
25+
options.Native.ExperimentalOptions.SessionReplay.OnErrorSampleRate = 1.0;
26+
options.Native.ExperimentalOptions.SessionReplay.SessionSampleRate = 1.0;
27+
options.Native.ExperimentalOptions.SessionReplay.MaskAllImages = false;
28+
options.Native.ExperimentalOptions.SessionReplay.MaskAllText = false;
29+
2430
options.SetBeforeSend(evt =>
2531
{
2632
if (evt.Exception?.Message.Contains("Something you don't care want logged?") ?? false)

samples/Sentry.Samples.Maui/MauiProgram.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ public static MauiApp CreateMauiApp()
2525
options.Debug = true;
2626
options.SampleRate = 1.0F;
2727

28+
#if ANDROID
29+
// Currently experimental support is only available on Android
30+
options.Native.ExperimentalOptions.SessionReplay.OnErrorSampleRate = 1.0;
31+
options.Native.ExperimentalOptions.SessionReplay.SessionSampleRate = 1.0;
32+
options.Native.ExperimentalOptions.SessionReplay.MaskAllImages = false;
33+
options.Native.ExperimentalOptions.SessionReplay.MaskAllText = false;
34+
#endif
35+
2836
options.SetBeforeScreenshotCapture((@event, hint) =>
2937
{
3038
Console.WriteLine("screenshot about to be captured.");

src/Sentry.Bindings.Android/Sentry.Bindings.Android.csproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
<PackageReference Include="Xamarin.AndroidX.Lifecycle.Common.Java8" Version="2.6.1.3" />
3939
<!-- MAUI 8 references this version indirectly via Xamarin.AndroidX.SwipeRefreshLayout (>= 1.1.0.14) -->
4040
<PackageReference Include="Xamarin.AndroidX.Core" Version="1.10.1.2" />
41+
<!-- We need 1.9.24 but there's no NuGet package for that version... the lowest version we can use is 2.0.0 -->
42+
<PackageReference Include="Xamarin.Kotlin.StdLib.Jdk8" Version="2.0.0" />
4143
</ItemGroup>
4244

4345
<!-- Dependencies for AndroidMavenLibrary references
@@ -49,12 +51,15 @@
4951
<PackageReference Include="Xamarin.AndroidX.Lifecycle.Common.Java8" Version="2.8.5.1" />
5052
<!-- MAUI 9 references this version indirectly via Xamarin.AndroidX.SwipeRefreshLayout (>= 1.1.0.24) -->
5153
<PackageReference Include="Xamarin.AndroidX.Core" Version="1.13.1.5" />
54+
<!-- We need 1.9.24 but there's no NuGet package for that version... the lowest version we can use is 2.0.0 -->
55+
<PackageReference Include="Xamarin.Kotlin.StdLib.Jdk8" Version="2.0.0" />
5256
</ItemGroup>
5357

5458
<ItemGroup Condition="$(TargetFramework.StartsWith('net8'))">
5559
<AndroidLibrary Include="$(SentryAndroidSdkDirectory)sentry-$(SentryAndroidSdkVersion).jar" />
5660
<AndroidLibrary Include="$(SentryAndroidSdkDirectory)sentry-android-core-$(SentryAndroidSdkVersion).aar" />
5761
<AndroidLibrary Include="$(SentryAndroidSdkDirectory)sentry-android-ndk-$(SentryAndroidSdkVersion).aar" />
62+
<AndroidLibrary Include="$(SentryAndroidSdkDirectory)sentry-android-replay-$(SentryAndroidSdkVersion).aar" />
5863
</ItemGroup>
5964

6065
<!-- Starting with .NET 9 we can detect Java dependencies using POM files and AndroidMavenLibrary references -->
@@ -66,6 +71,7 @@
6671
/>
6772
<AndroidMavenLibrary Include="io.sentry:sentry-android-core" Version="$(SentryAndroidSdkVersion)" />
6873
<AndroidMavenLibrary Include="io.sentry:sentry-android-ndk" Version="$(SentryAndroidSdkVersion)" />
74+
<AndroidMavenLibrary Include="io.sentry:sentry-android-replay" Version="$(SentryAndroidSdkVersion)" />
6975
</ItemGroup>
7076

7177
<ItemGroup>
@@ -89,6 +95,12 @@
8995
Condition="!Exists('$(SentryAndroidSdkDirectory)sentry-android-ndk-$(SentryAndroidSdkVersion).aar') And $(TargetFramework.StartsWith('net8'))"
9096
Retries="3"
9197
/>
98+
<DownloadFile
99+
SourceUrl="https://repo1.maven.org/maven2/io/sentry/sentry-android-replay/$(SentryAndroidSdkVersion)/sentry-android-replay-$(SentryAndroidSdkVersion).aar"
100+
DestinationFolder="$(SentryAndroidSdkDirectory)"
101+
Condition="!Exists('$(SentryAndroidSdkDirectory)sentry-android-replay-$(SentryAndroidSdkVersion).aar') And $(TargetFramework.StartsWith('net8'))"
102+
Retries="3"
103+
/>
92104
<DownloadFile
93105
SourceUrl="https://repo1.maven.org/maven2/io/sentry/sentry/$(SentryAndroidSdkVersion)/sentry-$(SentryAndroidSdkVersion).jar"
94106
DestinationFolder="$(SentryAndroidSdkDirectory)"

src/Sentry/Platforms/Android/BindableNativeSentryOptions.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,21 @@ public class NativeOptions
3535
public bool? EnableTracing { get; set; }
3636
public bool? EnableBeforeSend { get; set; }
3737

38+
public NativeExperimentalOptions ExperimentalOptions { get; set; } = new();
39+
40+
internal class NativeExperimentalOptions
41+
{
42+
public NativeSentryReplayOptions SessionReplay { get; set; } = new();
43+
}
44+
45+
internal class NativeSentryReplayOptions
46+
{
47+
public double? OnErrorSampleRate { get; set; }
48+
public double? SessionSampleRate { get; set; }
49+
public bool RedactAllImages { get; set; }
50+
public bool RedactAllText { get; set; }
51+
}
52+
3853
public void ApplyTo(SentryOptions.NativeOptions options)
3954
{
4055
options.AnrEnabled = AnrEnabled ?? options.AnrEnabled;
@@ -61,6 +76,21 @@ public void ApplyTo(SentryOptions.NativeOptions options)
6176
options.ReadTimeout = ReadTimeout ?? options.ReadTimeout;
6277
options.EnableTracing = EnableTracing ?? options.EnableTracing;
6378
options.EnableBeforeSend = EnableBeforeSend ?? options.EnableBeforeSend;
79+
80+
if (ExperimentalOptions.SessionReplay.OnErrorSampleRate is { } errorSampleRate)
81+
{
82+
#pragma warning disable CA1422
83+
options.ExperimentalOptions.SessionReplay.OnErrorSampleRate = errorSampleRate;
84+
#pragma warning restore CA1422
85+
}
86+
if (ExperimentalOptions.SessionReplay.SessionSampleRate is { } sessionSampleRate)
87+
{
88+
#pragma warning disable CA1422
89+
options.ExperimentalOptions.SessionReplay.SessionSampleRate = sessionSampleRate;
90+
#pragma warning restore CA1422
91+
}
92+
ExperimentalOptions.SessionReplay.RedactAllText = options.ExperimentalOptions.SessionReplay.MaskAllText;
93+
ExperimentalOptions.SessionReplay.RedactAllImages = options.ExperimentalOptions.SessionReplay.MaskAllImages;
6494
}
6595
}
6696
}

src/Sentry/Platforms/Android/NativeOptions.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,5 +260,23 @@ public void AddInAppInclude(string prefix)
260260
/// be stripped away during the round-tripping between the two SDKs. Use with caution.
261261
/// </remarks>
262262
public bool EnableBeforeSend { get; set; } = false;
263+
264+
public class NativeExperimentalOptions
265+
{
266+
public NativeSentryReplayOptions SessionReplay { get; set; } = new();
267+
}
268+
269+
public class NativeSentryReplayOptions
270+
{
271+
public double? OnErrorSampleRate { get; set; }
272+
public double? SessionSampleRate { get; set; }
273+
public bool MaskAllImages { get; set; } = true;
274+
public bool MaskAllText { get; set; } = true;
275+
}
276+
277+
/// <summary>
278+
/// ExperimentalOptions
279+
/// </summary>
280+
public NativeExperimentalOptions ExperimentalOptions { get; set; } = new();
263281
}
264282
}

src/Sentry/Platforms/Android/SentrySdk.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,13 @@ private static void InitSentryAndroidSdk(SentryOptions options)
135135
options.Native.InAppExcludes?.ForEach(o.AddInAppExclude);
136136
options.Native.InAppIncludes?.ForEach(o.AddInAppInclude);
137137

138+
o.SessionReplay.OnErrorSampleRate =
139+
(JavaDouble?)options.Native.ExperimentalOptions.SessionReplay.OnErrorSampleRate;
140+
o.SessionReplay.SessionSampleRate =
141+
(JavaDouble?)options.Native.ExperimentalOptions.SessionReplay.SessionSampleRate;
142+
o.SessionReplay.SetMaskAllImages(options.Native.ExperimentalOptions.SessionReplay.MaskAllImages);
143+
o.SessionReplay.SetMaskAllText(options.Native.ExperimentalOptions.SessionReplay.MaskAllText);
144+
138145
// These options are intentionally set and not exposed for modification
139146
o.EnableExternalConfiguration = false;
140147
o.EnableDeduplication = false;

test/Sentry.Tests/Platforms/Android/BindableNativeOptionsTests.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ namespace Sentry.Tests.Platforms.Android;
55

66
public class BindableNativeOptionsTests : BindableTests<SentryOptions.NativeOptions>
77
{
8+
public BindableNativeOptionsTests()
9+
: base(nameof(BindableSentryOptions.NativeOptions.ExperimentalOptions))
10+
{
11+
}
12+
813
[Fact]
914
public void BindableProperties_MatchOptionsProperties()
1015
{

0 commit comments

Comments
 (0)