Skip to content
阅读进度

多屏故障与单用户空间适配 ​

返回项目专题

1. 跨屏后黑屏、闪屏,应该怎样逐层定位? ​

**标准回答:**先区分黑屏发生在替身阶段还是目标真实窗口阶段。检查目标任务是否进入正确显示、窗口是否创建并可见、尺寸与 crop 是否有效、是否提交了正确 buffer、图层是否被遮挡,以及快照何时被撤掉。闪屏通常需要寻找某一帧的内容突变,例如旧配置画面短暂暴露、starting window / 背景穿出,或替身提前消失。

日志应能关联同一个 transitionId、taskId、displayId 和窗口 / 图层身份,再与 Trace 和视频对照。看到 Activity 已 Resumed,只能排除部分组件状态问题,不能证明显示链路正常。

**追问:把 windowBackground 改透明能解决吗?**它可能改变暴露出来的背景,但不证明交接问题已修复。先确认究竟哪份画面漏出来,再决定窗口背景、预览窗口和转场策略是否需要调整。

2. 页面状态已经更新,但画面冻结,怎样区分输入和渲染问题? ​

**标准回答:**先看业务是否真的收到输入。没有收到时,追输入设备、displayId、焦点窗口、InputDispatcher 和应用消息处理;收到且状态变化后仍没有新画面,则追 requestLayout / invalidate、Choreographer、主线程、RenderThread、GPU、缓冲区提交和合成。最后检查是不是旧快照仍遮在新窗口上。

主线程 Running、Runnable 和 Waiting 的含义不同:Running 长可能是实际工作多,Runnable 长可能是等待 CPU,Waiting 需要追锁、Binder 或 I/O 依赖。画面停住并不总是应用主线程卡住。

**追问:dumpsys 看到状态正常,就能排除系统吗?**不能。静态快照可能错过短暂竞态,状态正常也可能与显示画面不一致。需要失败时间附近的连续事件与帧证据。

3. 花屏、裁剪错位与模糊残留,有哪些不同的怀疑点? ​

**标准回答:**花屏应先描述具体视觉特征,区分错误内容、错位、色彩异常和缓冲区异常。跨屏尺寸、密度与方向不同,可能导致 transform、crop、buffer 尺寸和窗口 bounds 不一致;格式、色彩空间或资源生命周期错误也可能造成异常。不能只凭“花屏”两个字就宣布 GPU 驱动有问题。

模糊残留更应检查图层身份、alpha 和清理路径。裁剪错位要对齐源坐标、目标坐标、缩放比例、旋转和接缝区域;可以使用带网格与方向标记的测试内容,避免纯色画面掩盖问题。

**追问:截图没有异常,实屏却有异常,说明什么?**不同截取路径可能观察到显示链路的不同阶段。应核对截图、录屏、合成与物理显示各自的观测范围,再继续定位,不能单凭一种采集结果排除所有下游问题。

4. 多用户空间迁移到单用户空间,为什么不能只改 userId? ​

**标准回答:**userId 参与包与组件可用性、UID、数据目录、设置、权限、服务绑定及用户生命周期等边界;displayId 表示显示目标。二者不能互相替代。迁移到单用户空间后,还要检查应用是否原来依赖用户隔离来分别保存状态、运行服务或区分消息接收方。

例如原来每个用户有独立进程和单例,迁移后可能变成同一用户、同一进程内多个窗口共享静态对象。一份全局播放状态、缓存宽高或当前 Activity 引用,就可能让两个显示互相覆盖。应明确状态究竟属于用户、显示、任务、会话还是全局平台。

**追问:需要检查什么回归矩阵?**多屏同时运行、独立操作、切换焦点、服务重连、广播路由、进程重启、屏幕热插拔、配置变化、共享设置和持久数据迁移。项目确有单用户空间适配经历,但具体根因、修改位置和结果需要用真实记录补充。

参考资料 ​

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