android-maps-compose icon indicating copy to clipboard operation
android-maps-compose copied to clipboard

java.lang.IllegalArgumentException: Unmanaged descriptor

Open Psijic opened this issue 2 years ago • 22 comments

This bug wasn't solved. Got it today. Just use a lot of markers in clustering - wait for them to start show on the map and then switch screens (navigate) before all of them became rendered.

 java.lang.IllegalArgumentException: Unmanaged descriptor
  at com.google.maps.api.android.lib6.common.m.b(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190800-0):10)
  at com.google.maps.api.android.lib6.impl.w.c(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190800-0):18)
  at com.google.maps.api.android.lib6.impl.cw.u(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190800-0):11)
  at com.google.android.gms.maps.model.internal.p.bb(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190800-0):347)
  at m.fi.onTransact(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190800-0):21)
  at android.os.Binder.transact(Binder.java:1164)
  at com.google.android.gms.internal.maps.zza.zzc(com.google.android.gms:play-services-maps@@18.1.0:2)
  at com.google.android.gms.internal.maps.zzy.zzs(com.google.android.gms:play-services-maps@@18.1.0:3)
  at com.google.android.gms.maps.model.Marker.setIcon(com.google.android.gms:play-services-maps@@18.1.0:2)
  at com.google.maps.android.clustering.view.DefaultClusterRenderer.onClusterUpdated(DefaultClusterRenderer.java:937)
  at com.google.maps.android.clustering.view.DefaultClusterRenderer$CreateMarkerTask.perform(DefaultClusterRenderer.java:1053)
  at com.google.maps.android.clustering.view.DefaultClusterRenderer$CreateMarkerTask.access$2300(DefaultClusterRenderer.java:992)
  at com.google.maps.android.clustering.view.DefaultClusterRenderer$MarkerModifier.performNextTask(DefaultClusterRenderer.java:707)
  at com.google.maps.android.clustering.view.DefaultClusterRenderer$MarkerModifier.handleMessage(DefaultClusterRenderer.java:678)
  at android.os.Handler.dispatchMessage(Handler.java:106)
  at android.os.Looper.loopOnce(Looper.java:201)
  at android.os.Looper.loop(Looper.java:288)
  at android.app.ActivityThread.main(ActivityThread.java:7872)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

Code:

    val events by viewModel.eventsLocalDto.filtered.collectAsStateWithLifecycle()
    val selectedEvent by viewModel.selectedEvent.collectAsStateWithLifecycle()

    Clustering(
        items = events,
        onClusterItemClick = {
            Timber.v("Marker clicked: ${it.name}")
            viewModel.selectEvent(it)
            true
        },
    )

    if (selectedEvent is EventItem) (selectedEvent as EventItem).latLng.let {
        val selectedMarker = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)
        Marker(state = MarkerState(it), zIndex = 0.5f, icon = selectedMarker)
    }

selectedEvent wasn't even used here. So, all markers had default view and their count was: 32632.

Psijic avatar Oct 01 '23 19:10 Psijic

I have the same issue and it's easy to reproduce. I have 200+ markers. By quickly tapping on the 200+ circle, map zooms in low res. Before it renders high res map and draw all markers, I navigate back to the previous screen. Within a second app crashes with the mentioned error.

milosfec avatar Oct 05 '23 09:10 milosfec

Just tested with the latest release 3.0.0 and the issue is still there.

milosfec avatar Oct 05 '23 09:10 milosfec

I found the cause of the crash in my case:

val cameraPositionState = rememberCameraPositionState()
GoogleMap(
    modifier = Modifier.fillMaxSize(),
    cameraPositionState = cameraPositionState,
) {
    Clustering(
        items = items,
        clusterItemContent = { mapDataClass ->
            ClusterItemContent(
                mapDataClass = mapDataClass,
                isCameraMoving = cameraPositionState.isMoving,
            )
        },
    )
}

Looks like cameraPositionState changes when the screen is already leaving composition. Without using cameraPositionState for clusterItemContent, the app won't crash.

I even found a workaround: var isScreenClosing by remember { mutableStateOf(false) } I set this boolean to true before navigating. Then I updated clusterItemContent:

clusterItemContent = { mapDataClass ->
    if (!isScreenClosing) {
        ClusterItemContent(
            mapDataClass = mapDataClass,
            isCameraMoving = cameraPositionState.isMoving,
        )
    }
},

With this I wasn't able to replicate the crash anymore.

