Skip to content

dd-sdk-android-compose incompatible with Compose UI 1.8+ (NoSuchMethodError: getLayoutDelegate$ui_release) #3259

@xJormungandr

Description

@xJormungandr

Summary

dd-sdk-android-compose:3.7.1 crashes silently at runtime when the consuming app uses Compose UI 1.8.0 or newer, causing Compose gesture/tap tracking to be completely non-functional. The KCP compile-time instrumentation works correctly, but the runtime hit-testing always fails.

Root Cause

LayoutNodeUtils.getLayoutNodeBoundsInWindow() accesses LayoutNode.layoutDelegate via Kotlin's @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") mechanism:

// dd-sdk-android-compose/internal/utils/LayoutNodeUtils.kt
fun getLayoutNodeBoundsInWindow(node: LayoutNode): Rect? {
    return runSafe("getLayoutNodeBoundsInWindow") {
        node.layoutDelegate.outerCoordinator.coordinates.boundsInWindow()
    }
}

The JVM getter for this @InternalComposeApi property is getLayoutDelegate$ui_release(). This method was removed in Compose UI 1.8.0 as part of an internal layout system refactoring.

At runtime, every call throws:

java.lang.NoSuchMethodError: No virtual method getLayoutDelegate$ui_release()
  Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;
  in class Landroidx/compose/ui/node/LayoutNode;
  or its super classes

This exception is caught by runSafe, which returns null. The hit-testing in ComposeActionTrackingStrategy then returns false for every node, and no Compose taps are ever attributed — producing the log message: "We could not find a valid target for the gesture event. Compose actions tracking not enabled, or the compose view is not tagged."

Affected Versions

Component Version
dd-sdk-android-compose 3.7.1
dd-sdk-android-gradle-plugin (KCP) 1.23.0
androidx.compose.ui:ui (consuming app) 1.10.0 (BOM 2025.12.01)
androidx.compose.ui:ui (SDK compiled against) 1.5.4 (BOM 2023.10.01)

The break was introduced in Compose UI 1.8.0 (BOM 2025.04.01). The last working Compose BOM is 2025.04.00 (Compose UI 1.7.8).

Impact

  • Compile-time KCP instrumentation (Modifier.instrumentedDatadog injection) works correctly — bytecode inspection confirms invokestatic DatadogModifierKt.instrumentedDatadog calls are present in all feature module composables.
  • Runtime gesture/tap tracking via RumConfiguration.Builder.enableComposeActionTracking() is completely broken for any app on Compose UI 1.8+.
  • Downgrading Compose is not feasible: the app uses lifecycle:2.10.0 which requires Compose UI 1.8+.

Suggested Fix

Update LayoutNodeUtils.getLayoutNodeBoundsInWindow() to use the public coordinates.boundsInWindow() API without accessing layoutDelegate directly, or use a reflection-based fallback that targets the new internal structure introduced in Compose UI 1.8.0.

Reproduction

Any Android app that:

  1. Uses dd-sdk-android-compose:3.7.1 with enableComposeActionTracking()
  2. Depends on androidx.compose.ui:ui:1.8.0 or newer (e.g. via Compose BOM 2025.04.01+)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions