Jetpack Compose版Dessert Clicker启动崩溃,求调试排查思路
Android ViewModel迁移调试排查记录
我正在学习Google Android开发者的ViewModel与状态管理教程,完成将Dessert Clicker应用迁移至ViewModel的实验时遇到问题:应用启动即崩溃,Logcat中看不到MainActivity的onCreate()日志,在super.onCreate(...)处设置的断点也未触发,一度怀疑是APK配置存在根本性问题。我希望掌握这类问题的通用调试方法,而非直接依赖教程提供的解决方案。
第一步排查:设备选择错误
后续发现是调试设备选错了——选中了实体手机而非用于调试的AVD。切换到正确的AVD后,Logcat终于输出了完整的堆栈跟踪信息:
2024-01-11 11:11:11.119 12385-12385 AndroidRuntime com.example.dessertclicker E FATAL EXCEPTION: main Process: com.example.dessertclicker, PID: 12385 android.content.res.Resources$NotFoundException: Resource ID #0x0 at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:234) at android.content.res.Resources.getValue(Resources.java:1439) at androidx.compose.ui.res.PainterResources_androidKt.painterResource(PainterResources.android.kt:61) at com.example.dessertclicker.MainActivityKt.DessertClickerScreen(MainActivity.kt:230) ...
错误定位与修复
堆栈信息明确指向资源调用错误:误用了UiState中的currentDessertImageId而非ViewModel对应的属性,导致传入了无效的资源ID(0x0)。通过以下代码修改解决问题:
diff --git a/AndroidBasicsCourse/DessertClicker/app/src/main/java/com/example/dessertclicker/MainActivity.kt b/AndroidBasicsCourse/DessertClicker/app/src/main/java/com/example/dessertclicker/MainActivity.kt index 6dffdf0..a9599ee 100644 --- a/AndroidBasicsCourse/DessertClicker/app/src/main/java/com/example/dessertclicker/MainActivity.kt +++ b/AndroidBasicsCourse/DessertClicker/app/src/main/java/com/example/dessertclicker/MainActivity.kt @@ -164,7 +164,7 @@ private fun DessertClickerApp( DessertClickerScreen( revenue = dessertClickerUiState.revenue, dessertsSold = dessertClickerUiState.dessertsSold, - dessertImageId = dessertClickerUiState.currentDessertImageId, + dessertImageId = dessertClickerViewModel.currentDessertImageId, onDessertClicked = { dessertClickerViewModel.updateRevenue() dessertClickerViewModel.updateDessertsSold()
通用调试排查思路
针对此类启动崩溃且无关键日志的问题,可按以下步骤排查:
- 确认调试目标设备:检查是否选中了正确的调试设备(AVD/实体机),确保设备已正确连接、开发者模式已开启,且应用已成功安装到目标设备。
- 查看完整Logcat日志:切换到正确设备后,筛选对应应用包名的日志,重点关注
AndroidRuntime标签下的错误信息,通过堆栈跟踪定位到具体代码行。 - 验证资源与数据状态:若出现
Resources$NotFoundException,检查传入的资源ID是否有效,确认数据来源(如ViewModel/UiState)是否正确初始化了资源属性。 - 断点调试验证:确保断点设置在正确的代码位置,且调试器已成功附加到目标进程,可通过重启调试会话、清理项目后重新编译安装来解决断点不触发的问题。
感谢@a_local_nobody的帮助!
内容的提问来源于stack exchange,提问作者Alexandru Gheorghe
相关产品推荐
相关产品推荐