Anyway, I'm not 100% confident with this workaround. It doesn't cover scenarios when navigation changes outside of the screen with map.

Proper fix should be that this library shouldn't try to update marker icons while it's being released.

milosfec avatar Oct 09 '23 13:10 milosfec

What is isScreenClosing? Some flag toggled in Disposable?

Psijic avatar Oct 09 '23 17:10 Psijic

@Psijic it's just a var I created that I'm setting to true before navigating out of the screen. That way I can prevent recomposition of clusterItemContent. It's not perfect, because when navigation is changed outside of the screen, then the screen has no idea and it can still crash. It's safer to prevent using cameraPositionState inside clusterItemContent...

I'm going to check the source code of DefaultClusterRenderer looking for a better solution.

milosfec avatar Oct 09 '23 18:10 milosfec

Got this crash too. I'm not using Cluster but simply MarkerComposable

mosmb avatar Nov 06 '23 14:11 mosmb

Hi folks,

The following PR might fix this issue. The Clustering was not being disposed, so probably with a large number of markers the process to deal with items in a cluster could be somehow taking longer, and by the time an item is going to be updated the map does not longer exist. I will let you know when it is merged and maybe you folks can take a look.

https://github.com/googlemaps/android-maps-compose/pull/458

kikoso avatar Nov 13 '23 15:11 kikoso

Same problem, appeared when upgrading from 2.14.0 to 4.1.1. I only use markers without clustering.

  1. com.google.maps.android:maps-compose: 4.1.1
  2. com.google.android.gms:play-services-maps: 18.2.0
  3. com.google.android.gms:play-services-base: 18.2.0
Fatal Exception: java.lang.IllegalArgumentException
Unmanaged descriptor

com.google.maps.api.android.lib6.common.p.a (:com.google.android.gms.policy_maps_core_dynamite@[email protected]:10)
com.google.maps.api.android.lib6.impl.ab.a (:com.google.android.gms.policy_maps_core_dynamite@[email protected]:17)
com.google.maps.api.android.lib6.impl.el.V (:com.google.android.gms.policy_maps_core_dynamite@[email protected]:6)
com.google.maps.api.android.lib6.phoenix.bj.v (:com.google.android.gms.policy_maps_core_dynamite@[email protected]:7)
com.google.maps.api.android.lib6.phoenix.bj.h (:com.google.android.gms.policy_maps_core_dynamite@[email protected]:153)
com.google.maps.api.android.lib6.impl.es.run (:com.google.android.gms.policy_maps_core_dynamite@[email protected]:54)
android.os.Handler.handleCallback (Handler.java:971)
android.os.Handler.dispatchMessage (Handler.java:107)
android.os.Looper.loopOnce (Looper.java:206)
android.os.Looper.loop (Looper.java:296)
android.app.ActivityThread.main (ActivityThread.java:9159)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:591)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1018) 

0xffrom avatar Nov 23 '23 12:11 0xffrom

@kikoso, hi! Has the problem been fixed in 4.3.0?

0xffrom avatar Nov 23 '23 12:11 0xffrom

Hi @0xffrom .

The latest version (4.3.0) includes a fix that disposes of clusters, which was not happening in previous versions.

If you aren't using Clustering, this is likely another issue. Could you provide another code snippet with the relevant code block? (for instance, the region where you are adding the Marker to the Map).

kikoso avatar Nov 27 '23 19:11 kikoso

@kikoso I've retested with version 4.3.0 and I wasn't able to reproduce the crash. I believe the clustering issue is now gone, thank you!

milosfec avatar Nov 28 '23 10:11 milosfec

Thanks for letting us know, @milosfec !

kikoso avatar Nov 28 '23 10:11 kikoso

Closing this as fixed by #458 in v4.3.0. Please re-open if it recurs in v4.3.0 or later.

wangela avatar Dec 01 '23 17:12 wangela

Hello, I am facing this problem on version v4.3.0, when the number of markers in the cluster exceeds 100 elements

