ANR高级经验分享:No Focused类型ANR详细步骤
文章目录背景Not have a Focused Window介绍分析这类no Foucsed ANR技巧分享**1、区分FocusedApplication和FocusedWindow**FocusedApplicationFocusedWindow2 分析日志和dumpsys部分events日志分析部分dumpsys SF中焦点窗口显示情况dumpsys window中焦点窗口是否计算正常检查应用生命周期看是窗口否显示检查其他性能卡顿相关日志背景在马哥的wms实战课程中已经详细给大家讲解过Focused Window相关的知识同时教大家详细分析了Not have a Focused Window这个类型的ANR相关案例。但是在实际系统fw开发工作中app层面报出的No Focused Window类型的ANR其实非常非常多而且每一个ANR都可能情况不一样所以针对这类 no Focused Window类型的ANR问题用本文我们进行相关的一些相关于分析技巧总结归纳大家以后分析都按照这个固定套路去分析哈。Not have a Focused Window介绍ANR是Android稳定性问题分析的一个难点其中比较常见的一种是窗口无焦点Not have a Focused Window这类无焦点窗口ANR相比其他Application not response无响应更难分析。focused ANR一定是wms问题如果对该ANR的原理不了解会直接认为窗口焦点是WMS控制出现无焦点就一定是WMS导致。其实不是这样哈这种无焦点窗口ANR还是需要从ANR产生原理触发结合系统相关日志dumpsys等综合分析才可以得出初步结论原因也就是并不是这种no focused anr就是wms逻辑错误导致无焦点的大部分情况下其实是属于系统某些卡顿性能或者app不正确操作设置等导致的真正说wms自身逻辑错误导致no focused window其实还是很少哈。所以当app产生这类no focused window的anr大家不要着急甩锅给系统wms负责的哈应该自己学会来综合分析不然很有可能很快甩锅回来。无焦点ANR产生条件无焦点类型的ANR不是所有输入事件都会触发。在需要焦点窗口的input事件派发时会去寻找焦点窗口找不到的时候会超时计时过了超时时间触发ANR因此只有Key事件和非触摸的Motion事件比如滚轮这种需要焦点窗口的才会导致该类ANR。所以大家在分析日志时候就会发现一般只有key事件包括实体按键和导航栏那种按钮模拟key事件要派发才会有这类anr只是手指触摸一般没有这类anr问题。分析这类no Foucsed ANR技巧分享其实针对这类anr问题已经在wms实战课程中有给大家讲解过相关的案例分析这里再进行总结归纳一下方便大家记忆回顾课程。1、区分FocusedApplication和FocusedWindowFocusedApplicationFocusedApplication——对应ActivityFocusedWindow——对应窗口但不一定是上述Activity的窗口。比如在launcher上下拉状态栏两者并不一致FocusedApplications:displayId0,nameActivityRecord{173024276 u0 com.android.launcher3/.uioverrides.QuickstepLauncher t20},dispatchingTimeout5000ms FocusedWindows:displayId0,name7556327 NotificationShadeFocusedApp是WMS通过JNI向InputDispatcher设置的需要改变FocusedApp的地方不少特殊场景是Activity在Display/Task间切换比如resumeTopActivitymoveTaskToFront等方法。frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java*/booleansetFocusedApp(ActivityRecord newFocus){if(newFocus!null){finalDisplayContent appDisplaynewFocus.getDisplayContent();// Called even if the focused app is not changed in case the app is moved to a different// TaskDisplayArea.onLastFocusedTaskDisplayAreaChanged(newFocus.getDisplayArea());}if(mFocusedAppnewFocus){returnfalse;}ProtoLog.i(WM_DEBUG_FOCUS_LIGHT,setFocusedApp %s displayId%d Callers%s,newFocus,getDisplayId(),Debug.getCallers(4));finalTask oldTaskmFocusedApp!null?mFocusedApp.getTask():null;finalTask newTasknewFocus!null?newFocus.getTask():null;mFocusedAppnewFocus;if(oldTask!newTask){if(oldTask!null)oldTask.onAppFocusChanged(false);if(newTask!null)newTask.onAppFocusChanged(true);}getInputMonitor().setFocusedAppLw(newFocus);returntrue;}这里也有对应的proto日志大家可以考虑开放WM_DEBUG_FOCUS_LIGHT这个Proto的TAG。当然也可以通过dumpsys window 或者dumpsys input查看当前的FocusApp。FocusedWindowFocusedWindow是由WMS计算出一个焦点窗口每个Display有自己的将它传给SurfaceFlinger处理之后再向InputDispatcher设置的。早期的Android版本WMS是直接向InputDispatcher设置的现在传给SF处理可能是考虑到窗口最终是否显示是由SF决定的这样更准确。因此WMS中计算出的焦点窗口如果在SurfaceFlinger处理后处于非显示状态被遮挡那么在InputDispatcher中它是不能成为焦点窗口的。因为在SF和Input需要进一步处理所以WMS进行数据传递时传递两种数据1、焦点窗口2、各个窗口的信息2 分析日志和dumpsys部分events日志分析部分定位anr问时间点adb logcat -b events|grepanr一般会有am_anr打印在这个日志的时间点前面开始找对应的input_focus相关日志。focus相关日志使用如下命令对focus相关切换进行跟踪adb logcat -b events|grepinput得到如下结果01-2711:43:42.634718743I input_focus:[Focus request 20c1a6e com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher,reasonUpdateInputWindows]01-2711:43:42.654718828I input_focus:[Focus leaving7556327NotificationShade,reasonsetFocusedWindow]01-2711:43:42.654718828I input_focus:[Focus entering 20c1a6e com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher,reasonsetFocusedWindow]request只是代表了请求焦点entering才是代表真正在inputdispatcher层面获取焦点所以很多anr情况都是有request请求焦点打印但是没有对应的entering打印这时候就可以确定大概anr的时间范围然后在这个时间范围内进行dumpsys SF等窗口。dumpsys SF中焦点窗口显示情况在第二步确定大概anr的时间区间后进行dumpsys SurfaceFlinger看看对应的Layer信息上面这种是正常情况下有焦点的可以看到右边Focused Window有打上 * 如果都没有一个 * 那就需要查看对应的Layer情况。这种一般排查方向就是看看这个window是否真的在sf中显示正常大小遮盖或者直接layer没有显示等情况一般都是sf可以得出layer情况从而anr得出直接原因但是根本原因的话就需要根据具体layer情况进一步分析。dumpsys window中焦点窗口是否计算正常具体命令adb shell dumpsys window|grep Focus-C5正常可以看到如下结果如果这里都不正常那么就需要查看wms部分的焦点窗口FocusedWindow的计算逻辑放开对应的日志排查排除方向在WMS。检查应用生命周期看是窗口否显示adb logcat -b events | grep wm_on主要看看对应的app的生命周期是否正常等最重要还得看看wm_on_resume时间是不是延迟了因为app自身一直没有执行导致的窗口没有显示等。检查其他性能卡顿相关日志adb logcat -b all | grep Slow看看是否有自身进程相关慢处理日志主要是定位窗口显示慢原因原文地址https://mp.weixin.qq.com/s/oYWumjZg8gEV_zybsAEwGA更多framework实战开发干货资料请关注下面“千里马学框架”

相关新闻

文献分享--单细胞整合与多模态分析揭示结直肠癌中中性粒细胞的表型特征与空间组织分布

文献分享--单细胞整合与多模态分析揭示结直肠癌中中性粒细胞的表型特征与空间组织分布

作者,Evil Genius 老家躺平中。。。。 昨晚没通宵,今天要回村里了,在同学这儿玩了好几天了。 服务器操作、linux、R、python的基础大家过关了么?老东家诺禾、兰卫都在招聘生信人员,还有华大等好单位也在招聘技术、产…

2026/7/3 2:45:33 阅读更多 →
AI查重率:双重视角下的准确解读与应对策略

AI查重率:双重视角下的准确解读与应对策略

在人工智能技术深刻重塑内容创作格局的今天,“AI查重率”已超越传统抄袭检测,成为一个多维度的学术与原创性评价指标。它既包含了对“文本是否由AI生成”的概率判断(AIGC率),也涵盖了“AI生成内容是否存在抄袭”的相似…

2026/7/3 17:02:55 阅读更多 →
机械行业TOB企业获客软件深度解析:从方法论到实践架构的全面指南

机械行业TOB企业获客软件深度解析:从方法论到实践架构的全面指南

在当今高度竞争的工业市场中,机械制造企业面临着前所未有的获客挑战。随着数字化转型的深入,传统的销售模式如展会、电话销售等效果逐渐减弱,而线上获客渠道的复杂性和多样性又让许多企业感到无所适从。机械行业作为典型的B2B领域&#xff0c…

2026/7/3 17:02:55 阅读更多 →

最新新闻

VisualCppRedist AIO:一站式解决Windows软件兼容性问题的终极工具

VisualCppRedist AIO:一站式解决Windows软件兼容性问题的终极工具

VisualCppRedist AIO:一站式解决Windows软件兼容性问题的终极工具 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过软件无法启动、游…

2026/7/4 1:41:21 阅读更多 →
UE5多线程编程与FQueuedThreadPool实战指南

UE5多线程编程与FQueuedThreadPool实战指南

1. UE5多线程编程基础与FQueuedThreadPool概述在UE5游戏开发中,多线程编程是提升性能的关键技术之一。虚幻引擎提供了完善的多线程框架,其中FQueuedThreadPool作为核心线程池实现,为开发者管理并发任务提供了便利。与直接创建线程相比&#x…

2026/7/4 1:39:20 阅读更多 →
Unity Addressables内存管理优化实战指南

Unity Addressables内存管理优化实战指南

1. 内存管理在Addressables中的核心地位在Unity项目中使用Addressables资源管理系统时,内存管理是决定项目性能和稳定性的关键因素。不同于传统的Resources加载方式,Addressables采用异步加载和引用计数机制,这给内存管理带来了新的挑战和优化…

2026/7/4 1:37:19 阅读更多 →
FBX导入Unreal缺失平滑组问题的解决方案

FBX导入Unreal缺失平滑组问题的解决方案

1. 问题背景与现象解析最近在将FBX格式的3D模型导入Unreal Engine时,遇到了一个典型警告:"[ue SkeletalMesh] 在FBX文件中未找到这个网格体Mesh_001的平滑组信息"。这个看似简单的提示背后,实际上涉及到3D建模流程中几个关键的技术…

2026/7/4 1:37:19 阅读更多 →
Ubuntu下UE5与AirSim集成开发指南

Ubuntu下UE5与AirSim集成开发指南

1. 项目概述:Ubuntu系统下的UE5与Project AirSim集成方案在Linux生态中部署虚幻引擎5(UE5)与微软开源仿真平台Project AirSim的组合,为自动驾驶、无人机开发等领域提供了高性能的仿真测试环境。不同于Windows平台的"开箱即用…

2026/7/4 1:35:19 阅读更多 →
libgdx游戏UI元素定位与调试实战技巧

libgdx游戏UI元素定位与调试实战技巧

1. libgdx界面元素定位调试实战指南在libgdx游戏开发中,UI元素的精确定位是个看似简单却容易踩坑的环节。我刚接触libgdx时,曾花了两天时间就为了把一个按钮摆到理想位置。经过多个项目实战,我总结出三种不同维度的调试方案,从依赖…

2026/7/4 1:35:19 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