咨询Firebase Crashlytics中art::ConditionVariable相关ANR的含义
该ANR的含义解析
这个ANR发生在应用进程退出的收尾阶段,核心原因是虚拟机销毁JavaVM实例时,等待所有非守护线程退出的过程出现阻塞,导致主线程长时间无响应触发ANR。
调用栈逐层解析:
0 libc.so (syscall+28) 1 libart.so(art::ConditionVariable::WaitHoldingLocks(art::Thread*)+140) 2 libart.so(art::ThreadList::WaitForOtherNonDaemonThreadsToExit(bool)+336) 3 libart.so(art::JII::DestroyJavaVM(_JavaVM*)+32) 4 libandroid_runtime.so(android::AndroidRuntime::start(char const*, android::Vector<android::String8> const&, bool)+1032) 5 app_process64(main+1368) 6 libc.so(__libc_init+96)
0 libc.so (syscall+28):底层系统调用进入等待状态,对应条件变量的阻塞操作1 libart.so(art::ConditionVariable::WaitHoldingLocks(art::Thread*)+140):ART虚拟机的条件变量持有锁后进入等待,等待唤醒信号2 libart.so(art::ThreadList::WaitForOtherNonDaemonThreadsToExit(bool)+336):虚拟机线程列表在等待所有非守护线程执行完成并退出3 libart.so(art::JII::DestroyJavaVM(_JavaVM*)+32):正式执行JavaVM实例的销毁逻辑4 libandroid_runtime.so(android::AndroidRuntime::start(...):Android运行时启动流程的收尾环节,实际是进程退出时的清理步骤5 app_process64(main+1368):应用进程主入口进入退出流程6 libc.so(__libc_init+96):C库初始化的收尾操作
核心结论:
这类ANR的本质是应用中存在未及时退出的非守护线程,这些线程一直处于运行状态,导致虚拟机销毁流程被卡住,主线程在处理进程退出的收尾工作时无法及时完成,最终触发ANR。
内容的提问来源于stack exchange,提问作者Chamith Thisaranga
相关产品推荐
相关产品推荐

