Skip to main content

RUM Android SDK changelog

Aug 9, 2026

Android SDK 2.20.0

  • 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. Learn more
  • Interaction events now carry interaction_context.is_masked_element (always present), so a beforeSend callback can drop masked interactions or blank their coordinates.
  • 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.
Aug 4, 2026

Android SDK 2.19.4

  • Masking now applies to everything inside a masked view or composable, not just the element it was applied to, so 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(). Learn more
  • Tapping inside a masked area no longer draws a tap marker in Session Replay, 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_0key_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.
  • Snapshot context is now sent 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.
Aug 2, 2026

Android SDK 2.19.3

  • 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 now 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.
Jul 30, 2026

Android SDK 2.19.2

Fixed events being dropped during a session change when per-session sampling is in use.

Jul 27, 2026

Android SDK 2.19.1

Version alignment with no functional changes. Republished so the Compose module, whose 2.19.0 never reached Maven Central, ships in sync with the core.

Jul 27, 2026

Android SDK 2.19.0

  • Added isSessionSampledIn to EditableCxRum (and session_context on the wire), so beforeSend can tell whether an event belongs to a sampled-in session or arrived only via excludeFromSampling — for example, 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(). Learn more
  • 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.
Jul 20, 2026

Android SDK 2.18.0

  • Added CoralogixRum.flush(onComplete), which forces an immediate export of queued telemetry and invokes the callback once the export or upload attempt finishes (immediately when the SDK is not initialized), so a crash can be delivered before the process terminates.
  • 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 now 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.
Jul 9, 2026

Android SDK 2.17.2

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.

Jul 5, 2026

Android SDK 2.17.1

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.

Jul 5, 2026

Android SDK 2.17.0

Added createNewSession() to start a fresh session on demand (for example, on logout) without re-initializing the SDK.

Jun 29, 2026

Android SDK 2.16.3

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.

Jun 24, 2026

Android SDK 2.16.2

Fixed beforeSend edits (for example, redacting a URL) on React Native applying to the RUM event but not the matching OpenTelemetry span attributes. Both now reflect the edit.

Jun 15, 2026

Android SDK 2.16.1

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 or timeout instead of emitting an empty hierarchy.

Jun 9, 2026

Android SDK 2.16.0

Added view_number and isNavigationEvent to every RUM event under cx_rum for product analytics. view_number is a 0-based counter of distinct view changes in the session (first view = 0); isNavigationEvent is true on navigation spans. Mirrors iOS and Browser SDK additions.

2026

Android SDK 2.15.1

Gradle Plugin versioning aligned with the SDK — all three artifacts now ship under the same version number.

Jun 8, 2026

Android SDK 2.15.0

The SDK now emits a session_replay_init internal event when SessionReplay.initialize() succeeds (the session was not dropped by SessionReplayOptions.sessionRecordingSampleRate), carrying the resolved session-replay configuration under internal_event_data so the backend can observe how each session was configured. The payload includes captureScale, captureCompressQuality, sessionRecordingSampleRate, autoStartSessionRecording, maskAllTexts, textsToMask, maskInputFieldsOfTypes, maskAllImages, and a hasFlutterViewBitmapProvider presence flag. Mirrors the existing SDK init log emitted on CoralogixRum.initialize() (internal_event_type = "init"). Learn more

Jun 7, 2026

Android SDK 2.14.1

  • beforeSend modifications now land on both serialization destinations a span produces: text.cx_rum.* (the RUM payload) and instrumentation_data.otelSpan.attributes."cx_rum.*" (the OTLP attribute mirror used by the tracing pipeline). Previously the OTLP mirror was built once at span construction from the pre-beforeSend struct, so customer redactions (for example, network_request_context.url) showed up in text.cx_rum only. The rebuild is gated on beforeSend != null, so customers who don't set a callback keep the struct-driven init-time attribute build.
  • CxRum.applyBeforeSendLogic now ignores spanId, traceId, parentSpanId, and isSnapshotEvent from the customer's EditableCxRum return value and restores them from the original. These are identity / SDK-owned signals and a beforeSend callback must not be able to forge them. Mirrors the read-only set on iOS.
  • Parity tightening between the init-time and beforeSend-rebuild attribute paths: a customer's editable.copy(labels = null) is now coerced to an empty JsonObject, and cx_rum.session_creation_date is now omitted from the OTLP attribute mirror when the underlying value is 0L (the unset sentinel) on both paths.
Jun 7, 2026

