外观
页面打不开、黑屏、点不动,先看哪个系统服务?
标准回答
我会先把问题说具体:是找不到目标页面、页面打开到了错误任务或屏幕、窗口存在但没有内容,还是内容可见却不响应触摸。然后记录复现时间、包名、系统版本、用户和目标屏幕,把应用日志与系统证据对齐。
找不到或不能启动时,先查组件解析、用户状态、权限和启动限制,再看 Activity / Task 的记录;页面位置或遮挡异常时,看 WMS 的窗口、层级、可见性与焦点;输入异常时,看输入设备、目标显示、目标窗口、通道与等待状态。主线程卡住也会造成点不动,需要结合线程栈和 Perfetto 判断。
黑屏或冻屏则继续分清:应用有没有产生新内容,窗口对应图层是否可见,缓冲区和图层事务是否推进,以及实际何时呈现。dumpsys 适合查看某一时刻的状态;Perfetto 适合分析时间、调度与调用;Winscope 可把窗口和图层等变化放在时间线上检查。工具选对后,还要找到能解释现象的证据。
最后只修改证据支持的环节,并回归相同用户、显示、切换时序和异常恢复。只抓到一份正常状态的 dump,或重启后恢复正常,都不足以证明根因。
关键机制
- 启动与任务:activity / package;窗口:window;显示:display;输入:input。
- 状态快照回答“现在是什么”,跟踪回答“怎么变成这样、哪段在等待”。
- 跨进程等待继续追被调用方,不能停在应用的 BinderProxy.transact 栈。
通俗例子
副屏页面可见但点不到:先用 display 和 window 确认画面归属,再用 input 看触摸绑定的显示与目标。如果事件已到应用,再看主线程和 View 分发。这样能明确问题在路由还是在控件处理。
追问与回答
dumpsys 看起来正常,为什么仍然会卡?
它通常只反映抓取时刻,问题可能已经结束,也可能是短暂时序错误,单次快照抓不到。我会对齐复现时间采集连续跟踪,观察窗口、输入或线程状态的前后变化,再用关键日志补充。不能把“抓的时候正常”当成“整个过程正常”。
抓到输入 ANR 后,只改应用代码就够吗?
不一定。主线程自己的耗时或锁争用确实可能是原因,但同步系统调用过慢、系统调度压力或窗口焦点问题也可能参与。我会读 ANR 的具体原因,查看应用和服务端相关线程,再结合时间线区分应用处理慢、等待服务和没有正确目标窗口等路径。
易混淆点
命令输出字段和可用功能可能随版本、构建类型与权限变化。下面都是诊断入口,不是每条命令都要执行;先看与现象有关的一两项。
参考资料
内容来源
- Android 技术札记 · 原条目
framework-debug