2.16.0 (2026-06-09)
๐ Features
- 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/Browser SDK additions.
2.15.1
๐ง Internal
- Create a changelog file and link in Maven Central.
- Gradle Plugin versioning aligned with the SDK โ all three artifacts now ship under the same version number.
2.15.0 (2026-06-08)
๐ Features
- The SDK now emits a
session_replay_init internal event when SessionReplay.initialize() succeeds (i.e. 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. Payload includes captureScale, captureCompressQuality, sessionRecordingSampleRate, autoStartSessionRecording, maskAllTexts, textsToMask, maskInputFieldsOfTypes, maskAllImages, and a hasFlutterViewBitmapProvider presence flag (the lambda itself is not serialised). Mirrors the existing SDK init log emitted on CoralogixRum.initialize() (internal_event_type = "init").
2.14.1 (2026-06-07)
๐ Bug Fixes
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 (e.g. network_request_context.url) showed up in text.cx_rum only. The rebuild is gated on beforeSend != null โ customers who don't set a callback continue to get the struct-driven init-time attribute build, which is intentional because the CxRum view is a lossy projection (struct-only fields like error_context on non-error events would silently drop on every span if the rebuild ran unconditionally).
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 counter signals and a customer's 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 (previously text.cx_rum.labels shipped as JsonNull while the OTLP mirror dropped the key entirely), and cx_rum.session_creation_date is now omitted from the OTLP attribute mirror when the underlying value is 0L (the struct's unset sentinel) on both paths.
2.14.0 (2026-06-07)
๐ Bug Fixes
- Session replay mask-skew bug: 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. Leak rate: 47% of frames โ 0.
- Flutter session replay:
FlutterSurfaceView renders outside the View hierarchy; 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. Leak rate: 77% โ 0.
containsCompose() View-hierarchy walk was executed on Dispatchers.Default instead of the main thread, violating ViewGroup thread-safety. Now computed via withContext(Dispatchers.Main).
frameCapturer.cleanup() (removes ViewTreeObserver.OnDrawListener entries) was never called from SessionReplayInternal.shutdown(), causing listeners to fire indefinitely after session replay was shut down.
- Bitmap not recycled if
copyPixelsFromBuffer throws (OEM stride mismatch). 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.
๐ Features
SessionReplayOptions.flutterViewBitmapProvider: new optional 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.
๐งช Internal
- Added native-Android and Compose session-replay leak harnesses (
Coralogix-Development/tool/run_leak_harness.sh, Coralogix-Compose/tool/run_leak_harness.sh) for CI leak validation.
abstractComposeViewClass lazy initialization changed from NONE to SYNCHRONIZED for thread safety.
2.13.0 (2026-06-03)
๐ Features
- Added 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.
2.12.2 (2026-06-02)
๐ Bug Fixes
- Fixed RUM sessions appearing as 20-24h long in the Coralogix UI. When an app resumed from a long background (~24h),
ActivityLifecycleMonitor broadcast ActivityResumed to all listeners with no guaranteed ordering. NavigationMonitor and LifecycleInstrumentation could create spans before SessionManager's listener fired and rotated the session, stamping those spans 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.
2.12.1 (2026-05-24)
๐ Bug Fixes
- Fixed
IllegalArgumentException: invalid pointerIndex -1 crash in TouchEventDispatcher. GestureDetector does not safely handle multi-touch pointer events โ when a second finger lifts (ACTION_POINTER_UP), it resolves a pointer index that is no longer valid and crashes on getX/getY. Multi-touch actions (ACTION_POINTER_DOWN/ACTION_POINTER_UP) are now filtered out before being forwarded to GestureDetector, which only handles single-pointer gestures anyway.
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.
2.12.0 (2026-05-07)
๐ Features
- Added 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). In-flight measurements are automatically discarded when the session goes idle.
- 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, Lifecycle.
- Moved the session-sampling decision into
SessionManager so the sampling result is re-rolled on every session rotation (matching web SDK behavior).
- Added public enum
ExcludableInstrumentation to the com.coralogix.android.sdk.model package.
2.11.2 (2026-05-05)
๐ Bug Fixes
- 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.
2.11.1 (2026-04-26)
๐ Bug Fixes
getCustomTracer(ignoredInstruments) now accepts a Set<CoralogixIgnoredInstrument> instead of List โ eliminates accidental duplicate entries.
CoralogixGlobalSpan.runInSpanContext renamed to withContext (generic return: fun <R> withContext(block: () -> R): R) โ matches iOS, Browser, and React Native naming.
CoralogixCustomSpan.addEvent now accepts an optional timestamp and TimeUnit โ aligns with the iOS overload that takes an explicit event time.
startGlobalSpan now returns null immediately when a global span is already active (pre-check before creating the OTel span), preventing orphaned spans.
- Custom spans are now exported through the RUM log pipeline as
InstrumentationData (same path as network requests), with correct parentSpanId linking child spans to their parent.
๐ Features
- Added a
toJson() convenience method to CoralogixTraceExporterData
2.11.0 (2026-04-16)
๐ Features
- Added 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.
- Added
tracesExporter option in CoralogixOptions: 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.
๐งช Internal
- Migrated instrumentation behaviour tests from Robolectric/JUnit5 unit tests to real-device instrumented tests using the public
beforeSend API. All event types (error, log, custom measurement, navigation, network request, lifecycle, user interaction, mobile vitals, internal) are now verified end-to-end on a real Android emulator.
2.10.2 (2026-04-15)
๐ Bug Fixes
- Fixed
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.
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> element for the com.coralogix:android-sdk dependency, causing Sonatype staging validation to reject the close.
2.10.0 (2026-04-14)
๐ Features
- Added Jetpack Compose support via the new
android-sdk-compose artifact. Auto-initializes via AndroidX Startup โ no manual initialization code 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).
๐ Bug Fixes
- Fixed session replay masking silently skipping all Compose nodes.
maskAllTexts, textsToMask, and Modifier.coralogixMasked() (via the compose module) 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 (set by Image/AsyncImage when contentDescription != null).
- Fixed
maskInputFieldsOfTypes with EditTextType.PASSWORD not masking Compose password fields. Compose nodes now detect password fields via SemanticsProperties.Password (set by PasswordVisualTransformation). Only EditTextType.PASSWORD is evaluated for Compose nodes โ all other EditTextType values have no effect on Compose content.
2.9.5 (2026-04-05)
๐ Bug Fixes
- Fixed
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.
2.9.4 (2026-03-23)
๐ Features
- 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
2.9.3 (2026-03-17)
๐ Bug Fixes
- Fixed error count discrepancy between 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
2.9.2 (2026-03-15)
๐ Bug Fixes
- Fixed
request_payload and response_payload schema โ both fields are now serialized as plain strings instead of JSON elements, ensuring correct cross-platform schema compatibility
2.9.1 (2026-03-11)
๐ Bug Fixes
- Fixed
resolveNetworkCaptureRule incorrectly using Regex.matches() (requires full-string match) instead of containsMatchIn() โ URL patterns like example\.com now correctly match against full URLs including scheme and path
2.9.0 (2026-03-09)
๐ Features
- Added
networkCaptureConfig option to CoralogixOptions for capturing request/response headers and payloads on matching network requests
- Introduced
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
๐ ๏ธ Improvements
- 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 (e.g.
text/plain) are preserved as JSON primitives
2.8.1 (2026-03-08)
๐ ๏ธ Improvements
- 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.
2.8.0 (2026-03-02)
๐ Features
- 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
reportUserInteraction public API for hybrid platforms (React Native, Flutter) to manually report user interaction events
๐ ๏ธ Improvements
- 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
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 issue where events were sent with wrong session details (session was refreshed before event was sent)
- Fixed cold and warm start time calculations
- Changes to the
severity field in beforeSend now properly updated on the resulting log json sent
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
- Fixed the
MobileVitalsInstrumentation to clear measurement windows on detectors in case of a navigation event
- Improved threading support where needed in the detectors implementations
- Fixed bug with idle mobile vitals event, it is now triggered every 15 seconds as per business rules
- Fixed incorrect validation of enabled/disabled detectors when deciding if we should start the
MobileVitalsInstrumentation
2.6.0 (2025-11-18)
๐ ๏ธ Improvements
- 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 and not as escaped String instances
๐ Documentation
- Reflected these changes and the latest SDK version in the README file
2.5.7 (2025-11-03)
๐ Features
- Session Replay masking now supports custom text patterns and regex expressions via textsToMask
- Session Replay includes maskAllImages option to mask all image views during recording
๐ ๏ธ Improvements
- Enhanced precision in mobile vitals metrics with rounded measurements
๐ Documentation
- Updated the
SessionReplay section with information on the new masking options available
- Updated the
SessionReplay code examples to include new masking options
- Updated current SDK patch version in the
Installation section to 2.5.7