Android Jetpack Compose项目中App无崩溃仅UI冻结问题求助
Jetpack Compose测试Crashlytics崩溃时UI冻结的解决办法
我在Android项目中集成了Crashlytics,想测试崩溃功能,就在Jetpack Compose里通过抛出RuntimeException尝试让应用崩溃,但应用没崩溃,反而UI永久冻结,也没出现ANR,只是UI卡住。
更新的测试代码如下:
Button( onClick = { throw RuntimeException("issue test") } ) { Text("Crash") }
原因
Jetpack Compose的onClick回调会被框架内置的异常处理器捕获,不会直接触发进程级崩溃。Compose会尝试恢复UI状态,但这种局部异常捕获会导致UI卡住,而不是让Crashlytics捕获到完整的崩溃信息。
可行的测试方案
1. 把异常抛到主线程全局处理
绕过Compose的局部异常捕获,直接在主线程抛出未被捕获的异常:
Button( onClick = { Handler(Looper.getMainLooper()).post { throw RuntimeException("issue test") } } ) { Text("Crash") }
2. 通过全局协程Scope抛出异常
利用协程的异常处理机制,让异常触发进程级崩溃:
Button( onClick = { CoroutineScope(Dispatchers.Main).launch { throw RuntimeException("issue test") } } ) { Text("Crash") }
3. 直接终止进程(不推荐用于Crashlytics测试)
如果只是需要强制关闭应用,但这种方式Crashlytics可能无法收集完整的崩溃栈信息:
Button( onClick = { Process.killProcess(Process.myPid()) } ) { Text("Crash") }
验证崩溃上报
触发崩溃后重启应用,等待数分钟,即可在Crashlytics后台看到对应的崩溃记录。如果没上报,检查:
- Crashlytics初始化是否完成(确认
FirebaseApp.initializeApp(this)已调用) - 是否处于Debug模式?Debug环境下Crashlytics上报可能延迟或被拦截
- 设备是否联网,崩溃信息需要网络上传
内容的提问来源于stack exchange,提问作者Ali Nawaz
相关产品推荐
相关产品推荐

