You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Platform affected: Android only (not reproduced on iOS).
Sentry.init()
constmobileReplayIntegration=Sentry.mobileReplayIntegration({maskAllText: true,maskAllImages: false,maskAllVectors: false,enableViewRendererV2: true,beforeErrorSampling: shouldCaptureReplayForError,// gates buffer-mode replay by error type});Sentry.init({dsn: "https://...@sentry.io/...",integrations: [mobileReplayIntegration,navigationIntegration],replaysSessionSampleRate: 0.00125,// 0.125%replaysOnErrorSampleRate: 1.0,// in the environment used to reproducereplaysSessionQuality: "high",// tested with medium alsoautoInitializeNativeSdk: false,});
Steps to Reproduce
Build and run the Android app (New Architecture / Fabric enabled, Hermes enabled) with Session Replay configured as above (maskAllText: true).
Navigate to a screen containing unmasked text content, inside a ScrollView.
Trigger Sentry.captureException() (we tested via a useEffect timer firing ~4s after mount, to rule out any custom touch-target/overlay interaction as the cause) while the replay is recording (both replaysSessionSampleRate: 1.0 session-mode and default buffer-mode via replaysOnErrorSampleRate were tested — same result in both).
Also independently reproduced by scrolling the ScrollView on the same screen — masked areas become visible mid-scroll.
Inspect the resulting replay recording in the Sentry dashboard.
Expected Result
Masked text/content (per maskAllText: true) should remain masked in the recorded replay at all times, including at the moment an error is captured and during scroll gestures.
Actual Result
In the replay recording, previously-masked text/content becomes fully visible (unmasked) for roughly 1-2 seconds:
At the exact moment captureException fires (reproduced independent of any UI trigger mechanism — confirmed via a useEffect-based timer with no user interaction involved).
Independently, during scroll gestures on the same screen (masked areas flash visible mid-scroll, even without any error being captured).
Both behaviors were reproduced only on Android; not observed on iOS with the same masking config. We suspect this is related to how the Android masking overlay/screenshot pipeline (PixelCopy vs Canvas strategy, and whether New Architecture forces one over the other) recomputes mask positions relative to when the underlying screenshot is captured — see related discussion in #6122 (Fabric forces Canvas strategy, ignoring masking options) and #3978 (masked content briefly unmasked on native layout/hierarchy changes, e.g. modal open) which describes the same class of failure (mask desync on layout-affecting events) but not this exact repro (scroll + error-capture timing on Fabric/New Architecture).
What React Native libraries do you use?
Are you using sentry.io or on-premise?
sentry.io (SaaS)
Are you using any other error monitoring solution alongside Sentry?
No
@sentry/react-native SDK Version
8.16.0
How does your development environment look like?
Platform affected: Android only (not reproduced on iOS).
Sentry.init()
Steps to Reproduce
maskAllText: true).ScrollView.Sentry.captureException()(we tested via auseEffecttimer firing ~4s after mount, to rule out any custom touch-target/overlay interaction as the cause) while the replay is recording (bothreplaysSessionSampleRate: 1.0session-mode and default buffer-mode viareplaysOnErrorSampleRatewere tested — same result in both).ScrollViewon the same screen — masked areas become visible mid-scroll.Expected Result
Masked text/content (per
maskAllText: true) should remain masked in the recorded replay at all times, including at the moment an error is captured and during scroll gestures.Actual Result
In the replay recording, previously-masked text/content becomes fully visible (unmasked) for roughly 1-2 seconds:
captureExceptionfires (reproduced independent of any UI trigger mechanism — confirmed via auseEffect-based timer with no user interaction involved).Both behaviors were reproduced only on Android; not observed on iOS with the same masking config. We suspect this is related to how the Android masking overlay/screenshot pipeline (PixelCopy vs Canvas strategy, and whether New Architecture forces one over the other) recomputes mask positions relative to when the underlying screenshot is captured — see related discussion in #6122 (Fabric forces Canvas strategy, ignoring masking options) and #3978 (masked content briefly unmasked on native layout/hierarchy changes, e.g. modal open) which describes the same class of failure (mask desync on layout-affecting events) but not this exact repro (scroll + error-capture timing on Fabric/New Architecture).
Screenshots
Screen.Recording.2026-07-02.at.13.58.26.mov