android.net.ConnectivityManager$TooManyRequestsException
at android.net.ConnectivityManager.convertServiceException(ConnectivityManager.java:4165)
at android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4357)
at android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4364)
at android.net.ConnectivityManager.registerNetworkCallback(ConnectivityManager.java:4746)
at android.net.ConnectivityManager.registerNetworkCallback(ConnectivityManager.java:4716)
at m.fbc.h(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:41)
at m.fbc.<init>(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:140)
at com.google.maps.api.android.lib6.impl.hz.<init>(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:7)
at com.google.android.gms.maps.internal.CreatorImpl.c(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:1157)
at com.google.android.gms.maps.internal.CreatorImpl.logInitialization(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:16)
at com.google.android.gms.maps.internal.i.bp(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:75)
at m.bcb.onTransact(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:21)
at android.os.Binder.transact(Binder.java:1188)
at com.google.android.gms.internal.maps.zza.zzc(com.google.android.gms:play-services-maps@@18.2.0:2)
at com.google.android.gms.maps.internal.zze.zzl(com.google.android.gms:play-services-maps@@18.2.0:4)
at com.google.android.gms.maps.MapsInitializer.initialize(com.google.android.gms:play-services-maps@@18.2.0:12)
at com.google.android.gms.maps.MapsInitializer.initialize(com.google.android.gms:play-services-maps@@18.2.0:1)
at com.google.android.gms.maps.zzai.zzb(com.google.android.gms:play-services-maps@@18.2.0:2)
at com.google.android.gms.maps.zzai.createDelegate(com.google.android.gms:play-services-maps@@18.2.0:1)
at com.google.android.gms.dynamic.DeferredLifecycleHelper.zaf(com.google.android.gms:play-services-base@@18.1.0:6)
at com.google.android.gms.dynamic.DeferredLifecycleHelper.onCreate(com.google.android.gms:play-services-base@@18.1.0:1)
at com.google.android.gms.maps.MapView.onCreate(com.google.android.gms:play-services-maps@@18.2.0:4)
at com.google.maps.android.compose.GoogleMapKt.lifecycleObserver$lambda$11(GoogleMap.kt:207)
at com.google.maps.android.compose.GoogleMapKt.$r8$lambda$Vm6abttjyrD0BNPAw0a-nOgtk1E(Unknown Source:0)
at com.google.maps.android.compose.GoogleMapKt$$ExternalSyntheticLambda0.onStateChanged(Unknown Source:4)
at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.kt:314)
at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.kt:192)
at com.google.maps.android.compose.GoogleMapKt$MapLifecycle$1.invoke(GoogleMap.kt:182)
at com.google.maps.android.compose.GoogleMapKt$MapLifecycle$1.invoke(GoogleMap.kt:178)
at androidx.compose.runtime.DisposableEffectImpl.onRemembered(Effects.kt:82)
at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1137)
at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:828)
at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:849)
at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:1041)
at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:4007)
at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:4007)
at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:520)

bigmeco avatar Dec 22 '23 11:12 bigmeco

Hi @wangela ,

Firebase Analytics indicates that this issue is still happening in the newest release of our app, which uses version 4.3.0.

Fatal Exception: java.lang.IllegalArgumentException: Unmanaged descriptor
       at com.google.maps.api.android.lib6.common.m.b(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190400-0):10)
       at com.google.maps.api.android.lib6.impl.w.c(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190400-0):18)
       at com.google.maps.api.android.lib6.impl.cw.u(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190400-0):11)
       at com.google.android.gms.maps.model.internal.r.bb(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190400-0):347)
       at m.ee.onTransact(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (190400-0):21)
       at android.os.Binder.transact(Binder.java:1173)
       at com.google.android.gms.internal.maps.zza.zzc(com.google.android.gms:play-services-maps@@18.2.0:2)
       at com.google.android.gms.internal.maps.zzab.zzt(com.google.android.gms:play-services-maps@@18.2.0:3)
       at com.google.android.gms.maps.model.Marker.setIcon(com.google.android.gms:play-services-maps@@18.2.0:2)
       at com.google.maps.android.clustering.view.DefaultClusterRenderer.onClusterUpdated(DefaultClusterRenderer.java:972)
       at com.google.maps.android.clustering.view.DefaultClusterRenderer$CreateMarkerTask.perform(DefaultClusterRenderer.java:1091)
       at com.google.maps.android.clustering.view.DefaultClusterRenderer$CreateMarkerTask.access$1900(DefaultClusterRenderer.java:1027)
       at com.google.maps.android.clustering.view.DefaultClusterRenderer$MarkerModifier.performNextTask(DefaultClusterRenderer.java:738)
       at com.google.maps.android.clustering.view.DefaultClusterRenderer$MarkerModifier.handleMessage(DefaultClusterRenderer.java:710)
       at android.os.Handler.dispatchMessage(Handler.java:111)
       at android.os.Looper.loopOnce(Looper.java:238)
       at android.os.Looper.loop(Looper.java:357)
       at android.app.ActivityThread.main(ActivityThread.java:8194)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:957)