Android SDK 2.14.0

  • Fixed a session replay mask-skew bug where mask rects drifted 16–80+ px behind text during scroll. For classic Views, View.draw() is now called synchronously on the main thread in the same pass as collectFrozenMaskRects, guaranteeing pixel/mask alignment.
  • Fixed Flutter session replay masking: FlutterSurfaceView renders outside the View hierarchy, so the previous PixelCopy + region-pull approach produced misaligned masks. The new flutterViewBitmapProvider path asks the Flutter plugin's Dart side to rasterise and mask in a single synchronous frame slice and return a finished RGBA8888 bitmap.
  • Fixed a thread-safety violation: the containsCompose() View-hierarchy walk ran on Dispatchers.Default instead of the main thread, and is now computed via withContext(Dispatchers.Main).
  • Fixed frameCapturer.cleanup() (which removes ViewTreeObserver.OnDrawListener entries) never being called from SessionReplayInternal.shutdown(), which caused listeners to fire indefinitely after session replay was shut down.
  • Fixed a bitmap not being recycled if copyPixelsFromBuffer throws (OEM stride mismatch); it is now wrapped in try/finally.
  • NetworkConnectivityMonitor no longer crashes with ConcurrentModificationException when listeners are registered or unregistered while a connectivity callback (onAvailable/onLost) is iterating the listener list. The callback now snapshots the list under the monitor's lock before iterating.
  • New optional SessionReplayOptions.flutterViewBitmapProvider suspend callback for Flutter hosts. When set, the SDK composites the pre-masked Dart bitmap into each captured frame instead of using the legacy region-pull path. Learn more
Jun 3, 2026

Android SDK 2.13.0

Added an optional customAttributes: Map<String, Any?>? parameter to CoralogixErrorDecorator, matching the iOS SDK naming. Callers of CoralogixRum.reportError(decorator) can now attach custom attributes that are emitted on the resulting RUM error event under errorContext.data, JSON-encoded in the same shape iOS uses. Existing call sites are unaffected — the new parameter defaults to null.

Jun 2, 2026

Android SDK 2.12.2

Fixed RUM sessions appearing as 20–24h long in the Coralogix UI. When an app resumed from a long background (~24h), spans could be created before SessionManager rotated the session, stamping them with the stale session ID from the previous day. SessionManager.getSessionId() now checks shouldRefreshSession() before returning, guaranteeing that any span created after the 1-hour session lifetime always receives a fresh session ID regardless of listener ordering.

May 24, 2026

Android SDK 2.12.1

  • Fixed an IllegalArgumentException: invalid pointerIndex -1 crash in TouchEventDispatcher. Multi-touch actions (ACTION_POINTER_DOWN/ACTION_POINTER_UP) are now filtered out before being forwarded to GestureDetector, which only handles single-pointer gestures.
  • instrumentation_data.otelSpan.attributes now includes cx_rum.session_context.session_creation_date (Long, milliseconds) and cx_rum.session_context.hasRecording (Bool), matching the iOS SDK. Downstream tracing consumers that join sessions via tracing can now correlate session start time and recording state from the tracing block.
May 7, 2026

Android SDK 2.12.0

  • Added a Custom Time Measurement API: call CoralogixRum.startTimeMeasure(name, labels) to begin timing an operation and CoralogixRum.endTimeMeasure(name) to stop it. The elapsed duration (in milliseconds) is emitted as a Measurement event with the measurement_name attribute set to name and the optional labels merged with SDK-level labels. Duplicate starts are ignored (the original start time is preserved), and in-flight measurements are automatically discarded when the session goes idle. Learn more
  • Added excludeFromSampling: List<ExcludableInstrumentation> to CoralogixOptions. Instrumentation categories listed here are exported at 100% even when the current session has been sampled out by sessionSampleRate. An empty list (the default) preserves legacy behavior — the sample rate gates the entire SDK. Supported categories: Errors, Logs, Network, UserInteractions, MobileVitals, CustomSpan, CustomMeasurement, Navigation, and Lifecycle.
  • The session-sampling decision moved into SessionManager, so the sampling result is re-rolled on every session rotation (matching web SDK behavior).
  • Added the public ExcludableInstrumentation enum to the com.coralogix.android.sdk.model package.
May 5, 2026

Android SDK 2.11.2

