RUM Android SDK changelog
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.
Android SDK 2.15.1
Gradle Plugin versioning aligned with the SDK — all three artifacts now ship under the same version number.
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
Android SDK 2.14.1
beforeSendmodifications now land on both serialization destinations a span produces:text.cx_rum.*(the RUM payload) andinstrumentation_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-beforeSendstruct, so customer redactions (for example,network_request_context.url) showed up intext.cx_rumonly. The rebuild is gated onbeforeSend != null, so customers who don't set a callback keep the struct-driven init-time attribute build.CxRum.applyBeforeSendLogicnow ignoresspanId,traceId,parentSpanId, andisSnapshotEventfrom the customer'sEditableCxRumreturn value and restores them from the original. These are identity / SDK-owned signals and abeforeSendcallback 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'seditable.copy(labels = null)is now coerced to an emptyJsonObject, andcx_rum.session_creation_dateis now omitted from the OTLP attribute mirror when the underlying value is0L(the unset sentinel) on both paths.
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 ascollectFrozenMaskRects, guaranteeing pixel/mask alignment. - Fixed Flutter session replay masking:
FlutterSurfaceViewrenders outside the View hierarchy, so the previousPixelCopy+ region-pull approach produced misaligned masks. The newflutterViewBitmapProviderpath 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 onDispatchers.Defaultinstead of the main thread, and is now computed viawithContext(Dispatchers.Main). - Fixed
frameCapturer.cleanup()(which removesViewTreeObserver.OnDrawListenerentries) never being called fromSessionReplayInternal.shutdown(), which caused listeners to fire indefinitely after session replay was shut down. - Fixed a bitmap not being recycled if
copyPixelsFromBufferthrows (OEM stride mismatch); it is now wrapped intry/finally. NetworkConnectivityMonitorno longer crashes withConcurrentModificationExceptionwhen 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.flutterViewBitmapProvidersuspendcallback 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
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.
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.
Android SDK 2.12.1
- Fixed an
IllegalArgumentException: invalid pointerIndex -1crash inTouchEventDispatcher. Multi-touch actions (ACTION_POINTER_DOWN/ACTION_POINTER_UP) are now filtered out before being forwarded toGestureDetector, which only handles single-pointer gestures. instrumentation_data.otelSpan.attributesnow includescx_rum.session_context.session_creation_date(Long, milliseconds) andcx_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.
Android SDK 2.12.0
- Added a Custom Time Measurement API: call
CoralogixRum.startTimeMeasure(name, labels)to begin timing an operation andCoralogixRum.endTimeMeasure(name)to stop it. The elapsed duration (in milliseconds) is emitted as aMeasurementevent with themeasurement_nameattribute set tonameand the optionallabelsmerged 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>toCoralogixOptions. Instrumentation categories listed here are exported at 100% even when the current session has been sampled out bysessionSampleRate. 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, andLifecycle. - 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
ExcludableInstrumentationenum to thecom.coralogix.android.sdk.modelpackage.
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.
Android SDK 2.11.1
getCustomTracer(ignoredInstruments)now accepts aSet<CoralogixIgnoredInstrument>instead ofList, eliminating accidental duplicate entries.CoralogixGlobalSpan.runInSpanContextrenamed towithContext(generic return:fun <R> withContext(block: () -> R): R) — matches the iOS, Browser, and React Native naming.CoralogixCustomSpan.addEventnow accepts an optionaltimestampandTimeUnit, aligning with the iOS overload that takes an explicit event time.startGlobalSpannow returnsnullimmediately 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 correctparentSpanIdlinking child spans to their parent. - Added a
toJson()convenience method toCoralogixTraceExporterData. Learn more
Android SDK 2.11.0
- Added a Custom Spans API: obtain a tracer via
CoralogixRum.getCustomTracer(), then callstartGlobalSpan(name)to open a root trace andCoralogixGlobalSpan.startCustomSpan(name)to attach child spans. All spans appear in the Coralogix RUM trace view, are automatically correlated with the active session, and propagate thetraceparentheader to outgoing network requests while the global span is active. Learn more - Added a
tracesExporteroption inCoralogixOptions: 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
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.
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.
Android SDK 2.10.0
- Added Jetpack Compose support via the new
android-sdk-composeartifact. 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+:
DefaultViewHierarchyRendererusesPixelCopy.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.US3for the US3 region (ingress.us3.rum-ingress-coralogix.com). - Fixed session replay masking silently skipping all Compose nodes.
maskAllTexts,textsToMask, andModifier.coralogixMasked()now produce visual mask rectangles over Compose elements — the masking pass was previously gated onis ViewMetadataand did nothing forComposableViewParamsnodes. - Fixed
maskAllImagesnot masking Compose image composables. Image detection is now backed byModel.ViewParams.isImage; for Compose nodes this istruewhenRole.Imagesemantics are present. - Fixed
maskInputFieldsOfTypeswithEditTextType.PASSWORDnot masking Compose password fields. Compose nodes now detect password fields viaSemanticsProperties.Password. OnlyEditTextType.PASSWORDis evaluated for Compose nodes. Learn more
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.
Android SDK 2.9.4
- Added
CoralogixDartObfuscatedStackFrame, a new stack frame type carrying a singlevirtstring, used for obfuscated Dart stack traces from Flutter apps built with--obfuscate. - Added optional
arch,build_id, andstack_trace_typefields toErrorContextto 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
beforeSendcallback.
Android SDK 2.9.3
- Fixed an error count discrepancy between the RUM main grid and session drilldown — when
beforeSendchanges an event's severity from Error to non-Error (or drops the event entirely),SnapshotManager.errorCountand embeddedsnapshotContext.errorCountvalues are now correctly updated. - Fixed hybrid platforms (Flutter / React Native) without a
beforeSendCallbacksilently dropping all spans — events are now exported normally when no callback is configured. snapshotContextremoved fromEditableCxRum— this field is SDK-internal state and should not be user-editable viabeforeSend.
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.
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.
Android SDK 2.9.0
- Added a
networkCaptureConfigoption toCoralogixOptionsfor capturing request/response headers and payloads on matching network requests. - Introduced the
NetworkCaptureRulemodel, 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, andresponse_payloadattributes when capture rules are configured. - Fixed URL path encoding in network requests (
@Pathwithencoded = 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
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.
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
reportUserInteractionpublic API for hybrid platforms (React Native, Flutter) to manually report user interaction events. - Fixed
inner_textnot being collected forButtonviews. - Network span attributes now conform to the cross-platform
cx_rum.*schema, replacing the previous raw attribute dump.
Android SDK 2.7.2
- Fixed severity synchronizing for non-native frameworks.
- Fixed serialization issues.
Android SDK 2.7.0
- Added support for Flutter Session Replay.
- Added configurable Trace-Parent header injection for distributed tracing.
Android SDK 2.6.4
- Fixed some issues reported by Android's
StrictModeAPI. - 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
severityfield inbeforeSendare now properly updated on the resulting log JSON sent.
Android SDK 2.6.3
Log Context now converts the data into a string instead of a JSON object.
Android SDK 2.6.2
Network Context duration is now reported in milliseconds.
Android SDK 2.6.1
- Fixed the
MobileVitalsInstrumentationto 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.
Android SDK 2.6.0
- Changed the
labelsmap to support any values; it is now of typeMap<String, Any?>. - The
logmethoddataandlabelsparameters are also of typeMap<String, Any?>now and are sent as JSON objects instead of escapedStringinstances.
Android SDK 2.5.7
- Session Replay masking now supports custom text patterns and regex expressions via
textsToMask. - Session Replay includes a
maskAllImagesoption to mask all image views during recording. - Enhanced precision in mobile vitals metrics with rounded measurements. Learn more