Skip to content

Google Map Compose laggy Skipped 32 frames! The application may be doing too much work on its main thread. #664

Description

@vanniktech

I'm using GoogleMaps as follows:

Box {
	val mapUiSettings by remember {
	  mutableStateOf(
	    MapUiSettings(
	      mapToolbarEnabled = false,
	      myLocationButtonEnabled = false, // We don't want that button.
	      zoomControlsEnabled = false,
	    ),
	  )
	}
	
	val cameraPositionState = rememberCameraPositionState()
	
	GoogleMap(
	  properties = MapProperties(isMyLocationEnabled = isMyLocationEnabled),
	  modifier = modifier,
	  cameraPositionState = cameraPositionState,
	  uiSettings = mapUiSettings,
	  mapColorScheme = ComposeMapColorScheme.FOLLOW_SYSTEM,
	)
	
  ScaleBar(
    modifier = Modifier
      .padding(top = 5.dp, end = 15.dp)
      .align(Alignment.TopEnd),
    cameraPositionState = cameraPositionState,
    textColor = MaterialTheme.colorScheme.onBackground,
    lineColor = MaterialTheme.colorScheme.onBackground,
    shadowColor = Color.Transparent,
  )

}

The problem is that there seems to be going to much going on since in Logcat I can see:

Skipped 32 frames! The application may be doing too much work on its main thread.

Now this is just a super simple map that is displayed with the following Modifier: Modifier.fillMaxWidth().aspectRatio(1f)

Is there any trick to speed it up or am I doing something wrong? I'm already on the last 6.4.0 version.

