学员投稿:wms优化改进dumpsys层级结构树显示具体层级数字

给 WMS dumpsys 窗口层级树加层级数字,小改动解决大痛点 在 Android 系统开发中,WMS(WindowManagerService)作为窗口管理核心服务,统一调度窗口的创建、Z 序与焦点;dumpsys 则是开发者查看系统服务状态的常用调试命令。WMS 的 dumpsys 输出中,窗口层级树用缩进表达层级,窗口一旦变多便难以快速判断深度。其实这棵树基于 WindowContainer 容器树递归遍历生成,只需在递归打印时引入 depth 参数,在节点前输出 [Lx] 数字标记,即可让层级一目了然。这类改动成本极小,却能显著提升遮罩问题分析、窗口定位、脚本解 阅读详情

背景:

针对wms课程中经常讲解的窗口层级结构树部分,有学员反应有的看不出窗口具体位于0-36层的具体哪一层的问题。

在这里插入图片描述
比如想看Leaf:3:12中的下面Shell窗口的层级是啥,这个同学就不太好理解了,到底是位于第3层还是第12层呢?

在这里插入图片描述其实这个问题层级位于哪里,宏观上理解也容易,大家可以如下方式理解:
因为这里的Leaf:3:12本身属于一个范围节点,而且本身这个节点下面就一个子节点,也就是说3-12层都是最后都是只装了一个窗口,没有再细分其他层级窗口节点,所以你可以认为这个3-12是一个整体上的一层既可以。无论ShellDropTarget窗口位于3-12哪一层都不会运行这个窗口的显示顺序。
总结就是把3-12层看成一个整体层级一个大层既可以,反正3-12只有一个ShellDropTarget窗口,无论他是在3层,5层,12层都是不会影响他的在系统整体显示z轴顺序。

但是有学员提出,我就想要知道这个窗口具体的是位于哪一层,可否有办法呢?
在这里插入图片描述

这个问题我们的优秀学员“汽车人”在vip群就有进行详细回答,“汽车人”兄弟也算大家的师兄,给大家也分享过很多干货哈,最后感谢“汽车人”兄弟干货投稿,给大家分享了一个dumpsys 层级结构树的改进方案,带上window的具体0-36层级数字。

优秀学员汽车人投稿:

dumpsys activity containers命令查看层级结构时,发现有些WindowToken我们不知道它具体在0-36的哪一层,比如ShellDropTarget所属的windowToken,我们只知道它在3:12层这个区间,不知道具体哪一层。
在这里插入图片描述
在学习层级结构树时,我们知道windowToken其实是在WindowManagerPolicy的getWindowLayerFromTypeLw()方法中去看对应的层级,这里的关键就是知道type这个属性。
在这里插入图片描述
这个type其实是WindowToken的windowType属性,在WindowToken构造时被赋值,对应应用端添加窗口时传递的参数,比如:

mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;`

如果想要dumpsys activity containers命令也能查看到windowToken的具体层级很简单。

void dumpActivityContainersLocked(PrintWriter pw) {
        pw.println("ACTIVITY MANAGER CONTAINERS (dumpsys activity containers)");
        mRootWindowContainer.dumpChildrenNames(pw, "");
        pw.println(" ");
    }

顺着这个命令找对应代码,很快找到对每个层级信息的打印是在这个方法里:

 public void dumpChildrenNames(PrintWriter pw, String prefix, boolean isLastChild) {
        //省略
        pw.print(prefix + (isLastChild ? "└─ " : "├─ "));
        pw.println(getName()//这里会调用toString()
                + " type=" + actType
                + " mode=" + winMode
                + " override-mode=" + overrideWinMode
                + " requested-bounds=" + getRequestedOverrideBounds().toShortString()
                + " bounds=" + getBounds().toShortString());

        String childPrefix = prefix + (isLastChild ? "   " : "│  ");
        for (int i = getChildCount() - 1; i >= 0; --i) {
            final E cc = getChildAt(i);
            cc.dumpChildrenNames(pw, childPrefix, i == 0 /* isLastChild */);
        }
    }

注意此处的getName()其实是调用toString()方法,而WindowToken的toString()如下:
在这里插入图片描述
其实是打印了windowType的,而WindowToken本身就有方法获取对应层级:

 int getWindowLayerFromType() {
        return mWmService.mPolicy.getWindowLayerFromTypeLw(windowType, mOwnerCanManageAppTokens,
                mRoundedCornerOverlay);
    }

所以,只需要对toString()方法改成如下即可:

 @Override
    public String toString() {
        if (stringName == null) {
            stringName = "WindowToken{" + Integer.toHexString(System.identityHashCode(this))
                    + " type=" + windowType + " " + token + ",layer:"+getWindowLayerFromType()+"}";
        }
        return stringName;
    }

最终dumpsys activity containers命令效果:
在这里插入图片描述可以看到,WindowToken都能显示具体层级了,壁纸的专用WallpaperWindowToken我没修改,所以它没显示,不过也不需要。

再次感谢“汽车人”兄弟投稿,大家记得积极转发点赞哈。

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档) 本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。 阅读详情

相关推荐

网络设备调试指南:如何用MDIO Clause22/45协议读写Marvell MV88E6390寄存器

本文深入解析了如何通过MDIO Clause 22/45协议对Marvell MV88E6390交换芯片进行寄存器读写调试。文章详细对比了两种协议的本质区别与适用场景,并重点阐述了MV88E6390的直接与间接寻址策略,提供了实战代码示例与关键调试技巧,帮助网络工程师高效解决配置与通信问题。

tequila的博客 518

dumpsys activity containers

可见所有的Activity相关的页面,都是挂载在。可以查看当前容器层级信息。

了凡 779

手把手教你用mitmproxy抓包抖音数据流(附Python脚本模板)

本文详细介绍了如何使用mitmproxy抓包抖音数据流,包括环境搭建、证书安装和Python脚本模板。从mitmproxy配置到抖音API解析,提供完整的移动端数据流分析方案,帮助开发者快速掌握数据抓取技术,适用于应用优化、竞品分析和安全审计等场景。

weixin_33670786的博客 307

一文了解 Window 层级顺序

主 window 排序图示子 window 排序图示版权声明:本文为优快云博主「Jingle.zhang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.youkuaiyun.com/m0_58994853/article/details/125493914。

chuyouyinghe的专栏 1368

如何在Hyper-V、Virtual PC等虚拟机中使用USB设备

今天网盾科技给大家分享一篇在Hyper-V、Virtual PC等虚拟机中使用USB Over network软件用USB设备的方法。 当前Hyper-V Server与Microsoft Virtual PC的虚拟机,不支持USB的设备,如果你有USB设备需要在虚拟机中使用,例如USB的加密狗、智能卡、网上银行的U盾等,可以通过USB Over Network软件,通过网络,使用USB设备。 USB Over Network是一款“客户/服务器”软件,是这么一款功能强大 USB 设备共享软件。它使用方

wangdunkeji_idc的博客 4999

使用QGIS提取天地图遥感影像中的建筑物轮廓,及AI方案

用QGIS的插件提取遥感影像中的建筑轮廓,并提供了几个AI提取建筑轮廓的方案。

cky_123的博客 2万+

Android WMS架构俯视图:WindowContainer树形组合模式-理论基础+实践结果

Android WMS架构俯视图:WindowContainer树形组合模式-理论基础+实践结果

月山知了的博客 1998

手把手教你用OPA运放和MOS管搭建恒流源电路(附完整电路图)

本文详细介绍了如何使用OPA运放和MOS管搭建高精度恒流源电路,涵盖核心元器件选型、电路设计、工作原理及实际搭建步骤。通过负反馈控制机制和MOS管工作区设置技巧,实现稳定的电流输出,适用于LED驱动、电池充电等场景。附完整电路图和调试技巧,助您快速掌握恒流源设计。

weixin_29239279的博客 535

Android知识点 365 —— dumpsys window

文章原文:https://jingyan.baidu.com/article/1612d5009a6744e20e1eeeda.html 返回知识列表:Android知识列表 dumpsys window -h 查看window选项支持的子选项。其实,dumpsys window 的输出也不是很多,就无须考虑[cmd] 了。 查看当前活动的窗口 dumpsys window | grep windows 这其实是输出:从上到下沿Z轴的应用token。 ...

编程到管理、技术到产品 9681

【Claude】媒体文件处理错误:PDF 与 Image 过大的检测与预处理方法 bug报错已解决

图片压缩是必须的:原始图片的 base64 会占用大量 TokenPDF 提取文本优于传图片:文本版 PDF 比扫描版更省 Token分块处理大文件:不要一次性处理整个大文件控制分辨率:800x800 通常足够 Claude 分析。

博客 6360

基于粒子群算法优化的灰色预测模型GM实现数据预测(附带MATLAB代码)

灰色预测模型(Grey Model,简称GM)是一种常用的非线性时间序列预测方法,它在处理少量数据和缺乏规律性的序列预测问题上表现出良好的性能。c. 建立灰色微分方程:根据紧邻均值生成序列建立灰色微分方程,通常形式为:dx(n) + ax(n) = b,其中dx(n)是紧邻均值生成序列,x(n)是原始序列。为了提高GM模型的预测准确性,我们将使用粒子群算法来优化灰色微分方程的参数a和b。a. 利用灰色微分方程进行预测:根据已得到的灰色微分方程,进行后续时间点的数据预测。首先,定义了两个函数。

CoderExtra的博客 606

android调试——教你用dumpsys命令调试

这一篇就聊聊dumpsys 比较常用的命令,便于调试Android应用

to_perfect的博客 8072

Android 12.0 系统开机设置默认横屏显示

在12.0的系统产品开发中,对于产品需求来说,由于是宽屏设备所以产品需要开机默认横屏显示,开机横屏显示这就需要从两部分来实现,一部分是开机动画横屏显示,另一部分是系统显示横屏显示,从这两方面就可以做到开机默认横屏显示了。

安卓兼职framework和app工程师的博客 3743

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 289

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 346

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 199

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 130

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 502

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 635

java框架大全

java框架大全

qq_39326137的博客 183

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 361

SecureRandom做随机源,这个Java随机字符串工具类有3个方法

本文分享一款JDK17环境下的Java随机字符串工具类,内置3个开箱即用的方法,全部采用SecureRandom加密安全随机源,不存在弱随机、可预测、取模偏差等问题。工具类支持默认62字符集随机串、纯数字随机串、自定义字符集随机串三种生成模式,支持Unicode码点级别的字符集处理,兼容Emoji等增补字符,边界处理严格,异常信息明确,适合验证码、邀请码、盐值、随机口令、短链码等场景,源码可直接复制使用。

Java后端 | AI智能体应用实战派 | 电脑技能行家 299

IDEA 简介:从零认识 IntelliJ IDEA

IDEA 全称,是由 JetBrains 公司开发的一款主流 Java 集成开发环境(IDE)。它集代码编辑、编译、调试、测试、版本控制、构建管理等功能于一体,被大量 Java 开发者视为日常开发的首选工具。所谓 IDE(Integrated Development Environment,集成开发环境),就是把写代码所需的各类工具整合到同一个界面中。相比只用文本编辑器加命令行编译,IDE 能显著减少重复操作,让开发者把精力集中在业务逻辑上。

ztI10的博客 153

Java实现批量线段相交检测(跨积判定+扫描线优化与踩坑复盘)

【代码】Java实现批量线段相交检测(跨积判定+扫描线优化与踩坑复盘)

m0_64476639的博客 329
上一篇: aosp需求开发:java核心库libcore如何单编及打印log和堆栈
下一篇: aosp15版本InputReader事件如何通知到InputDispatcher的?
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值