Fixed Flutter session replay capturing black frames on Android. FlutterSurfaceView renders in a separate hardware compositor layer that window-level PixelCopy cannot see. A new FlutterSurfaceViewPatchingStrategy decorator now runs a per-surface PixelCopy.request(surfaceView, ...) pass after the main window capture, patching the Flutter content directly into the frame. Only FlutterSurfaceView is targeted — other SurfaceView subclasses (video, camera) are intentionally skipped to avoid expensive GPU readbacks.

Apr 26, 2026

Android SDK 2.11.1

  • getCustomTracer(ignoredInstruments) now accepts a Set<CoralogixIgnoredInstrument> instead of List, eliminating accidental duplicate entries.
  • CoralogixGlobalSpan.runInSpanContext renamed to withContext (generic return: fun <R> withContext(block: () -> R): R) — matches the iOS, Browser, and React Native naming.
  • CoralogixCustomSpan.addEvent now accepts an optional timestamp and TimeUnit, aligning with the iOS overload that takes an explicit event time.
  • startGlobalSpan now returns null immediately when a global span is already active (a pre-check before creating the OTel span), preventing orphaned spans.
  • Custom spans are now exported through the RUM log pipeline as InstrumentationData (the same path as network requests), with correct parentSpanId linking child spans to their parent.
  • Added a toJson() convenience method to CoralogixTraceExporterData. Learn more
Apr 16, 2026

Android SDK 2.11.0

  • Added a Custom Spans API: obtain a tracer via CoralogixRum.getCustomTracer(), then call startGlobalSpan(name) to open a root trace and CoralogixGlobalSpan.startCustomSpan(name) to attach child spans. All spans appear in the Coralogix RUM trace view, are automatically correlated with the active session, and propagate the traceparent header to outgoing network requests while the global span is active. Learn more
  • Added a tracesExporter option in CoralogixOptions: it accepts a ((CoralogixTraceExporterData) -> Unit) callback that receives the raw OTLP span payload alongside the normal RUM export, enabling full distributed-tracing integration without a separate OpenTelemetry collector. Learn more
Apr 15, 2026

Android SDK 2.10.2

Fixed a ConcurrentModificationException crash in ActivityLifecycleMonitor.reportLifecycleEvent when lifecycle events fire concurrently with listener add/remove operations. monitorListeners is now a CopyOnWriteArrayList, so iteration always works on a snapshot and is unaffected by concurrent modifications.

Apr 15, 2026

Android SDK 2.10.1

Fixed android-sdk-compose failing to publish to Maven Central — the generated POM was missing the <version> element for the com.coralogix:android-sdk dependency, which caused Sonatype staging validation to reject the close.

Apr 14, 2026

Android SDK 2.10.0

  • Added Jetpack Compose support via the new android-sdk-compose artifact. It auto-initializes via AndroidX Startup — no manual initialization code is required beyond adding the dependency.
  • Session replay now works correctly for Compose apps on API 26+: DefaultViewHierarchyRenderer uses PixelCopy.request(window, ...) to read the GPU framebuffer directly, resolving blank frames caused by hardware-backed bitmaps (Coil, Glide). view.draw() is used as a fallback on API < 26.
  • Added CoralogixDomain.US3 for the US3 region (ingress.us3.rum-ingress-coralogix.com).
  • Fixed session replay masking silently skipping all Compose nodes. maskAllTexts, textsToMask, and Modifier.coralogixMasked() now produce visual mask rectangles over Compose elements — the masking pass was previously gated on is ViewMetadata and did nothing for ComposableViewParams nodes.
  • Fixed maskAllImages not masking Compose image composables. Image detection is now backed by Model.ViewParams.isImage; for Compose nodes this is true when Role.Image semantics are present.
  • Fixed maskInputFieldsOfTypes with EditTextType.PASSWORD not masking Compose password fields. Compose nodes now detect password fields via SemanticsProperties.Password. Only EditTextType.PASSWORD is evaluated for Compose nodes. Learn more
Apr 5, 2026

Android SDK 2.9.5