Activity

  1. added
    triage meI really want to be triaged.
    type: bugError or flaw in code with unintended results or allowing sub-optimal usage patterns.
    on Dec 13, 2024
  2. vanniktech commented on Dec 15, 2024

    @vanniktech
    Author

    What did help a bit was putting the GoogleMap inside a LazyColumn but now the initial loading takes super long which isn't nice either.

  3. sevbanBayir commented on Feb 1, 2025

    @sevbanBayir

    Same for me. Very simple map but everytime the page including the map opens, map rendering is very slow and partial.

  4. abdullahdev5 commented on Feb 3, 2025

    @abdullahdev5

    Same for Me. When the Map is Loading then My Whole Scroll Stops and When the Map Loads then its all Cool. I am also Frustrated.

  5. bubenheimer commented on Feb 3, 2025

    @bubenheimer
    Contributor

    Is there any trick to speed it up or am I doing something wrong? I'm already on the last 6.4.0 version.

    Generally speaking, applying R8 & baseline profiles should improve the behavior.

  6. andrejordan commented on Nov 23, 2025

    @andrejordan

    I rendered a tiny 1x1 map on our app's startup loading page, and it made all subsequent loads faster. It's something to do with how Google Maps/Places warms up. Not ideal, but IMO it's better than having a laggy app experience.

    /**
     * Lightweight, offscreen Google Maps composable used to "warm up" the Maps SDK
     * and Maps Compose integration as early as possible in the app flow.
     *
     * Warming up in this context means eagerly triggering the work that normally
     * happens the first time a map is shown to the user: loading native code,
     * establishing network connections, fetching initial tiles, shaders and
     * other rendering resources, and creating the internal map engine.
     *
     * By doing this work on a loading screen, subsequent map usages (for example
     * chat location bubbles) can become visible much faster because most of the
     * expensive one‑time initialization has already completed.
     *
     * This composable renders a 1.dp tall, non-interactive map with all
     * user-facing UI and gestures disabled. It is effectively invisible to the
     * user while still incurring the cost of map initialization.
     *
     * Place this in early/loading screens that already render a solid background
     * (for example a white loading surface). Be aware that there is still a
     * small upfront CPU/GPU/network cost when this composable first runs; the
     * intent is to pay that cost earlier when the user is already waiting,
     * rather than when they first open a map-heavy screen.
     */
    @Composable
    fun InvisibleGoogleMapsWarmup() {
        val warmupCoord = LatLng(19.4326, -99.1332)
        val cameraPositionState = rememberCameraPositionState {
            position = CameraPosition.fromLatLngZoom(warmupCoord, 12f)
        }
    
        Box(
            modifier = Modifier
                .width(1.dp)
                .height(1.dp)
                .alpha(0.1f)
        ) {
            GoogleMap(
                modifier = Modifier.fillMaxSize(),
                cameraPositionState = cameraPositionState,
                properties = MapProperties(
                    isMyLocationEnabled = false,
                    isBuildingEnabled = false,
                    isIndoorEnabled = false,
                    isTrafficEnabled = false,
                ),
                uiSettings = MapUiSettings(
                    compassEnabled = false,
                    indoorLevelPickerEnabled = false,
                    mapToolbarEnabled = false,
                    myLocationButtonEnabled = false,
                    rotationGesturesEnabled = false,
                    scrollGesturesEnabled = false,
                    scrollGesturesEnabledDuringRotateOrZoom = false,
                    tiltGesturesEnabled = false,
                    zoomControlsEnabled = false,
                    zoomGesturesEnabled = false,
                )
            )
        }
    }
    
  7. arun-ns commented on Feb 11, 2026

    @arun-ns

    Skipped XX frames! The application may be doing too much work on its main thread.

    Is anyone still facing this issue?
    It happens every time on the first load. If I kill the app and reopen it (process restart), it occurs again.

    I can see some logs in logcat

    ClientParametersBlockingReference.blockedOnMainThread: ENABLE_FEATURES for 126 ms.
    java.lang.Throwable
    	at m140.bgt.m(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:179)
    	at m140.bgt.a(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:1)
    	at m140.ben.a(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:3)
    	at m140.big.b(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:9)
    	at m140.ebh.a(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:147)
    	at m140.jic.d(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:12)
    	at m140.jic.a(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:7)
    	at m140.dzb.<init>(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:43)
    	at m140.dzc.a(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:72)
    	at m140.jic.d(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:12)
    	at m140.jic.a(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:7)
    	at com.google.maps.api.android.lib6.phoenix.bg.a(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:5)
    	at m140.jic.d(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:12)
    	at m140.jic.a(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:7)
    	at com.google.maps.api.android.lib6.phoenix.be.a(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:3)
    	at m140.jic.d(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:12)
    	at m140.jic.a(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:7)
    	at com.google.maps.api.android.lib6.phoenix.bj.a(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:3)
    	at m140.jic.d(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:12)
    	at m140.jic.a(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:7)
    	at com.google.maps.api.android.lib6.impl.cg.aY(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:67)
    	at com.google.maps.api.android.lib6.impl.em.d(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:12)
    	at com.google.android.gms.maps.internal.r.bt(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:158)
    	at m140.ayi.onTransact(:com.google.android.gms.policy_maps_core_dynamite@254515607@254515602025.843324832.843324832:21)
    	at android.os.Binder.transact(Binder.java:1325)
    	at com.google.android.gms.internal.maps.zza.zzc(com.google.android.gms:play-services-maps@@20.0.0:2)
    	at com.google.android.gms.maps.internal.zzl.onCreate(com.google.android.gms:play-services-maps@@20.0.0:3)
    	at com.google.android.gms.maps.zzah.onCreate(com.google.android.gms:play-services-maps@@20.0.0:3)
    	at com.google.android.gms.dynamic.zac.zab(com.google.android.gms:play-services-base@@18.10.0:1)
    	at com.google.android.gms.dynamic.zaa.onDelegateCreated(com.google.android.gms:play-services-base@@18.10.0:3)
    	at com.google.android.gms.maps.zzai.zzb(com.google.android.gms:play-services-maps@@20.0.0:5)
    	at com.google.android.gms.maps.zzai.createDelegate(com.google.android.gms:play-services-maps@@20.0.0:1)
    	at com.google.android.gms.dynamic.DeferredLifecycleHelper.zaf(com.google.android.gms:play-services-base@@18.10.0:6)
    	at com.google.android.gms.dynamic.DeferredLifecycleHelper.onCreate(com.google.android.gms:play-services-base@@18.10.0:1)
    	at com.google.android.gms.maps.MapView.onCreate(com.google.android.gms:play-services-maps@@20.0.0:4)
    	at com.google.maps.android.compose.MapLifecycleEventObserver.invokeEvent(GoogleMap.kt:378)
    	at com.google.maps.android.compose.MapLifecycleEventObserver.moveUp(GoogleMap.kt:373)
    	at com.google.maps.android.compose.MapLifecycleEventObserver.moveToLifecycleState(GoogleMap.kt:358)
    	at com.google.maps.android.compose.MapLifecycleEventObserver.onStateChanged(GoogleMap.kt:335)
    	at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.jvm.kt:316)
    	at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.jvm.kt:193)
    	at com.google.maps.android.compose.GoogleMapKt$GoogleMap$4$1$1$onAttachStateListener$1.onViewAttachedToWindow(GoogleMap.kt:185)
    	at android.view.View.dispatchAttachedToWindow(View.java:23305)
    	at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3517)
    	at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3524)
    	at android.view.ViewGroup.addViewInner(ViewGroup.java:5329)
    	at android.view.ViewGroup.addView(ViewGroup.java:5115)
    	at android.view.ViewGroup.addView(ViewGroup.java:5055)
    	at android.view.ViewGroup.addView(ViewGroup.java:5027)
    	at androidx.compose.ui.platform.AndroidComposeView.addAndroidView(AndroidComposeView.android.kt:1593)
    	at androidx.compose.ui.viewinterop.AndroidViewHolder$layoutNode$1$3.invoke(AndroidViewHolder.android.kt:445)
    	at androidx.compose.ui.viewinterop.AndroidViewHolder$layoutNode$1$3.invoke(AndroidViewHolder.android.kt:444)
    	at androidx.compose.ui.node.LayoutNode.attach$ui(LayoutNode.kt:567)
    	at androidx.compose.ui.node.LayoutNode.attach$ui(LayoutNode.kt:559)
    	at androidx.compose.ui.node.LayoutNode.insertAt$ui(LayoutNode.kt:314)
    	at androidx.compose.ui.node.UiApplier.insertBottomUp(UiApplier.android.kt:29)
    	at androidx.compose.ui.node.UiApplier.insertBottomUp(UiApplier.android.kt:21)
    	at androidx.compose.runtime.changelist.Operation$PostInsertNodeFixup.execute(Operation.kt:777)
    	at androidx.compose.runtime.changelist.Operation.executeWithComposeStackTrace(Operation.kt:63)
    	at androidx.compose.runtime.changelist.Operations.executeAndFlushAllPendingOperations(Operations.kt:350)
    	at androidx.compose.runtime.changelist.FixupList.executeAndFlushAllPendingFixups(FixupList.kt:54)
    	at androidx.compose.runtime.changelist.Operation$InsertSlotsWithFixups.execute(Operation.kt:683)
    	at androidx.compose.runtime.changelist.Operation.executeWithComposeStackTrace(Operation.kt:63)
    	at androidx.compose.runtime.changelist.Operations.executeAndFlushAllPendingOperations(Operations.kt:350)
    	at androidx.compose.runtime.changelist.ChangeList.executeAndFlushAllPendingChanges(ChangeList.kt:90)
    	at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:1120)
    	at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1160)
    	at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2.invokeSuspend$lambda$2(Recomposer.kt:716)
    	at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$$ExternalSyntheticLambda0.invoke(D8$$SyntheticClass:0)
    	at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:39)
    	at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:108)
    	at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41)
    	at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69)
    	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1628)
    	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1639)
    	at android.view.Choreographer.doCallbacks(Choreographer.java:1235)
    	at android.view.Choreographer.doFrame(Choreographer.java:1160)
    	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1613)
    	at android.os.Handler.handleCallback(Handler.java:1070)
    	at android.os.Handler.dispatchMessage(Handler.java:125)
    	at android.os.Looper.dispatchMessage(Looper.java:333)
    	at android.os.Looper.loopOnce(Looper.java:263)
    	at android.os.Looper.loop(Looper.java:367)
    	at android.app.ActivityThread.main(ActivityThread.java:9287)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:566)
    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:929)
    
  8. added
    priority: p2Moderately-important priority. Fix may not be included in next release.
    and removed
    triage meI really want to be triaged.
    on Feb 24, 2026
  9. sasha2002 commented on Apr 25, 2026

    @sasha2002

    Me :

    ClientParametersBlockingReference.blockedOnMainThread: ENABLE_FEATURES for 108 ms. 
    java.lang.Throwable
    	at m140.bho.m(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:164)
    	at m140.bho.a(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:1)
    	at m140.bfi.a(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:3)
    	at m140.bjb.b(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:9)
    	at m140.ecx.a(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:148)
    	at m140.jqe.d(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:12)
    	at m140.jqe.a(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:7)
    	at m140.eaq.<init>(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:47)
    	at m140.ear.a(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:78)
    	at m140.jqe.d(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:12)
    	at m140.jqe.a(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:7)
    	at com.google.maps.api.android.lib6.phoenix.bg.a(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:5)
    	at m140.jqe.d(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:12)
    	at m140.jqe.a(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:7)
    	at com.google.maps.api.android.lib6.phoenix.be.a(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:3)
    	at m140.jqe.d(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:12)
    	at m140.jqe.a(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:7)
    	at com.google.maps.api.android.lib6.phoenix.bj.a(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:3)
    	at m140.jqe.d(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:12)
    	at m140.jqe.a(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:7)
    	at com.google.maps.api.android.lib6.impl.cg.aY(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:67)
    	at com.google.maps.api.android.lib6.impl.el.d(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:12)
    	at com.google.android.gms.maps.internal.r.br(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:158)
    	at m140.azc.onTransact(:com.google.android.gms.policy_maps_core_dynamite@260830204@260830201025.878499810.878499810:21)
    	at android.os.Binder.transact(Binder.java:921)
    	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.maps.internal.zzl.onCreate(com.google.android.gms:play-services-maps@@19.0.0:3)
    	at com.google.android.gms.maps.zzah.onCreate(com.google.android.gms:play-services-maps@@19.0.0:3)
    	at com.google.android.gms.dynamic.zac.zab(com.google.android.gms:play-services-base@@18.4.0:1)
    	at com.google.android.gms.dynamic.zaa.onDelegateCreated(com.google.android.gms:play-services-base@@18.4.0:3)
    	at com.google.android.gms.maps.zzai.zzb(com.google.android.gms:play-services-maps@@19.0.0:5)
    	at com.google.android.gms.maps.zzai.createDelegate(com.google.android.gms:play-services-maps@@19.0.0:1)
    	at com.google.android.gms.dynamic.DeferredLifecycleHelper.zaf(com.google.android.gms:play-services-base@@18.4.0:6)
    	at com.google.android.gms.dynamic.DeferredLifecycleHelper.onCreate(com.google.android.gms:play-services-base@@18.4.0:1)
    
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    priority: p2Moderately-important priority. Fix may not be included in next release.type: bugError or flaw in code with unintended results or allowing sub-optimal usage patterns.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions