2.21.1 (2026-08-10)
🐛 Bug Fixes
- Fixed an ANR risk in apps with heavy touch activity: the SDK no longer performs logging work on the main thread for every touch event.
- Network requests reported through
CoralogixRum.reportNetworkRequest — including those from the React Native and Flutter integrations — no longer show a duration of 0; the duration is now consistently handled as milliseconds on every capture path.
- Failed network requests captured by the OkHttp interceptor now report the elapsed time until the failure instead of a duration of 0.
2.21.0 (2026-08-10)
🚀 Features
- Buffered events are now flushed automatically when the app enters the background, so telemetry from the end of a session is no longer lost when the process is killed while backgrounded. The export starts immediately on the background transition; a WorkManager job is enqueued alongside it as a backstop, in case the export does not finish before the system suspends the process.
- The flush is triggered once per process-level background transition, not on activity-to-activity navigation.
- The flush is independent of the configured instrumentations — disabling the
Lifecycle instrumentation does not disable it.
- Adds a dependency on
androidx.work:work-runtime-ktx. Apps that replace the default androidx.startup WorkManager initializer with on-demand initialization keep the immediate flush but skip the backstop job.
2.20.0 (2026-08-09)
🔒 Privacy
- Changed since 2.19.4: user interaction events for a masked element redact only its inner text, matching the Coralogix web SDK. The id, class, resolved element name, and touch coordinates are reported as-is again.
- Interaction events now carry
interaction_context.is_masked_element (always present), so a beforeSend callback can drop masked interactions or blank their coordinates — see the README for recipes.
- Interactions reported through the hybrid bridge (React Native, Flutter) now redact the inner text of masked elements too; previously they were reported in clear.
UserInteractionDetails accepts an optional isMasked so hybrid wrappers that track their own masking can report it directly.
- Tap markers are now suppressed over masked Flutter content, including older Flutter integrations where masked regions appear black.
2.19.4 (2026-08-04)
🔒 Privacy
- Masking now applies to everything inside a masked view or composable, not just the element it was applied to. Masking a container is enough to cover its contents. One exception: a View embedded via Compose's
AndroidView { } does not inherit its enclosing composable's masking — mask it directly with maskView().
- Tapping inside a masked area no longer draws a tap marker in session replays, so a recording of a masked keypad no longer reveals which keys were pressed.
- User interaction events for a masked element, or anything inside one, now report
*** for its text, id, class, and resolved element name. Previously the element's resource name identified it — for a keypad laid out as key_0…key_9 that alone revealed the entered sequence.
- Interaction events are still reported for masked elements and still carry their touch coordinates.
- All Coralogix artifacts must ship under the same version. A mismatched Compose module no longer takes the app down at launch: Compose tracking is disabled and the mismatch is logged.
🐛 Bug Fixes
- Send snapshot context when setUserContext is triggered
- Fixed a memory leak that kept a destroyed
Activity and its whole view tree in memory after a tap on a non-clickable area, or after a scroll or swipe, until the next tap elsewhere in the app.
2.19.3 (2026-08-02)
🐛 Bug Fixes
- Fixed a memory leak that retained every on-screen
Activity for the life of the process when the app also uses LeakCanary, Radiography, or another library that tracks window changes.
- Those libraries keep reporting correctly after the SDK initializes; previously the SDK stopped them from seeing new windows.
- User interaction tracking and session replay no longer go stale when another library starts tracking windows after the SDK has initialized.
2.19.2 (2026-07-30)
🐛 Bug Fixes
- Fixed events being dropped during a session change when per-session sampling is in use.
2.19.1 (2026-07-27)
📦 Version alignment
- No changes. Republished so the Compose module, whose 2.19.0 never reached Maven Central, ships in sync with the core.
2.19.0 (2026-07-27)
🚀 Features
- Added
isSessionSampledIn to EditableCxRum (and session_context on the wire) — beforeSend can now tell whether an event belongs to a sampled-in session or arrived only via excludeFromSampling, e.g. to keep just ANRs and crashes when the session sample rate is low.
reportError(throwable, ...) now accepts optional data and labels, so a handled error can carry structured data and per-event labels in a single call instead of a separate log().
🐛 Bug Fixes
- Call-site labels (from
reportError, log, custom spans, and time measurements) now take precedence over SDK-level labels set via setLabels when a key exists in both, matching the iOS SDK; previously the SDK-level value overwrote the call-site value.
2.18.0 (2026-07-20)
🚀 Features
- Added
CoralogixRum.flush(onComplete) — forces an immediate export of queued telemetry and invokes the callback once the export/upload attempt finishes (immediately when the SDK is not initialized), so a crash can be delivered before the process terminates.
🐛 Bug Fixes
- Crash events now ship immediately instead of waiting for the batch interval: reporting an
isCrash error force-flushes, and the uncaught-exception handler actively drains telemetry before handing off to the previous handler, so a crash is far less likely to die with the process.
- On the hybrid (React Native / Flutter) path, crash events upload directly instead of taking the
beforeSend round trip to the host layer and back, so a dying process is not racing the extra hop.
2.17.2 (2026-07-09)
🐛 Bug Fixes
- Raised the network timeout for RUM data and Session Replay frames from 10s to 45s, so sends on slow connections no longer time out and drop telemetry.
2.17.1 (2026-07-05)
🐛 Bug Fixes
- Fixed
view_number being dropped for the rest of a session after a session rotation while staying on the same screen. The current view is now re-stamped as view 0 on rotation, matching iOS.
2.17.0 (2026-07-05)
🚀 Features
- Added
createNewSession() to start a fresh session on demand (e.g. on logout) without re-initializing the SDK.
2.16.3 (2026-06-29)
🐛 Bug Fixes
- Fixed Flutter Session Replay tap frames rendering as a black screen on slower devices. Native now waits for the masked bitmap instead of discarding it after one vsync.
2.16.2 (2026-06-24)
🐛 Bug Fixes
- Fixed
beforeSend edits (e.g. redacting a URL) on React Native applying to the RUM event but not the matching OpenTelemetry span attributes; both now reflect the edit.
2.16.1 (2026-06-15)
🐛 Bug Fixes
- Fixed crashes caused by reading the view hierarchy off the main thread.
Display.getViewHierarchy() is now marshalled onto the main thread and returns null on failure/timeout instead of emitting an empty hierarchy.
2.16.0 (2026-06-09)
🚀 Features
- Added
view_number and isNavigationEvent to every RUM event under cx_rum for product analytics. Mirrors iOS/Browser.
2.15.1
📦 Version alignment
- The SDK, Compose module, and Gradle Plugin now all ship under the same version number.
2.15.0 (2026-06-08)
🚀 Features
- The SDK now emits a
session_replay_init internal event with the resolved session-replay configuration when SessionReplay.initialize() succeeds.
2.14.1 (2026-06-07)
🐛 Bug Fixes
beforeSend edits now apply to both the RUM payload (text.cx_rum.*) and the OTLP attribute mirror; previously redactions landed on the RUM payload only.
beforeSend can no longer forge spanId, traceId, parentSpanId, or isSnapshotEvent — these are restored from the original. Mirrors iOS.
- Parity fixes between the init-time and
beforeSend attribute paths for labels and session_creation_date.
2.14.0 (2026-06-07)
🐛 Bug Fixes
- Fixed session-replay mask skew (masks drifting behind text during scroll) for classic Views.
- Fixed misaligned Flutter session-replay masks via the new
flutterViewBitmapProvider path.
containsCompose() view-hierarchy walk now runs on the main thread.
frameCapturer.cleanup() is now called from SessionReplayInternal.shutdown(), so draw listeners stop firing after shutdown.
- Bitmap is now recycled if
copyPixelsFromBuffer throws.
NetworkConnectivityMonitor no longer crashes with ConcurrentModificationException when listeners change during a callback.
🚀 Features
SessionReplayOptions.flutterViewBitmapProvider: optional suspend callback for Flutter hosts to composite a pre-masked bitmap into each frame.
2.13.0 (2026-06-03)
🚀 Features
- Added optional
customAttributes parameter to CoralogixErrorDecorator, emitted under errorContext.data. Defaults to null, so existing calls are unaffected. Matches iOS.
2.12.2 (2026-06-02)
🐛 Bug Fixes
- Fixed RUM sessions appearing as 20–24h long.
SessionManager.getSessionId() now refreshes an expired session before returning, so spans can't be stamped with a stale session ID.
2.12.1 (2026-05-24)
🐛 Bug Fixes
- Fixed
IllegalArgumentException: invalid pointerIndex -1 crash in TouchEventDispatcher by filtering multi-touch actions before forwarding to GestureDetector.
- Added
cx_rum.session_context.session_creation_date and hasRecording to instrumentation_data.otelSpan.attributes, matching iOS.
2.12.0 (2026-05-07)
🚀 Features
- Added Custom Time Measurement API:
CoralogixRum.startTimeMeasure(name, labels) / endTimeMeasure(name) emit a Measurement event with the elapsed duration.
- Added
excludeFromSampling to CoralogixOptions to export selected instrumentation categories at 100% even when the session is sampled out.
- Session-sampling decision moved into
SessionManager, re-rolled on every session rotation (matches web).
- Added public enum
ExcludableInstrumentation.
2.11.2 (2026-05-05)
🐛 Bug Fixes
- Fixed Flutter session replay capturing black frames. A new
FlutterSurfaceViewPatchingStrategy patches FlutterSurfaceView content into the frame via per-surface PixelCopy.
2.11.1 (2026-04-26)
🐛 Bug Fixes
getCustomTracer(ignoredInstruments) now takes a Set instead of List.
CoralogixGlobalSpan.runInSpanContext renamed to withContext.
CoralogixCustomSpan.addEvent now accepts an optional timestamp and TimeUnit.
startGlobalSpan returns null when a global span is already active, preventing orphaned spans.
- Custom spans are now exported through the RUM log pipeline with correct
parentSpanId linking.
🚀 Features
- Added a
toJson() convenience method to CoralogixTraceExporterData.
2.11.0 (2026-04-16)
🚀 Features
- Added Custom Spans API:
getCustomTracer(), startGlobalSpan(name), and CoralogixGlobalSpan.startCustomSpan(name). Spans appear in the RUM trace view, correlate with the session, and propagate traceparent to outgoing requests.
- Added
tracesExporter option in CoralogixOptions to receive the raw OTLP span payload alongside the RUM export.
2.10.2 (2026-04-15)
🐛 Bug Fixes
- Fixed
ConcurrentModificationException crash in ActivityLifecycleMonitor.reportLifecycleEvent; monitorListeners is now a CopyOnWriteArrayList.
2.10.1 (2026-04-15)
🐛 Bug Fixes
- Fixed
android-sdk-compose failing to publish to Maven Central — the generated POM was missing the <version> for the com.coralogix:android-sdk dependency.
2.10.0 (2026-04-14)
🚀 Features
- Added Jetpack Compose support via the new
android-sdk-compose artifact.
- Session replay now works for Compose apps on API 26+, fixing previously blank frames.
- Added
CoralogixDomain.US3 for the US3 region.
🐛 Bug Fixes
maskAllTexts, textsToMask, and Modifier.coralogixMasked() now mask Compose text elements.
maskAllImages now masks Compose image composables.
maskInputFieldsOfTypes[PASSWORD] now masks Compose password fields.
2.9.5 (2026-04-05)
🐛 Bug Fixes
- Fixed
ClassCastException crash when using @shopify/react-native-skia. Generated view IDs are now stored in a view tag instead of overwriting View.NO_ID.
2.9.4 (2026-03-23)
🚀 Features
- Added
CoralogixDartObfuscatedStackFrame for obfuscated Dart stack traces from Flutter apps built with --obfuscate.
- Added optional
arch, build_id, and stack_trace_type fields to ErrorContext for Flutter symbolication metadata.
- Added span attribute constants so the new fields survive the OpenTelemetry pipeline and
beforeSend.
2.9.3 (2026-03-17)
🐛 Bug Fixes
- Fixed error count discrepancy between the RUM grid and session drilldown when
beforeSend changes severity from Error or drops the event.
- Fixed hybrid platforms (Flutter/React Native) without a
beforeSendCallback dropping all spans; events are now exported when no callback is set.
- Removed
snapshotContext from EditableCxRum — it is SDK-internal and not user-editable.
2.9.2 (2026-03-15)
🐛 Bug Fixes
- Fixed
request_payload and response_payload schema — both are now serialized as plain strings for cross-platform compatibility.
2.9.1 (2026-03-11)
🐛 Bug Fixes
- Fixed
resolveNetworkCaptureRule using Regex.matches() instead of containsMatchIn(), so patterns like example\.com now match full URLs.
2.9.0 (2026-03-09)
🚀 Features
- Added
networkCaptureConfig option to CoralogixOptions for capturing request/response headers and payloads on matching requests.
- Introduced
NetworkCaptureRule supporting exact URL or regex matching, with per-rule header/payload control.
- Network spans now include
request_headers, response_headers, request_payload, and response_payload when capture rules are configured.
🛠️ Improvements
- Fixed URL path encoding in network requests (
@Path with encoded = true).
- Fixed payload serialization: payloads are surfaced as JSON elements; non-JSON text payloads are preserved as primitives.
2.8.1 (2026-03-08)
🛠️ Improvements
- Native user interaction monitoring is now automatically disabled on hybrid platforms (React Native, Flutter), which should use
reportUserInteraction instead.
2.8.0 (2026-03-02)
🚀 Features
- Added scroll gesture detection (up, down, left, right) on scrollable views.
- Added swipe/fling gesture detection (up, down, left, right) on any view.
- Added
reportUserInteraction public API for hybrid platforms to manually report interactions.
🛠️ Improvements
- Fixed
inner_text not being collected for Button views.
- Network span attributes now conform to the cross-platform
cx_rum.* schema.
2.7.2 (2026-02-10)
🛠️ Improvements
- Fixed severity synchronizing for non native frameworks
- Fixed serialization issues
2.7.0 (2026-02-08)
🛠️ Improvements
- Added support for flutter SessionReplay
- Added configurable Trace-Parent header injection for distributed tracing
2.6.4 (2026-01-29)
🛠️ Improvements
- Fixed some issues reported by Android's
StrictMode API
- Fixed events sent with wrong session details (session refreshed before the event was sent)
- Fixed cold and warm start time calculations
severity changes in beforeSend are now reflected on the resulting log
2.6.3 (2025-12-09)
🛠️ Improvements
- Log Context converts the data into a string and not as json object
2.6.2 (2025-12-07)
🛠️ Improvements
- Network Context duration in millisecond
2.6.1 (2025-11-20)
🛠️ Improvements
- Clear
MobileVitalsInstrumentation measurement windows on navigation events
- Improved threading support in the detector implementations
- Idle mobile vitals event now triggers every 15 seconds per business rules
- Fixed incorrect enabled/disabled detector validation when starting
MobileVitalsInstrumentation
2.6.0 (2025-11-18)
🛠️ Improvements
labels map now supports any value type (Map<String, Any?>)
log data and labels are now Map<String, Any?> and sent as JSON objects instead of escaped strings
📚 Documentation
- Reflected these changes and the latest SDK version in the README
2.5.7 (2025-11-03)
🚀 Features
- Session Replay masking now supports custom text patterns and regex via
textsToMask
- Session Replay adds a
maskAllImages option to mask all image views
🛠️ Improvements
- Enhanced precision in mobile vitals metrics with rounded measurements
📚 Documentation
- Updated the
SessionReplay section and code examples with the new masking options
- Updated the current SDK patch version in
Installation to 2.5.7