hanna-h avatar Jan 22 '24 08:01 hanna-h

Hi everyone, I am also facing the issue with the 4.3.0 I never managed to reproduce it during development, however, our users experience it.

Fatal Exception: android.net.ConnectivityManager$TooManyRequestsException:
       at android.net.ConnectivityManager.convertServiceException(ConnectivityManager.java:4165)
       at android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4357)
       at android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4364)
       at android.net.ConnectivityManager.registerNetworkCallback(ConnectivityManager.java:4746)
       at android.net.ConnectivityManager.registerNetworkCallback(ConnectivityManager.java:4716)
       at m.fbc.h(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:41)
       at m.fbc.e(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:1)
       at com.google.maps.api.android.lib6.impl.p.b(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:27)
       at com.google.maps.api.android.lib6.impl.cm.aY(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:3)
       at com.google.maps.api.android.lib6.impl.cm.D(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:32)
       at com.google.maps.api.android.lib6.impl.eh.l(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:3)
       at com.google.android.gms.maps.internal.s.bp(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:14)
       at m.bcb.onTransact(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:21)
       at android.os.Binder.transact(Binder.java:1188)
       at com.google.android.gms.internal.maps.zza.zzc(zza.java:2)
       at com.google.android.gms.maps.internal.zzl.onStart(zzl.java:2)
       at com.google.android.gms.maps.zzah.onStart(com.google.android.gms:play-services-maps@@18.2.0:1)
       at com.google.android.gms.dynamic.zaf.zab(com.google.android.gms:play-services-base@@18.3.0:1)
       at com.google.android.gms.dynamic.DeferredLifecycleHelper.zaf(com.google.android.gms:play-services-base@@18.3.0:1)
       at com.google.android.gms.dynamic.DeferredLifecycleHelper.onStart(DeferredLifecycleHelper.java:1)
       at com.google.android.gms.maps.MapView.onStart(MapView.java:1)
       at com.google.maps.android.compose.GoogleMapKt.lifecycleObserver$lambda$11(GoogleMap.kt:211)
       at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.kt:322)
       at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.kt:199)
       at com.google.maps.android.compose.GoogleMapKt$MapLifecycle$1.invoke(GoogleMap.kt:182)
       at com.google.maps.android.compose.GoogleMapKt$MapLifecycle$1.invoke(GoogleMap.kt:178)
       at androidx.compose.runtime.DisposableEffectImpl.onRemembered(Effects.kt:82)
       at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1137)
       at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:828)
       at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:849)
       at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:1041)
       at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:4007)
       at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:4007)
       at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:520)
       at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.subcomposeInto(SubcomposeLayout.kt:721)
       at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.subcompose(SubcomposeLayout.kt:694)
       at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.subcompose(SubcomposeLayout.kt:685)
       at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.subcompose(SubcomposeLayout.kt:669)
       at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$Scope.subcompose(SubcomposeLayout.kt:1014)
       at androidx.compose.material3.BottomSheetScaffoldKt$BottomSheetScaffoldLayout$1$1.invoke-0kLqBqw(BottomSheetScaffold.kt:347)
       at androidx.compose.material3.BottomSheetScaffoldKt$BottomSheetScaffoldLayout$1$1.invoke(BottomSheetScaffold.kt:329)
       at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1.measure-3p2s80s(SubcomposeLayout.kt:866)
       at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0(InnerNodeCoordinator.kt:126)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasure$2.invoke(LayoutNodeLayoutDelegate.kt:1499)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasure$2.invoke(LayoutNodeLayoutDelegate.kt:1495)
       at androidx.compose.runtime.snapshots.Snapshot.enter(Snapshot.java:131)
       at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:476)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:467)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:230)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:133)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:113)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1495)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$getNextChildLookaheadPlaceOrder$p(LayoutNodeLayoutDelegate.kt)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:560)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.measure-BRTryo0(LayoutNodeLayoutDelegate.kt:539)
       at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1.measure-3p2s80s(Box.kt:114)
       at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0(InnerNodeCoordinator.kt:126)
       at androidx.compose.foundation.layout.FillNode.measure-3p2s80s(Size.kt:698)
       at androidx.compose.ui.node.LayoutModifierNodeCoordinator.measure-BRTryo0(LayoutModifierNodeCoordinator.kt:116)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasure$2.invoke(LayoutNodeLayoutDelegate.kt:1499)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasure$2.invoke(LayoutNodeLayoutDelegate.kt:1495)
       at androidx.compose.runtime.snapshots.Snapshot.enter(Snapshot.java:131)
       at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:476)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:467)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:230)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:133)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:113)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1495)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$getNextChildLookaheadPlaceOrder$p(LayoutNodeLayoutDelegate.kt)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:560)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.measure-BRTryo0(LayoutNodeLayoutDelegate.kt:539)
       at androidx.compose.animation.AnimatedEnterExitMeasurePolicy.measure-3p2s80s(AnimatedVisibility.kt:795)
       at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0(InnerNodeCoordinator.kt:126)
       at androidx.compose.ui.graphics.BlockGraphicsLayerModifier.measure-3p2s80s(GraphicsLayerModifier.kt:578)
       at androidx.compose.ui.node.LayoutModifierNodeCoordinator.measure-BRTryo0(LayoutModifierNodeCoordinator.kt:116)
       at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1$1.invoke-3p2s80s(AnimatedContent.kt:763)
       at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1$1.invoke(AnimatedContent.kt:762)
       at androidx.compose.ui.layout.LayoutModifierImpl.measure-3p2s80s(LayoutModifier.kt:291)
       at androidx.compose.ui.node.LayoutModifierNodeCoordinator.measure-BRTryo0(LayoutModifierNodeCoordinator.kt:116)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasure$2.invoke(LayoutNodeLayoutDelegate.kt:1499)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasure$2.invoke(LayoutNodeLayoutDelegate.kt:1495)
       at androidx.compose.runtime.snapshots.Snapshot.enter(Snapshot.java:131)
       at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:476)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:467)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:230)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:133)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:113)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1495)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$getNextChildLookaheadPlaceOrder$p(LayoutNodeLayoutDelegate.kt)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:560)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.measure-BRTryo0(LayoutNodeLayoutDelegate.kt:539)
       at androidx.compose.animation.AnimatedContentMeasurePolicy.measure-3p2s80s(AnimatedContent.kt:814)
       at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0(InnerNodeCoordinator.kt:126)
       at androidx.compose.animation.AnimatedContentTransitionScopeImpl$SizeModifier.measure-3p2s80s(AnimatedContent.kt:598)
       at androidx.compose.ui.node.BackwardsCompatNode.measure-3p2s80s(BackwardsCompatNode.kt:311)
       at androidx.compose.ui.node.LayoutModifierNodeCoordinator.measure-BRTryo0(LayoutModifierNodeCoordinator.kt:116)
       at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier.measure-3p2s80s(GraphicsLayerModifier.kt:646)
       at androidx.compose.ui.node.LayoutModifierNodeCoordinator.measure-BRTryo0(LayoutModifierNodeCoordinator.kt:116)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasure$2.invoke(LayoutNodeLayoutDelegate.kt:1499)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasure$2.invoke(LayoutNodeLayoutDelegate.kt:1495)
       at androidx.compose.runtime.snapshots.Snapshot.enter(Snapshot.java:131)
       at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:476)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:467)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:230)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:133)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:113)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1495)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$getNextChildLookaheadPlaceOrder$p(LayoutNodeLayoutDelegate.kt)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:560)
       at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release(LayoutNode.kt:1140)
       at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release$default(LayoutNode.kt:1131)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure-sdFAvZA(MeasureAndLayoutDelegate.kt:323)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:458)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$getRoot$p(MeasureAndLayoutDelegate.kt)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:344)
       at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:879)
       at androidx.compose.ui.node.Owner.measureAndLayout$default(Owner.kt:223)
       at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1127)
       at android.view.View.draw(View.java:23469)
       at android.view.View.updateDisplayListIfDirty(View.java:22297)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4595)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4568)
       at android.view.View.updateDisplayListIfDirty(View.java:22248)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4595)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4568)
       at android.view.View.updateDisplayListIfDirty(View.java:22248)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4595)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4568)
       at android.view.View.updateDisplayListIfDirty(View.java:22248)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4595)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4568)
       at android.view.View.updateDisplayListIfDirty(View.java:22248)
       at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:682)
       at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:688)
       at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:790)
       at android.view.ViewRootImpl.draw(ViewRootImpl.java:4898)
       at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4593)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3759)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2453)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9468)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1405)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1413)
       at android.view.Choreographer.doCallbacks(Choreographer.java:1040)
       at android.view.Choreographer.doFrame(Choreographer.java:930)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1388)
       at android.os.Handler.handleCallback(Handler.java:942)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loopOnce(Looper.java:240)
       at android.os.Looper.loop(Looper.java:351)
       at android.app.ActivityThread.main(ActivityThread.java:8423)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1013)

