求助:Input dispatching timedout(HomeActivity无聚焦窗口)引发的ANR问题
ANR问题:Input dispatching timed out (Activity无聚焦窗口)
问题详情
收到的ANR崩溃报告:
Reason: Input dispatching timed out (ActivityRecord{ecaa4d2 u0 /.ui..HomeActivity t3} does not have a focused window)
主线程调用栈:
"main" prio=5 tid=1 Native | group="main" sCount=1 dsCount=0 flags=1 obj=0x718474c0 self=0xe4a05410 | sysTid=1277 nice=-10 cgrp=default sched=0/0 handle=0xecc1d470 | state=S schedstat=( 10298604300 1305185943 17035 ) utm=910 stm=119 core=2 HZ=100 | stack=0xff787000-0xff789000 stackSize=8192KB | held mutexes= native: #00 pc 0007272c /apex/com.android.runtime/lib/bionic/libc.so (__epoll_pwait+20) native: #01 pc 00044209 /apex/com.android.runtime/lib/bionic/libc.so (epoll_wait+16) native: #02 pc 00011bad /system/lib/libutils.so (android::Looper::pollInner(int)+128) native: #03 pc 00011ad3 /system/lib/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+62) native: #04 pc 000b9eb9 /system/lib/libandroid_runtime.so (android::android_os_MessageQueue_nativePollOnce(_JNIEnv*, _jobject*, long long, int)+26) at android.os.MessageQueue.nativePollOnce(Native method) at android.os.MessageQueue.next(MessageQueue.java:335) at android.os.Looper.loop(Looper.java:183) at android.app.ActivityThread.main(ActivityThread.java:7664) at java.lang.reflect.Method.invoke(Native method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:952)
主线程组Binder线程信息:
"Binder:1277_1" prio=5 tid=14 Native | group="main" sCount=1 dsCount=0 flags=1 obj=0x12f403e0 self=0xe4a06210 | sysTid=1342 nice=0 cgrp=default sched=0/0 handle=0xc1bcd1c0 | state=S schedstat=( 167585904 86193790 337 ) utm=14 stm=2 core=0 HZ=100 | stack=0xc1ad2000-0xc1ad4000 stackSize=1008KB | held mutexes= native: #00 pc 00071654 /apex/com.android.runtime/lib/bionic/libc.so (__ioctl+12) native: #01 pc 0003f76f /apex/com.android.runtime/lib/bionic/libc.so (ioctl+26)
"Binder:1277_2" prio=5 tid=15 Native | group="main" sCount=1 dsCount=0 flags=1 obj=0x12f40458 self=0xe4a13410 | sysTid=1343 nice=0 cgrp=default sched=0/0 handle=0xc1acc1c0 | state=S schedstat=( 219541537 179474996 433 ) utm=16 stm=5 core=1 HZ=100 | stack=0xc19d1000-0xc19d3000 stackSize=1008KB | held mutexes= native: #00 pc 00071654 /apex/com.android.runtime/lib/bionic/libc.so (__ioctl+12) native: #01 pc 0003f76f /apex/com.android.runtime/lib/bionic/libc.so (ioctl+26)
问题分析
这个ANR的核心原因是输入事件分发超时,且目标HomeActivity未获取聚焦窗口。从调用栈来看:
- 主线程处于Looper的poll等待状态,说明主线程未被即时唤醒处理输入事件,可能是此前主线程任务阻塞导致事件队列积压,或是窗口本身无法正常接收事件。
- 两个Binder线程卡在
ioctl调用,提示可能存在跨进程通信(IPC)阻塞,比如调用系统服务时同步等待未返回,间接影响了主线程的窗口状态处理。
解决建议
- 检查HomeActivity窗口初始化流程:排查
onCreate、onResume等生命周期方法中是否有耗时操作(如复杂布局加载、同步IO、大量计算),或者WindowManager相关调用是否异常(如窗口添加失败、焦点设置错误),确保窗口能正常完成初始化并获取焦点。 - 排查主线程阻塞点:使用Android Studio Profiler的CPU监控功能,或开启StrictMode检测主线程的违规操作(如网络请求、数据库操作),将所有耗时任务转移到子线程执行。
- 排查IPC通信异常:检查代码中是否有同步调用系统服务(如ActivityManager、PackageManager)的逻辑,这类调用如果超时会阻塞Binder线程,进而影响主线程。建议改为异步调用,或设置合理的超时时间。
- 检查窗口焦点状态:确认没有代码主动设置窗口不可聚焦(如
window.setFocusable(false)),同时检查Activity的启动模式是否正确,避免栈管理异常导致窗口被覆盖或失去焦点。 - 收集更多日志定位问题:复现问题时用
adb logcat -v time抓取完整系统日志,重点查看WindowManager相关的错误日志,以及ANR发生前后的进程通信异常信息,进一步缩小问题范围。
内容的提问来源于stack exchange,提问作者Javy Ho
相关产品推荐
相关产品推荐

