Skip to content
阅读进度

页面打不开、黑屏、点不动,先看哪个系统服务? ​

返回 多屏互动项目 目录

标准回答 ​

我会先把问题说具体:是找不到目标页面、页面打开到了错误任务或屏幕、窗口存在但没有内容,还是内容可见却不响应触摸。然后记录复现时间、包名、系统版本、用户和目标屏幕,把应用日志与系统证据对齐。

找不到或不能启动时,先查组件解析、用户状态、权限和启动限制,再看 Activity / Task 的记录;页面位置或遮挡异常时,看 WMS 的窗口、层级、可见性与焦点;输入异常时,看输入设备、目标显示、目标窗口、通道与等待状态。主线程卡住也会造成点不动,需要结合线程栈和 Perfetto 判断。

黑屏或冻屏则继续分清:应用有没有产生新内容,窗口对应图层是否可见,缓冲区和图层事务是否推进,以及实际何时呈现。dumpsys 适合查看某一时刻的状态;Perfetto 适合分析时间、调度与调用;Winscope 可把窗口和图层等变化放在时间线上检查。工具选对后,还要找到能解释现象的证据。

最后只修改证据支持的环节,并回归相同用户、显示、切换时序和异常恢复。只抓到一份正常状态的 dump,或重启后恢复正常,都不足以证明根因。

关键机制 ​

  • 启动与任务:activity / package;窗口:window;显示:display;输入:input。
  • 状态快照回答“现在是什么”,跟踪回答“怎么变成这样、哪段在等待”。
  • 跨进程等待继续追被调用方,不能停在应用的 BinderProxy.transact 栈。

通俗例子 ​

副屏页面可见但点不到:先用 display 和 window 确认画面归属,再用 input 看触摸绑定的显示与目标。如果事件已到应用,再看主线程和 View 分发。这样能明确问题在路由还是在控件处理。

追问与回答 ​

dumpsys 看起来正常,为什么仍然会卡? ​

它通常只反映抓取时刻,问题可能已经结束,也可能是短暂时序错误,单次快照抓不到。我会对齐复现时间采集连续跟踪,观察窗口、输入或线程状态的前后变化,再用关键日志补充。不能把“抓的时候正常”当成“整个过程正常”。

抓到输入 ANR 后,只改应用代码就够吗? ​

不一定。主线程自己的耗时或锁争用确实可能是原因,但同步系统调用过慢、系统调度压力或窗口焦点问题也可能参与。我会读 ANR 的具体原因,查看应用和服务端相关线程,再结合时间线区分应用处理慢、等待服务和没有正确目标窗口等路径。

易混淆点 ​

命令输出字段和可用功能可能随版本、构建类型与权限变化。下面都是诊断入口,不是每条命令都要执行;先看与现象有关的一两项。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。