fngbala-luna avatar Feb 13 '24 09:02 fngbala-luna

we need to reopen issue , if it still exists in current versions

adilovmaksat avatar Mar 29 '24 04:03 adilovmaksat

Any update on this? Can this ticket be reopened please? It blocks us from using the Compose map in our app.

hanna-h avatar Jun 12 '24 13:06 hanna-h

I'm also having the issue with a large number of markers on the screen.

kociubin avatar Oct 29 '24 17:10 kociubin

I am also facing the same issue

Musfick avatar Nov 11 '24 02:11 Musfick

Reopening this issue to further investigate it.

Do you folks have any code snippet we can use to reproduce it?

kikoso avatar Nov 11 '24 06:11 kikoso

We experienced this issue in the past already, then some GoogleMaps update fixed it for us but since 10.01.2025 we get this crash from time to time again.

The stack trace is almost identical to the initial one, just the version numbers are different:

java.lang.IllegalArgumentException: Unmanaged descriptor
    at com.google.maps.api.android.lib6.common.m.b(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (170300-0):10)
    at com.google.maps.api.android.lib6.impl.w.c(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (170300-0):17)
    at com.google.maps.api.android.lib6.impl.cv.u(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (170300-0):11)
    at com.google.android.gms.maps.model.internal.r.bd(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (170300-0):344)
    at m.do.onTransact(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (170300-0):21)
    at android.os.Binder.transact(Binder.java:1053)
    at com.google.android.gms.internal.maps.zza.zzc(com.google.android.gms:play-services-maps@@19.0.0:0)
    at com.google.android.gms.internal.maps.zza.zzc(com.google.android.gms:play-services-maps@@19.0.0:2)
    at com.google.android.gms.internal.maps.zzaf.zzt(com.google.android.gms:play-services-maps@@19.0.0:0)
    at com.google.android.gms.internal.maps.zzaf.zzt(com.google.android.gms:play-services-maps@@19.0.0:3)
    at com.google.android.gms.maps.model.Marker.setIcon(com.google.android.gms:play-services-maps@@19.0.0:0)
    at com.google.android.gms.maps.model.Marker.setIcon(com.google.android.gms:play-services-maps@@19.0.0:2)
    at com.google.maps.android.clustering.view.DefaultClusterRenderer$CreateMarkerTask.perform(DefaultClusterRenderer.java:0)
    at com.google.maps.android.clustering.view.DefaultClusterRenderer.onClusterUpdated
    at com.google.maps.android.clustering.view.DefaultClusterRenderer$CreateMarkerTask.perform(DefaultClusterRenderer.java:1091)
    at com.google.maps.android.clustering.view.DefaultClusterRenderer$MarkerModifier.performNextTask(DefaultClusterRenderer.java:0)
    at com.google.maps.android.clustering.view.DefaultClusterRenderer$MarkerModifier.performNextTask(DefaultClusterRenderer.java:738)
    at com.google.maps.android.clustering.view.DefaultClusterRenderer$MarkerModifier.handleMessage(DefaultClusterRenderer.java:0)
    at com.google.maps.android.clustering.view.DefaultClusterRenderer$MarkerModifier.handleMessage(DefaultClusterRenderer.java:710)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:257)
    at android.app.ActivityThread.main(ActivityThread.java:8333)
    at java.lang.reflect.Method.invoke(Method.java)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:603)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

I am using the GoogleMap composable inside a Compose Dialog combined with the Clustering composable. I also noticed that the crash happens right away when the map is initialized. But unfortunately, I could not yet find a reproducible example that always triggers it.

A workaround I currently use is to copy ComposeUiClusterRenderer and rememberClusterRenderer from the library to my project (using @SuppressLint("RestrictedApi")) and override onClusterUpdated in ComposeUiClusterRenderer to include an additional try-catch so that the app at least does not crash. It would be way easier if ComposeUiClusterRenderer was public/open so that we could just override the needed method instead copying the whole class. Would that change be possible?

ln-12 avatar Feb 19 '25 08:02 ln-12