You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Compose应用Google审核测试阶段崩溃问题求助

Google审核阶段Compose应用的两类崩溃解决方案

崩溃1:Compose Runtime内部错误 (Cannot reposition while in an empty region)

原因分析

该错误属于Compose Runtime的内部API调用异常,从堆栈追踪来看,与NavHost和Crossfade的重组逻辑直接相关。你当前使用的Compose BOM 2022.12.00版本较旧,存在已知的重组相关bug,而Google自动化测试工具的非常规界面操作(如快速连续导航)会进一步触发这类问题。

解决方案

  • 升级Compose依赖:将Compose BOM版本升级至较新的稳定版(如2023.10.01及以后),新版本修复了大量重组与导航相关的内部错误,只需修改compose-bom的版本号,相关依赖会自动同步升级。
  • 规范导航与动画组件使用:确保NavHost的navController状态不会在重组时频繁无意义更新;使用Crossfade时,确认目标状态的稳定性,避免在重组时频繁切换未初始化的状态。
  • 临时异常规避(可选):若暂时无法升级依赖,可尝试在NavHost外层包裹LaunchedEffect或DisposableEffect,避免异常扩散,但此仅为临时方案,优先推荐升级依赖。

崩溃堆栈:

at androidx.compose.runtime.ComposerKt.composeRuntimeError(Composer.kt:4383)
   at androidx.compose.runtime.SlotReader.reposition(SlotTable.kt:3448)
   at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2348)
   at androidx.compose.runtime.ComposerImpl.skipToGroupEnd(Composer.kt:2666)
   at androidx.navigation.compose.NavHostKt$NavHost$4.invoke(NavHost.kt:164)
   at androidx.navigation.compose.NavHostKt$NavHost$4.invoke(NavHost.kt:141)
   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116)
   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
   at androidx.compose.animation.CrossfadeKt$Crossfade$5$1.invoke(Crossfade.kt:133)
   at androidx.compose.animation.CrossfadeKt$Crossfade$5$1.invoke(Crossfade.kt:128)
   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
   at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
   at androidx.compose.animation.CrossfadeKt.Crossfade(Crossfade.kt:142)
   at androidx.compose.animation.CrossfadeKt$Crossfade$7.invoke(:17)
   at androidx.compose.animation.CrossfadeKt$Crossfade$7.invoke(:8)
   at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:145)
   at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2375)
   at androidx.compose.runtime.ComposerImpl.skipCurrentGroup(Composer.kt:2643)
   at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:3260)
   at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:3238)
   at androidx.compose.runtime.SnapshotStateKt__DerivedStateKt.observeDerivedStateRecalculations(DerivedState.kt:341)
   at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(:1)
   at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:3238)
   at androidx.compose.runtime.ComposerImpl.recompose$runtime_release(Composer.kt:3203)
   at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:771)
   at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:1031)
   at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:125)
   at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:534)
   at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:503)
   at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:34)
   at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109)
   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:1035)
   at android.view.Choreographer.doCallbacks(Choreographer.java:845)
   at android.view.Choreographer.doFrame(Choreographer.java:775)
   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1022)
   at android.os.Handler.handleCallback(Handler.java:938)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loopOnce(Looper.java:201)
   at android.os.Looper.loop(Looper.java:288)
   at android.app.ActivityThread.main(ActivityThread.java:7839)
   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:1003)

崩溃2:测试工具内部NullPointerException (Messenger.send调用空对象)

原因分析

该崩溃来自Google审核使用的自动化测试爬虫工具(androidx.test.tools.crawler),属于工具自身的内部错误,与你的应用代码无关,是工具尝试调用未初始化的Messenger实例导致的。

解决方案

  • 无需修改应用代码:这类崩溃仅发生在审核流程中,不会影响真实用户使用。
  • 过滤崩溃统计:在Firebase Crashlytics中添加过滤规则,排除androidx.test.tools.crawler相关的崩溃记录,避免干扰应用稳定性统计。
  • 反馈工具问题:可在Google Play Console的审核反馈中提及该问题,帮助Google修复测试工具的bug。

崩溃堆栈:

at androidx.test.tools.crawler.platform.RemotePlatform.handleOverlayServiceRequest(RemotePlatform.java:6)
   at androidx.test.tools.crawler.platform.RemotePlatform.messageLoop(RemotePlatform.java:48)
   at androidx.test.tools.crawler.platform.RemotePlatform.lambda$startCrawlAndWaitUntilFinished$0$androidx-test-tools-crawler-platform-RemotePlatform(RemotePlatform.java:1)
   at androidx.test.tools.crawler.platform.RemotePlatform$$ExternalSyntheticLambda1.run(:6)
   at java.lang.Thread.run(Thread.java:920)

内容的提问来源于stack exchange,提问作者Mami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:35:13