Repro Steps for Android
Capture repro steps automatically in your Android app with Luciq. Record user interactions to help developers quickly reproduce and resolve reported bugs.
Repro Steps show you all of the interactions a user makes with your app up until a bug or crash is reported, grouped by the app view. For each view that a user visits, all of the steps that they commit are captured and displayed as logs next to the relevant screenshot. Repro steps can be found below the bug details.

Logged Data
Captured Events
UI Interactions
For the following gestures, only the gesture is logged and displayed:
Swipe
Scroll
Pinch
Tap
Double tap
Enabling/disabling a switch
Changing the value of a slider
Editing a text field.
Lifecycle Events
Whenever one of the following lifecycle events occurs, it will be captured and shown on the timeline:
Application is moved to the background
Application is moved to the foreground
Application becomes active
Application becomes inactive
Extra Details
Depending on the event, you'll find further details displayed as part of the log statement.
Tap and double tap: the SDK always tries to first capture the text rendered inside the UI that the user is interacting with, then we fall back to capturing the icon only with the buttons and navigation items, then, we fall back to the accessibility labels.
Switch: both the accessibility label as well as whether the user enabled or disabled the switch are logged.
Slider: both the accessibility label as well as the value that the user moves the slider to it are captured.
Text fields: first, the SDK tries to capture the placeholder, then we fall back to the accessibility label.
Examples
Here are some examples of how steps look like:
Tapped on the button "Send"Double tapped on UI that contains "Instructions"Started editing “Password“Enabled the switch “Push Notifications“Moved the slider “Text Size“ to 10%App went to the backgroundApp became active

User Privacy
Disclaimer
A disclaimer will be shown at the bottom of the report. It helps your users view all the screenshots taken for the Repro Steps before sending a report and can delete them as well.

Private Views
On your side, you can easily mark any view that might contain sensitive info like payment details as private. Any private view will automatically appear with a black overlay covering it in any screenshot.
Effect of Private Views
When adding a view to the list of private views, here are the list of things it will affect:
Views will be blacked out in screenshots
Views will be blacked out in repro steps
Views will be blacked out in the View Hierarchy. Text views will be replaced with ****
Videos will not be blacked out due to limitations regarding media projection
To black out screens in videos/screen recording, you can use Android’s FLAG SECURE
Adding Private Views
To make a view private, you use the following method:
Removing Private Views
If you'd like to remove a view from the list of private views, use the following method:
View Content Capture
This API requires a minimum Android SDK version of 19.7.0.
By default, Luciq captures view content — such as text and accessibility labels — to enrich User Steps and Repro Steps with context like Tapped on the button "Send". If you'd prefer to keep those events without their content, you can disable view content capture entirely.
When disabled, captured events still fire and include the gesture, view class, and screen name, but view text and labels are redacted using the same non-identifying descriptors as Private Views. For example, Tapped on the button "Send" becomes a redacted descriptor instead.
Scope
This setting only affects User Steps and Repro Steps content. It does not affect Session Replay screenshots , bug-report screenshots or crash-report screenshots . To mask content in screenshots, use Auto Masking.
This API is runtime-only and resets to its default value on each SDK build, so make sure to call it after the SDK is initialized.
enabled: Boolean — Passtrueto capture view content (default), orfalseto redact view text and labels while preserving the underlying events.
Auto Masking
Good To Know
This feature requires a minimum Android SDK version of 11.13.0
Auto Masking is supported only in screenshots (Repro Steps), not screen recordings.
Starting from SDK version 19.2.0, the default value is
WEBVIEWS. WebViews are masked by default in screenshots to protect potentially sensitive content.
This feature automatically masks sensitive data when screenshots are captured while protecting the user's privacy by default. This affects Bugs Reporting, Crash Reporting and Session Replay.

Here are all the possible parameters.

