A
Air官方
应用界面冻结(点了没反应、动画停住)是移动端最伤体验的故障。这篇给一套六步排查法,把冻结类问题标准化。
▍第一步:确认活性
先分辨真冻结与假冻结:界面完全不动(连原生壳的菜单都没反应)还是局部不动(壳能弹菜单,主区域死)。全死指向系统事件分发层或主线程;局部死指向框架事件通道。这一步用系统操作(下拉通知、返回手势)测系统层响应,用壳菜单测壳层。
▍第二步:看冻结报告
无响应会被系统处置并生成冻结日志(faultlog 篇有读法)。栈是第一证据:主线程在等什么、别的线程在干什么。两大模板:主线程栈顶在等待(锁或 IO)——找持锁者;主线程在跑重活(解码、全量扫描)——看它在算什么。
▍第三步:查 CPU
冻结时进程的 CPU 占用是关键分类特征:占用高(忙死,在算东西);占用零(等死,全线程等待)。零占用的冻结最难看直觉,但等死的解法是找等待环(各线程栈画等待图)。工具:设备侧进程状态查询加线程级采样。
▍第四步:还原时间线
冻结前应用的文件日志(txt 日志体系)看最后的事件:最后一条日志是什么、之后该发生什么没发生。日志断点常常直接指向卡点(最后日志是开始部署资源,然后没有后续——卡在部署)。
▍第五步:受控实验
按怀疑点设计实验:怀疑输入通道卡(注入测试:自动化注入点击看有无反应);怀疑特定操作触发(最小复现路径:从启动开始逐步加操作,定位触发步);怀疑时序竞争(加重延迟或加日志观察是否消失——能被日志改变行为的问题是强竞争信号)。
▍第六步:修复与回归
修复按根因分型:锁设计问题(缩小临界区、限时锁、避免嵌套);重活阻塞(挪后台线程);IO 挂起(超时与降级);看门狗误报(长任务拆段保活)。回归要压测形态:反复进出触发场景,偶发冻结复现率统计(复现率篇有方法)。
▍预防
六步法是治标,预防是架构纪律:主线程零阻塞、输入热路径零 IO、跨线程回调走安全通道——这三条守住,冻结类问题少九成。
更多真实移植案例,欢迎到 apps 板块翻看 56 篇《鸿蒙PC适配全记录》系列实录。
▍第一步:确认活性
先分辨真冻结与假冻结:界面完全不动(连原生壳的菜单都没反应)还是局部不动(壳能弹菜单,主区域死)。全死指向系统事件分发层或主线程;局部死指向框架事件通道。这一步用系统操作(下拉通知、返回手势)测系统层响应,用壳菜单测壳层。
▍第二步:看冻结报告
无响应会被系统处置并生成冻结日志(faultlog 篇有读法)。栈是第一证据:主线程在等什么、别的线程在干什么。两大模板:主线程栈顶在等待(锁或 IO)——找持锁者;主线程在跑重活(解码、全量扫描)——看它在算什么。
▍第三步:查 CPU
冻结时进程的 CPU 占用是关键分类特征:占用高(忙死,在算东西);占用零(等死,全线程等待)。零占用的冻结最难看直觉,但等死的解法是找等待环(各线程栈画等待图)。工具:设备侧进程状态查询加线程级采样。
▍第四步:还原时间线
冻结前应用的文件日志(txt 日志体系)看最后的事件:最后一条日志是什么、之后该发生什么没发生。日志断点常常直接指向卡点(最后日志是开始部署资源,然后没有后续——卡在部署)。
▍第五步:受控实验
按怀疑点设计实验:怀疑输入通道卡(注入测试:自动化注入点击看有无反应);怀疑特定操作触发(最小复现路径:从启动开始逐步加操作,定位触发步);怀疑时序竞争(加重延迟或加日志观察是否消失——能被日志改变行为的问题是强竞争信号)。
▍第六步:修复与回归
修复按根因分型:锁设计问题(缩小临界区、限时锁、避免嵌套);重活阻塞(挪后台线程);IO 挂起(超时与降级);看门狗误报(长任务拆段保活)。回归要压测形态:反复进出触发场景,偶发冻结复现率统计(复现率篇有方法)。
▍预防
六步法是治标,预防是架构纪律:主线程零阻塞、输入热路径零 IO、跨线程回调走安全通道——这三条守住,冻结类问题少九成。
更多真实移植案例,欢迎到 apps 板块翻看 56 篇《鸿蒙PC适配全记录》系列实录。
楼主
7 天前