# RUM Android SDK release notes

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](https://coralogix.com/docs/user-guides/rum/product-features/session-replay/android/index.md)**

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](https://coralogix.com/docs/user-guides/rum/product-features/session-replay/android/index.md)**

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](https://coralogix.com/docs/user-guides/rum/sdk-features/customized-timing/#manual-timer)**
- 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](https://coralogix.com/docs/user-guides/rum/sdk-features/custom-spans/index.md)**

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](https://coralogix.com/docs/user-guides/rum/sdk-features/custom-spans/index.md)**
- 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](https://coralogix.com/docs/user-guides/rum/sdk-features/trace-exporter/index.md)**

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](https://coralogix.com/docs/user-guides/rum/product-features/session-replay/android/index.md)**

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](https://coralogix.com/docs/user-guides/rum/sdk-features/analyze-header-and-payload-data/index.md)**

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](https://coralogix.com/docs/user-guides/rum/product-features/session-replay/android/index.md)**
