Skip to content

Commit a081bd5

Browse files
authored
chore: respect the new folder structure inside of Unity (#2667)
1 parent 31c2194 commit a081bd5

7 files changed

Lines changed: 210 additions & 87 deletions

File tree

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+
- Added `AndroidNativeAnrEnabled` (default `true`) to enable ANR detection through `sentry-java` SDK. The native ANR integration monitors the Android UI thread. On API ≥ 30 this uses [ANR v2](https://docs.sentry.io/platforms/android/configuration/app-not-respond/) via `ApplicationExitInfo` to report OS-detected ANRs from prior runs; on API < 30 it falls back to an in-process watchdog. This is complementary to the Unity SDK's C# watchdog, which monitors the Unity player loop. ([#2671](https://github.com/getsentry/sentry-unity/pull/2671))
8+
59
### Dependencies
610

711
- Bump Cocoa SDK from v9.12.0 to v9.12.1 ([#2670](https://github.com/getsentry/sentry-unity/pull/2670))

Directory.Build.targets

Lines changed: 11 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -25,95 +25,23 @@
2525
<SentryWindowsArtifactsDestination>$(SentryArtifactsDestination)Windows/Sentry/</SentryWindowsArtifactsDestination>
2626
</PropertyGroup>
2727

28-
<PropertyGroup>
29-
<HubSecondaryInstallPathFile>$(AppData)\UnityHub\secondaryInstallPath.json</HubSecondaryInstallPathFile>
30-
<HubDefaultEditorFile>$(AppData)\UnityHub\defaultEditor.json</HubDefaultEditorFile>
31-
<HubDefaultEditor Condition="'$(HubDefaultEditor)' == ''"></HubDefaultEditor>
32-
<HubInstallDir Condition="'$(HubInstallDir)' == '' AND $([MSBuild]::IsOSPlatform('Windows'))">C:\Program Files\Unity\Hub\Editor</HubInstallDir>
33-
<HubInstallDir Condition="'$(HubInstallDir)' == '' AND $([MSBuild]::IsOSPlatform('OSX'))">\Applications\Unity\Hub\Editor</HubInstallDir>
34-
<HubInstallDir Condition="'$(HubInstallDir)' == '' AND $([MSBuild]::IsOSPlatform('Linux'))">$(Home)\Unity\Hub\Editor</HubInstallDir>
35-
<HubInstallDir Condition="!Exists('$(HubInstallDir)')"></HubInstallDir>
36-
</PropertyGroup>
37-
38-
<Target Name="FindHub"
39-
Condition="'$(HubInstallDir)' == '' AND Exists('$(HubSecondaryInstallPathFile)')"
40-
Returns="$(HubInstallDir);$(HubDefaultEditor)">
41-
42-
<ReadLinesFromFile File="$(HubSecondaryInstallPathFile)">
43-
<Output TaskParameter="Lines" ItemName="item1" />
44-
</ReadLinesFromFile>
45-
46-
<ReadLinesFromFile File="$(HubDefaultEditorFile)" Condition="Exists('$(HubDefaultEditorFile)')">
47-
<Output TaskParameter="Lines" ItemName="item2" />
48-
</ReadLinesFromFile>
49-
50-
<PropertyGroup>
51-
<HubInstallDir>@(item1->Replace('"', ''))</HubInstallDir>
52-
<HubInstallDir Condition=" !Exists('$(HubInstallDir)') "></HubInstallDir>
53-
54-
<HubDefaultEditor>@(item2->Replace('"', ''))</HubDefaultEditor>
55-
<HubDefaultEditor Condition=" !Exists('$(HubInstallDir)\$(HubDefaultEditor)') "></HubDefaultEditor>
56-
</PropertyGroup>
57-
</Target>
58-
59-
<!-- Use the Unity Editor version set in the sample project of the repo -->
60-
<Target Name="FindUnity" DependsOnTargets="FindHub" AfterTargets="FindHub">
28+
<Target Name="FindUnity">
6129
<Message Text="Unity Version: $(UnityVersion)" Importance="Normal" />
6230

63-
<!-- Find all the installations of Unity done by the Unity Hub -->
64-
<ItemGroup Condition="'$(HubInstallDir)' != '' AND '$(HubDefaultEditor)' == ''">
65-
<_AllUnityInstallDirs Include="$([System.IO.Directory]::GetDirectories('$(HubInstallDir)'))" />
66-
<_UnityInstalls Condition="$([System.Text.RegularExpressions.Regex]::IsMatch('%(Filename)', '^[\d]{4}.*$'))" Include="@(_AllUnityInstallDirs->'%(Filename)%(Extension)')" />
67-
</ItemGroup>
68-
69-
<!-- Pick the latest one if this version of the Hub doesn't record a default version -->
70-
<PropertyGroup Condition="'$(HubInstallDir)' != '' AND '$(HubDefaultEditor)' == ''">
71-
<HubDefaultEditor>%(_UnityInstalls.Identity)</HubDefaultEditor>
72-
</PropertyGroup>
73-
74-
<PropertyGroup>
75-
<_UnityInnerPath Condition="!$([MSBuild]::IsOSPlatform('OSX'))">Editor\Data</_UnityInnerPath>
76-
<_UnityInnerPath Condition="$([MSBuild]::IsOSPlatform('OSX'))">Unity.App\Contents</_UnityInnerPath>
77-
</PropertyGroup>
78-
79-
<ItemGroup>
80-
<_PotentialUnityPaths Condition="$([MSBuild]::IsOSPlatform('Linux')) AND '$(UNITY_PATH)' != ''" Include="$(UNITY_PATH)\$(_UnityInnerPath)\Managed\UnityEngine.dll" />
81-
<_PotentialUnityPaths Condition="'$(HubInstallDir)' != ''" Include="$(HubInstallDir)\$(UnityVersion)\$(_UnityInnerPath)\Managed\UnityEngine.dll" />
82-
<_PotentialUnityPaths Condition="'$(HubInstallDir)' != '' AND '$(HubDefaultEditor)' != '' AND '$(UnityVersion)' != '$(HubDefaultEditor)'" Include="$(HubInstallDir)\$(HubDefaultEditor)\$(_UnityInnerPath)\Managed\UnityEngine.dll" />
83-
<_PotentialUnityPaths Condition="$([MSBuild]::IsOSPlatform('Windows'))" Include="C:\Program Files\Unity\$(_UnityInnerPath)\Managed\UnityEngine.dll" />
84-
<_PotentialUnityPaths Condition="$([MSBuild]::IsOSPlatform('OSX'))" Include="\Applications\Unity\$(_UnityInnerPath)\Managed\UnityEngine.dll" />
85-
<_UnityPathsFound Include="@(_PotentialUnityPaths->Exists())" />
86-
<_UnityPathsFoundReversed Include="@(_UnityPathsFound->Reverse())" />
87-
</ItemGroup>
31+
<Exec
32+
Command="pwsh -NoProfile -File &quot;$(RepoRoot)scripts/find-unity.ps1&quot; -UnityVersion &quot;$(UnityVersion)&quot; -HubInstallDir &quot;$(HubInstallDir)&quot; -HubDefaultEditor &quot;$(HubDefaultEditor)&quot;"
33+
ConsoleToMSBuild="true">
34+
<Output TaskParameter="ConsoleOutput" PropertyName="_FindUnityOutput" />
35+
</Exec>
8836

8937
<PropertyGroup>
90-
<!--This is a little hack to grab the first item found on the list - properties are repeatedly set for each item on the list, so they end up with the last one (we reversed the list so we get the first one) -->
91-
<_UnityPathProp>%(_UnityPathsFoundReversed.Identity)</_UnityPathProp>
38+
<UnityRoot>$([System.Text.RegularExpressions.Regex]::Match($(_FindUnityOutput), 'UnityRoot=([^;\r\n]+)').Groups[1].Value)</UnityRoot>
39+
<UnityDataPath>$([System.Text.RegularExpressions.Regex]::Match($(_FindUnityOutput), 'UnityDataPath=([^;\r\n]+)').Groups[1].Value)</UnityDataPath>
40+
<UnityManagedPath>$([System.Text.RegularExpressions.Regex]::Match($(_FindUnityOutput), 'UnityManagedPath=([^;\r\n]+)').Groups[1].Value)</UnityManagedPath>
41+
<UnityLibcache>$(UnityDataPath)Resources/PackageManager/ProjectTemplates/libcache/</UnityLibcache>
9242
</PropertyGroup>
9343

94-
<Message
95-
Condition="'$(UnityVersion)' != '' AND '$(HubInstallDir)' != '' AND !Exists('$(HubInstallDir)\$(UnityVersion)\$(_UnityInnerPath)\Managed\UnityEngine.dll') AND '$(_UnityPathProp)' != ''"
96-
Text="Unity version $(UnityVersion) is not installed. Falling back to default Unity installation."
97-
Importance="High" />
98-
99-
<ItemGroup>
100-
<!-- Turn the property back into an item so we can use DirectoryName() below. -->
101-
<_UnityPath Include="$(_UnityPathProp)" />
102-
</ItemGroup>
103-
104-
<PropertyGroup Condition="'$(_UnityPathProp)' != ''">
105-
<UnityManagedPath>@(_UnityPath->DirectoryName())\</UnityManagedPath>
106-
<UnityDataPath>@(_UnityPath->DirectoryName()->DirectoryName())\</UnityDataPath>
107-
<UnityRoot>@(_UnityPath->DirectoryName()->DirectoryName()->DirectoryName())\</UnityRoot>
108-
<UnityLibcache>$(UnityDataPath)Resources\PackageManager\ProjectTemplates\libcache\</UnityLibcache>
109-
</PropertyGroup>
110-
111-
<Error Condition="'$(UnityRoot)' == ''" Text="UnityRoot not found. Ensure Unity is installed.
112-
See the CONTRIBUTING.md.
113-
UnityVersion: '$(UnityVersion)'
114-
Expected to exist:
115-
* @(_PotentialUnityPaths, '%0a or %0a * ')" />
116-
44+
<Error Condition="'$(UnityRoot)' == ''" Text="UnityRoot not resolved — see scripts/find-unity.ps1 output above." />
11745

11846
<!-- Unity paths on Windows -->
11947
<PropertyGroup Condition="$([MSBuild]::IsOSPlatform('Windows'))">

scripts/find-unity.ps1

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
#!/usr/bin/env pwsh
2+
# Locate a Unity installation and emit the paths the build needs.
3+
#
4+
# Output (stdout, one per line):
5+
# UnityRoot=<dir containing the Unity executable, trailing slash>
6+
# UnityDataPath=<dir containing the Editor data, trailing slash>
7+
# UnityManagedPath=<dir containing UnityEngine.dll, trailing slash>
8+
#
9+
# Warnings + the "candidates tried" error go to stderr. Exits non-zero on failure.
10+
11+
[CmdletBinding()]
12+
param (
13+
[string] $UnityVersion = '',
14+
[string] $HubInstallDir = '',
15+
[string] $HubDefaultEditor = ''
16+
)
17+
18+
$ErrorActionPreference = 'Stop'
19+
20+
function Read-HubFile([string] $path) {
21+
if (-not (Test-Path $path)) { return '' }
22+
# Unity Hub writes a single quoted string per file (not strict JSON).
23+
return (Get-Content -Raw $path).Trim().Trim('"')
24+
}
25+
26+
# --- Resolve Hub install dir + default editor -------------------------------
27+
28+
# AppData is Windows-only; on macOS/Linux we just rely on the platform default below.
29+
$hubConfigDir = if ($env:APPDATA) { Join-Path $env:APPDATA 'UnityHub' } else { '' }
30+
31+
if (-not $HubInstallDir -and $hubConfigDir) {
32+
$HubInstallDir = Read-HubFile (Join-Path $hubConfigDir 'secondaryInstallPath.json')
33+
}
34+
if (-not $HubInstallDir) {
35+
$HubInstallDir = if ($IsWindows) { 'C:/Program Files/Unity/Hub/Editor' }
36+
elseif ($IsMacOS) { '/Applications/Unity/Hub/Editor' }
37+
elseif ($IsLinux) { Join-Path $env:HOME 'Unity/Hub/Editor' }
38+
}
39+
if (-not (Test-Path $HubInstallDir)) { $HubInstallDir = '' }
40+
41+
if (-not $HubDefaultEditor -and $hubConfigDir) {
42+
$HubDefaultEditor = Read-HubFile (Join-Path $hubConfigDir 'defaultEditor.json')
43+
if ($HubDefaultEditor -and -not (Test-Path (Join-Path $HubInstallDir $HubDefaultEditor))) {
44+
$HubDefaultEditor = ''
45+
}
46+
}
47+
# Fallback: pick the highest version-named dir under the hub install root.
48+
if (-not $HubDefaultEditor -and $HubInstallDir) {
49+
$HubDefaultEditor = Get-ChildItem -Path $HubInstallDir -Directory -ErrorAction SilentlyContinue |
50+
Where-Object Name -Match '^\d{4}' |
51+
Sort-Object Name -Descending |
52+
Select-Object -First 1 -ExpandProperty Name
53+
}
54+
55+
# --- Build the probe list ---------------------------------------------------
56+
57+
# Layout pieces. macOS Unity ships as a .app bundle so the inner path differs.
58+
$inner = if ($IsMacOS) { 'Unity.app/Contents' } else { 'Editor/Data' }
59+
$rootName = if ($IsMacOS) { 'Unity.app' } else { 'Editor' }
60+
61+
# Each "install" candidate is a directory like <hub>/<version>/ that contains
62+
# either Editor/ (win/linux) or Unity.app/ (mac).
63+
$installs = [System.Collections.Generic.List[string]]::new()
64+
if ($IsLinux -and $env:UNITY_PATH) { $installs.Add($env:UNITY_PATH) }
65+
if ($HubInstallDir -and $UnityVersion) { $installs.Add((Join-Path $HubInstallDir $UnityVersion)) }
66+
if ($HubInstallDir -and $HubDefaultEditor -and $UnityVersion -ne $HubDefaultEditor) {
67+
$installs.Add((Join-Path $HubInstallDir $HubDefaultEditor))
68+
}
69+
if ($IsWindows) { $installs.Add('C:/Program Files/Unity') }
70+
if ($IsMacOS) { $installs.Add('/Applications/Unity') }
71+
72+
# Unity 6000.3+ moved managed assemblies under Resources/Scripting/Managed.
73+
# Probe the new layout first within each install.
74+
$dllRelatives = @('Resources/Scripting/Managed/UnityEngine.dll', 'Managed/UnityEngine.dll')
75+
76+
function Find-UnityDll([string] $install) {
77+
foreach ($rel in $dllRelatives) {
78+
$dll = Join-Path $install (Join-Path $inner $rel)
79+
if (Test-Path $dll) { return $dll }
80+
}
81+
return $null
82+
}
83+
84+
# Did the requested-version install yield a DLL? Drives the fallback warning below.
85+
$expected = if ($UnityVersion -and $HubInstallDir) { Join-Path $HubInstallDir $UnityVersion } else { '' }
86+
$shouldWarnFallback = $expected -and -not (Find-UnityDll $expected)
87+
88+
$tried = [System.Collections.Generic.List[string]]::new()
89+
90+
foreach ($install in $installs) {
91+
$dll = Find-UnityDll $install
92+
if (-not $dll) {
93+
$dllRelatives | ForEach-Object { $tried.Add((Join-Path $install (Join-Path $inner $_))) }
94+
continue
95+
}
96+
97+
if ($shouldWarnFallback) {
98+
Write-Warning "Unity version $UnityVersion is not installed. Falling back to default Unity installation."
99+
}
100+
101+
$unityRoot = (Join-Path $install $rootName) + '/'
102+
$unityDataPath = (Join-Path $install $inner) + '/'
103+
$unityManagedPath = (Split-Path $dll -Parent) + '/'
104+
105+
# Normalize to forward slashes — MSBuild accepts both, and it keeps the output diff-clean across platforms.
106+
Write-Output ("UnityRoot=" + ($unityRoot -replace '\\', '/'))
107+
Write-Output ("UnityDataPath=" + ($unityDataPath -replace '\\', '/'))
108+
Write-Output ("UnityManagedPath=" + ($unityManagedPath -replace '\\', '/'))
109+
exit 0
110+
}
111+
112+
$msg = @"
113+
Unity installation not found. See CONTRIBUTING.md.
114+
UnityVersion: '$UnityVersion'
115+
Expected one of:
116+
* $($tried -join "`n * ")
117+
"@
118+
Write-Error $msg
119+
exit 1

src/Sentry.Unity.Android/SentryJava.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,11 @@ public void Init(SentryUnityOptions options)
140140
androidOptions.Call("setEnableScopeSync", options.NdkScopeSyncEnabled);
141141
androidOptions.Call("setNativeSdkName", "sentry.native.android.unity");
142142

143+
androidOptions.Call("setAnrEnabled", options.AndroidNativeAnrEnabled);
144+
androidOptions.Call("setEnableScopePersistence", options.AndroidNativeAnrEnabled);
145+
androidOptions.Call("setReportHistoricalAnrs", options.AndroidReportHistoricalAnrs);
146+
androidOptions.Call("setAttachAnrThreadDump", options.AndroidAttachAnrThreadDump);
147+
143148
using (var logsOptions = androidOptions.Call<AndroidJavaObject>("getLogs"))
144149
{
145150
logsOptions.Call("setEnabled", options.EnableLogs);
@@ -158,8 +163,6 @@ public void Init(SentryUnityOptions options)
158163
androidOptions.Call("setAttachScreenshot", false);
159164
androidOptions.Call("setEnableAutoSessionTracking", false);
160165
androidOptions.Call("setEnableActivityLifecycleBreadcrumbs", false);
161-
androidOptions.Call("setAnrEnabled", false);
162-
androidOptions.Call("setEnableScopePersistence", false);
163166
// Disable user interaction tracking to prevent conflicts with VR platforms (e.g., Oculus InputHooks)
164167
androidOptions.Call("setEnableUserInteractionBreadcrumbs", false);
165168
androidOptions.Call("setEnableUserInteractionTracing", false);

src/Sentry.Unity.Editor/Android/AndroidManifestConfiguration.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,9 @@ internal void ModifyManifest(string basePath)
218218
androidManifest.SetAutoTraceIdGeneration(false);
219219
androidManifest.SetAutoSessionTracking(false);
220220
androidManifest.SetAutoAppLifecycleBreadcrumbs(false);
221-
androidManifest.SetAnr(false);
222-
androidManifest.SetPersistentScopeObserver(false);
221+
androidManifest.SetAnr(_options.AndroidNativeAnrEnabled);
222+
androidManifest.SetPersistentScopeObserver(_options.AndroidNativeAnrEnabled);
223+
androidManifest.SetAttachAnrThreadDump(_options.AndroidAttachAnrThreadDump);
223224
// Disable user interaction tracking to prevent conflicts with VR platforms (e.g., Oculus InputHooks)
224225
androidManifest.SetEnableUserInteractionBreadcrumbs(false);
225226
androidManifest.SetEnableUserInteractionTracing(false);
@@ -495,6 +496,9 @@ internal void SetAnr(bool enableAnr)
495496
internal void SetPersistentScopeObserver(bool enableScopePersistence)
496497
=> SetMetaData($"{SentryPrefix}.enable-scope-persistence", enableScopePersistence.ToString());
497498

499+
internal void SetAttachAnrThreadDump(bool attachAnrThreadDump)
500+
=> SetMetaData($"{SentryPrefix}.anr.attach-thread-dumps", attachAnrThreadDump.ToString());
501+
498502
internal void SetNdkEnabled(bool enableNdk)
499503
=> SetMetaData($"{SentryPrefix}.ndk.enable", enableNdk.ToString());
500504

src/Sentry.Unity/SentryUnityOptions.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,36 @@ public sealed class SentryUnityOptions : SentryOptions
214214
/// </remarks>
215215
public NativeInitializationType AndroidNativeInitializationType { get; set; } = NativeInitializationType.Runtime;
216216

217+
/// <summary>
218+
/// Enables ANR detection on Android through the native (sentry-java) SDK.
219+
/// On API ≥ 30 this uses Android's <c>ApplicationExitInfo</c> to report ANRs detected by the OS
220+
/// in prior runs (ANR v2). On API &lt; 30, sentry-java falls back to its in-process watchdog.
221+
/// The Unity SDK's C# ANR watchdog continues to run on all API levels.
222+
/// </summary>
223+
/// <remarks>
224+
/// The Java and C# watchdogs observe different threads and are complementary: the Java watchdog
225+
/// monitors the Android UI (Looper) main thread, while the C# watchdog monitors the Unity engine
226+
/// main thread (the player loop). A hang that blocks both threads can produce one event from each.
227+
/// </remarks>
228+
public bool AndroidNativeAnrEnabled { get; set; } = true;
229+
230+
/// <summary>
231+
/// When <see cref="AndroidNativeAnrEnabled"/> is enabled, controls whether sentry-java reports historical ANRs
232+
/// recorded by the OS (<c>ApplicationExitInfo</c>) from prior runs. Has no effect when
233+
/// <see cref="AndroidNativeAnrEnabled"/> is <c>false</c>.
234+
/// </summary>
235+
/// <remarks>
236+
/// Runtime-only. There is no <c>AndroidManifest</c> meta-data tag for this option, so it is only
237+
/// applied when <see cref="AndroidNativeInitializationType"/> is <see cref="NativeInitializationType.Runtime"/>.
238+
/// </remarks>
239+
public bool AndroidReportHistoricalAnrs { get; set; } = false;
240+
241+
/// <summary>
242+
/// When <see cref="AndroidNativeAnrEnabled"/> is enabled, controls whether sentry-java attaches a thread dump
243+
/// to ANR events. Has no effect when <see cref="AndroidNativeAnrEnabled"/> is <c>false</c>.
244+
/// </summary>
245+
public bool AndroidAttachAnrThreadDump { get; set; } = false;
246+
217247
/// <summary>
218248
/// Whether the SDK should add the NDK integration for Android
219249
/// </summary>

test/Sentry.Unity.Editor.Tests/Android/AndroidManifestConfigurationTests.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,41 @@ public void ModifyManifest_UnityOptions_AndroidNativeSupportEnabled_InitTypeBuil
150150
StringAssert.Contains($"<meta-data android:name=\"io.sentry.dsn\" android:value=\"{_fixture.SentryUnityOptions.Dsn}\" />", manifest);
151151
}
152152

153+
[Test]
154+
public void ModifyManifest_AndroidNativeAnrEnabled_True_WritesAnrMetadataEnabled()
155+
{
156+
_fixture.SentryUnityOptions!.AndroidNativeAnrEnabled = true;
157+
var sut = _fixture.GetSut();
158+
159+
var manifest = WithAndroidManifest(basePath => sut.ModifyManifest(basePath));
160+
161+
StringAssert.Contains("<meta-data android:name=\"io.sentry.anr.enable\" android:value=\"True\" />", manifest);
162+
StringAssert.Contains("<meta-data android:name=\"io.sentry.enable-scope-persistence\" android:value=\"True\" />", manifest);
163+
}
164+
165+
[Test]
166+
public void ModifyManifest_AndroidNativeAnrEnabled_False_WritesAnrMetadataDisabled()
167+
{
168+
_fixture.SentryUnityOptions!.AndroidNativeAnrEnabled = false;
169+
var sut = _fixture.GetSut();
170+
171+
var manifest = WithAndroidManifest(basePath => sut.ModifyManifest(basePath));
172+
173+
StringAssert.Contains("<meta-data android:name=\"io.sentry.anr.enable\" android:value=\"False\" />", manifest);
174+
StringAssert.Contains("<meta-data android:name=\"io.sentry.enable-scope-persistence\" android:value=\"False\" />", manifest);
175+
}
176+
177+
[Test]
178+
public void ModifyManifest_AndroidAttachAnrThreadDump_FlowsThroughToManifest()
179+
{
180+
_fixture.SentryUnityOptions!.AndroidAttachAnrThreadDump = true;
181+
var sut = _fixture.GetSut();
182+
183+
var manifest = WithAndroidManifest(basePath => sut.ModifyManifest(basePath));
184+
185+
StringAssert.Contains("<meta-data android:name=\"io.sentry.anr.attach-thread-dumps\" android:value=\"True\" />", manifest);
186+
}
187+
153188
[Test]
154189
public void ModifyManifest_ManifestHasDsn()
155190
{

0 commit comments

Comments
 (0)