Fixed a ClassCastException crash on Android when using @shopify/react-native-skia alongside the Coralogix SDK — the SDK was calling view.id = generatedId on views with View.NO_ID (such as Skia's SkiaTextureView), corrupting React Native's internal view tag registry. Generated IDs are now stored in a view tag instead, leaving the view's actual Android ID untouched.

Mar 23, 2026

Android SDK 2.9.4

  • Added CoralogixDartObfuscatedStackFrame, a new stack frame type carrying a single virt string, used for obfuscated Dart stack traces from Flutter apps built with --obfuscate.
  • Added optional arch, build_id, and stack_trace_type fields to ErrorContext to carry Flutter-specific symbolication metadata alongside obfuscated frames.
  • Added span attribute constants for the new fields so they round-trip correctly through the OpenTelemetry pipeline and survive the beforeSend callback.
Mar 17, 2026

Android SDK 2.9.3

  • Fixed an error count discrepancy between the RUM main grid and session drilldown — when beforeSend changes an event's severity from Error to non-Error (or drops the event entirely), SnapshotManager.errorCount and embedded snapshotContext.errorCount values are now correctly updated.
  • Fixed hybrid platforms (Flutter / React Native) without a beforeSendCallback silently dropping all spans — events are now exported normally when no callback is configured.
  • snapshotContext removed from EditableCxRum — this field is SDK-internal state and should not be user-editable via beforeSend.
Mar 15, 2026

Android SDK 2.9.2

Fixed the request_payload and response_payload schema — both fields are now serialized as plain strings instead of JSON elements, ensuring correct cross-platform schema compatibility.

Mar 11, 2026

Android SDK 2.9.1

Fixed resolveNetworkCaptureRule incorrectly using Regex.matches() (which requires a full-string match) instead of containsMatchIn() — URL patterns like example\.com now correctly match against full URLs including scheme and path.

Mar 9, 2026

Android SDK 2.9.0

  • Added a networkCaptureConfig option to CoralogixOptions for capturing request/response headers and payloads on matching network requests.
  • Introduced the NetworkCaptureRule model, supporting exact URL or regex pattern matching, with per-rule control over request/response header and payload collection.
  • Network spans now include request_headers, response_headers, request_payload, and response_payload attributes when capture rules are configured.
  • Fixed URL path encoding in network requests (@Path with encoded = true).
  • Fixed payload serialization: payloads are now surfaced as proper JSON elements rather than escaped strings; non-JSON text payloads (for example, text/plain) are preserved as JSON primitives. Learn more
Mar 8, 2026

Android SDK 2.8.1

Native user interaction monitoring (tap, scroll, swipe detection) is now automatically disabled on hybrid platforms (React Native, Flutter). Hybrid SDKs should use the reportUserInteraction public API instead.

Mar 2, 2026

Android SDK 2.8.0

  • Added scroll gesture detection: automatically tracks scroll direction (up, down, left, right) on scrollable views.
  • Added swipe/fling gesture detection: automatically tracks swipe direction (up, down, left, right) on any view.
  • Added the reportUserInteraction public API for hybrid platforms (React Native, Flutter) to manually report user interaction events.
  • Fixed inner_text not being collected for Button views.
  • Network span attributes now conform to the cross-platform cx_rum.* schema, replacing the previous raw attribute dump.
Feb 10, 2026

Android SDK 2.7.2

  • Fixed severity synchronizing for non-native frameworks.
  • Fixed serialization issues.
Feb 8, 2026

Android SDK 2.7.0

  • Added support for Flutter Session Replay.
  • Added configurable Trace-Parent header injection for distributed tracing.
Jan 29, 2026

Android SDK 2.6.4

  • Fixed some issues reported by Android's StrictMode API.
  • Fixed an issue where events were sent with wrong session details (the session was refreshed before the event was sent).
  • Fixed cold and warm start time calculations.
  • Changes to the severity field in beforeSend are now properly updated on the resulting log JSON sent.
Dec 9, 2025

Android SDK 2.6.3

Log Context now converts the data into a string instead of a JSON object.

Dec 7, 2025

Android SDK 2.6.2

Network Context duration is now reported in milliseconds.

Nov 20, 2025

Android SDK 2.6.1

  • Fixed the MobileVitalsInstrumentation to clear measurement windows on detectors in case of a navigation event.
  • Improved threading support where needed in the detector implementations.
  • Fixed a bug with the idle mobile vitals event; it is now triggered every 15 seconds as per business rules.
  • Fixed incorrect validation of enabled/disabled detectors when deciding whether to start the MobileVitalsInstrumentation.
Nov 18, 2025

Android SDK 2.6.0

  • Changed the labels map to support any values; it is now of type Map<String, Any?>.
  • The log method data and labels parameters are also of type Map<String, Any?> now and are sent as JSON objects instead of escaped String instances.
Nov 3, 2025

Android SDK 2.5.7

  • Session Replay masking now supports custom text patterns and regex expressions via textsToMask.
  • Session Replay includes a maskAllImages option to mask all image views during recording.
  • Enhanced precision in mobile vitals metrics with rounded measurements. Learn more
Last updated on