Repository navigation
Google Map Compose laggy Skipped 32 frames! The application may be doing too much work on its main thread. #664
Description
Activity
- addedtriage meI really want to be triaged.I really want to be triaged.type: bugError or flaw in code with unintended results or allowing sub-optimal usage patterns.Error or flaw in code with unintended results or allowing sub-optimal usage patterns.
on Dec 13, 2024 What did help a bit was putting the
GoogleMapinside aLazyColumnbut now the initial loading takes super long which isn't nice either.Reacted by Alejandro EscobarSame for me. Very simple map but everytime the page including the map opens, map rendering is very slow and partial.
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.
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.
Reacted by Abdullah HameedI 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, ) ) } }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)- addedpriority: p2Moderately-important priority. Fix may not be included in next release.Moderately-important priority. Fix may not be included in next release.and removedtriage meI really want to be triaged.I really want to be triaged.
on Feb 24, 2026 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)
I'm using GoogleMaps as follows:
The problem is that there seems to be going to much going on since in Logcat I can see:
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.