Screen & Screenshot Masking
How masking works
Masking is applied on-device at screenshot-capture time, before the image is written to encrypted local storage or uploaded. Private regions are painted directly into the bitmap, so a raw, un-masked image is never stored or sent.
Two complementary controls are available and can be combined; manual marking stacks on top of the automatic type-based rules.
Automatic (type-based)
A blanket “mask every view of type X” safety net
All views of the declared type(s), app-wide
Manual (per-view)
Surgical — this specific view or subtree contains PII
The view and all of its descendants
Defaults & minimum versions
iOS auto type-based masking
Disabled (maskNothing)
iOS 11.12.0
WebView masking (iOS & Android)
On (WebViews masked)
19.3.0
Auto masking in Jetpack Compose (Android)
Enabled
13.4.0
Flutter auto masking
Disabled
Luciq SDK - 18.0.0 Instabug SDK - 16.0.0
Flutter private views (enablePrivateViews)
Enabled
Luciq SDK - 18.0.0 Instabug SDK - 16.0.0
Network key masking
Disabled
14.2.0
Repro Steps
Enabled Screenshots on for bug + session replay; off for crash (crash screenshots always disabled)
—
User Steps Privacy API
Disabled
19.7.0 on Android 19.7.0 on iOS
Automatic (type-based) masking
A single API call configures blanket rules applied to every screenshot the SDK captures. Available masking types:
MASK_NOTHING
Disables all automatic masking
TEXT_INPUTS
Every text input field (EditText / Compose TextField, iOS UITextField / UITextView)
LABELS
Every text label / static text (TextView / Compose Text)
MEDIA
Every image or media view (ImageView / Compose Image)
WEB_VIEWS
Every WebView
Android
iOS
ReactNative
Flutter
Manual (per-view) masking
For specific views, mark the view itself rather than relying on type-based rules. Marking a ViewGroup or Compose parent automatically masks every descendant. The flag works on any view reference — including views inflated at runtime from server JSON — with no compile-time annotation, manifest entry, or XML attribute required.
Private-view behavior
Black overlay — the entire view area renders as a solid black rectangle.
Subtree masked — all child views are masked as well.
Real-time — masking applies to all screenshots captured during the session.
Precedence: on every platform the private-view API takes precedence over auto masking. Wrapping/marking a view as private is the way to guarantee it is always masked.
Android — classic views
Android — Jetpack Compose
iOS — SwiftUI & UIKit
React Native
Flutter
Masking and screen recording
Screen-recording behavior by platform
Private views — iOS
Masked
Masked
Private views — Android
Masked
Not masked — use FLAG_SECURE
Auto type-based masking
Masked
Not applied
Last updated