Examples
Java: Luciq.setAutoMaskScreenshotsTypes(MaskingType.TEXT_INPUTS) Kotlin: Luciq.setAutoMaskScreenshotsTypes(MaskingType.TEXT_INPUTS)
Mask Text Inputs only.
Java: Luciq.setAutoMaskScreenshotsTypes(MaskingType.TEXT_INPUTS, MaskingType.LABELS) Kotlin: Luciq.setAutoMaskScreenshotsTypes(MaskingType.TEXT_INPUTS, MaskingType.LABELS)
Mask Text Inputs and Labels.
Java: Luciq.setAutoMaskScreenshotsTypes(MaskingType.MASK_NOTHING) Kotlin: Luciq.setAutoMaskScreenshotsTypes(MaskingType.MASK_NOTHING)
Disable auto masking.
The Private Views API takes precedence over Auto Masking.
Disabling and Enabling
Repro Steps is by default enabled with screenshots for both bug reporting and session replay and enabled without screenshots for crash reporting.
You can change the value of the Issue Type.
You can change the value of ReproMode.
Then configure the SDK
Examples
Java: ReproConfigurations configurations = new ReproConfigurations.Builder() .setIssueMode(IssueType.All, ReproMode.EnableWithScreenshots) .build(); Luciq.setReproConfigurations(configurations); Kotlin: val configurations = ReproConfigurations.Builder() .setIssueMode(IssueType.All, ReproMode.EnableWithScreenshots) .build() Luciq.setReproConfigurations(configurations)
Enable with Screenshots for both Bug Reporting and Crash Reporting.
Java: ReproConfigurations configurations = new ReproConfigurations.Builder() .setIssueMode(IssueType.Crash, ReproMode.EnableWithNoScreenshots) .build(); Luciq.setReproConfigurations(configurations); Kotlin: val configurations = ReproConfigurations.Builder() .setIssueMode(IssueType.Crash, ReproMode.EnableWithNoScreenshots) .build() Luciq.setReproConfigurations(configurations)
Enable with No Screenshots for Crash Reporting.
Java: ReproConfigurations configurations = new ReproConfigurations.Builder() .setIssueMode(IssueType.Bug, ReproMode.EnableWithScreenshots) .build(); Luciq.setReproConfigurations(configurations); Kotlin: val configurations = ReproConfigurations.Builder() .setIssueMode(IssueType.Bug, ReproMode.EnableWithScreenshots) .build() Luciq.setReproConfigurations(configurations)
Enable with Screenshots for Bug Reporting.
Java: ReproConfigurations configurations = new ReproConfigurations.Builder() .setIssueMode(IssueType.All, ReproMode.Disable) .build(); Luciq.setReproConfigurations(configurations); Kotlin: val configurations = ReproConfigurations.Builder() .setIssueMode(IssueType.All, ReproMode.Disable) .build() Luciq.setReproConfigurations(configurations)
Completely disable for both Bug Reporting and Crash Reporting.
Screenshots are by default disabled for Crash Reporting.
For Crash Reporting, screenshots are by default disabled; however, if you are looking to enable screenshots in Crash Reporting, make sure to use the Auto Masking API. This API will automatically help you mask sensitive data in screenshots to protect the end-users' privacy.
Handling Screenshots and Mitigating Overhead
If screenshots are enabled, we capture a screenshot whenever a screen is changed, then attach this info to Crash Reporting and Session Replay. However, we have mitigation methods to avoid causing performance overhead on the device. If this happens, we pause the screenshot-capturing process when we detect that the device has any of the following states, and continue capturing screenshots after the device returns to normal:
High CPU throughput
High RAM utilization
Low-disk storage
Container Screen Capture
This API requires a minimum Android SDK version of 19.7.1.
By default, Luciq captures a Repro Steps screenshot for every screen the user visits, including container screens — Activities, Fragments, and DialogFragments. In apps with deeply nested navigation (for example, Activity → HostFragment → FlowHostFragment → ScreenFragment → Composable), these container screens can consume the screenshot budget without adding meaningful visual context.
You have the option to skip screenshots for container screens so that the budget is preserved for the leaf screens that display actual content. When disabled, only Compose screens, tab selections, and WebView navigations produce screenshots in the Repro Steps timeline.
Scope
This setting only affects Repro Steps screenshots for container screens. The underlying navigation events are still captured — only their screenshots are skipped.
This API is runtime-only and resets to its default value on each SDK build, so make sure to call it after the SDK is initialized.
enabled: Boolean — Passtrueto capture container screen screenshots (default), orfalseto skip them while preserving the underlying navigation events.
Last updated