Android层级分布

adb shell dumpsys window w 命令输出内容解读指南

adb shell dumpsys window w 实际上是 adb shell dumpsys window windows 的简写形式(wwindows 的缩写)。这个命令会输出设备上所有窗口的详细信息,是调试窗口相关问题的利器。

📌 命令输出的典型结构

执行命令后,你会看到类似这样的输出:

ini 复制代码
WINDOW MANAGER WINDOWS (dumpsys window windows)
  Window #11: com.example.app/.MainActivity (u0)
    mDisplayId=0 mSession=Session{e6589e5 12345:u0a123}
    mOwnerUid=10123 mPackage= com.example.app
    mAppToken=AppWindowToken{12345 token=Token{12345 ActivityRecord{12345 u0 com.example.app/.MainActivity t12345}}}
    mAttrs=WM.LayoutParams{(0,0)(fillxfill)m=WM.LayoutParams{...}}
    mLayer=10000 mBaseLayer=10000
    mFrame=Rect(0,0 - 1080,1920)
    mSurface=Surface(name=com.example.app/com.example.app.MainActivity)
    mDrawState=HAS_DRAWN
    mShowing=true
    mSurfaceShown=true
    mSurface=Surface(name=com.example.app/com.example.app.MainActivity)
    mVisible=true
    mCurrentFocus=Window{12345 u0 com.example.app/.MainActivity}
    mFocusedApp=AppWindowToken{12345 token=Token{12345 ActivityRecord{12345 u0 com.example.app/.MainActivity t12345}}}

🔍 逐项解读

1. 窗口标识信息

bash 复制代码
Window #11: com.example.app/.MainActivity (u0)
  • #11:窗口的序号
  • com.example.app/.MainActivity:窗口所属的应用包名和Activity类
  • (u0):用户ID(通常为0表示主用户)

2. 窗口基础信息

ini 复制代码
mDisplayId=0 mSession=Session{e6589e5 12345:u0a123}
  • mDisplayId=0:显示ID(0表示主屏幕)
  • mSession:会话ID,标识窗口所属的会话

3. 窗口属性

ini 复制代码
mAttrs=WM.LayoutParams{(0,0)(fillxfill)m=WM.LayoutParams{...}}
  • 窗口的布局参数,包括位置(0,0)、尺寸(fillxfill)等

4. 窗口层级

ini 复制代码
mLayer=10000 mBaseLayer=10000
  • mLayer:窗口的层级(值越大,越在上层)
  • mBaseLayer:窗口的基础层级

5. 窗口尺寸

ini 复制代码
mFrame=Rect(0,0 - 1080,1920)
  • 窗口的矩形区域(左上角坐标(0,0)到右下角坐标(1080,1920))

6. 窗口状态

ini 复制代码
mDrawState=HAS_DRAWN
mSurfaceShown=true
mVisible=true
  • mDrawState:窗口绘制状态
    • HAS_DRAWN:窗口已绘制(是显示状态的必要条件)
    • NOT_DRAWN:窗口未绘制
  • mSurfaceShown:表面是否可见(true表示可见)
  • mVisible:窗口是否可见(true表示可见)

7. 焦点信息(关键!)

ini 复制代码
mCurrentFocus=Window{12345 u0 com.example.app/.MainActivity}
mFocusedApp=AppWindowToken{12345 token=Token{12345 ActivityRecord{12345 u0 com.example.app/.MainActivity t12345}}}
  • mCurrentFocus:当前有焦点的窗口(可能是一个视图,不一定是Activity)
  • mFocusedApp:当前有焦点的应用(总是关联到一个ActivityRecord)

📌 重要区别:当焦点切换到没有Activity的视图(如系统UI部分)时,mCurrentFocus会显示该视图,但mFocusedApp仍显示上一个Activity。

8. 应用信息

ini 复制代码
mAppToken=AppWindowToken{12345 token=Token{12345 ActivityRecord{12345 u0 com.example.app/.MainActivity t12345}}}
  • mAppToken:应用窗口令牌,标识应用的窗口
  • t12345:任务ID,标识Activity所在的任务

💡 实用场景

1. 查找当前焦点Activity

bash 复制代码
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'

输出示例:

ini 复制代码
mCurrentFocus=Window{12345 u0 com.example.app/.MainActivity}
mFocusedApp=AppWindowToken{12345 token=Token{12345 ActivityRecord{12345 u0 com.example.app/.MainActivity t12345}}}

这表示当前有焦点的Activity是com.example.app/.MainActivity

2. 查看窗口层级关系

bash 复制代码
adb shell dumpsys window windows | grep -E 'mLayer|mDrawState'

通过比较mLayer值,可以知道哪个窗口在最上层

3. 检查窗口是否可见

bash 复制代码
adb shell dumpsys window windows | grep -E 'mSurfaceShown|mVisible'

如果mSurfaceShown=truemVisible=true,则窗口可见

4. 检查刘海屏/显示区域

bash 复制代码
adb shell dumpsys window | grep -i cutout

输出示例:

ini 复制代码
DisplayCutout: (left=0, top=0, right=0, bottom=0) 

这表示没有刘海屏,如果显示有值,则表示有刘海屏区域

📝 总结

adb shell dumpsys window w 命令的输出包含了设备上所有窗口的详细信息,是调试窗口问题(如布局异常、焦点问题、层级问题)的关键工具。

重点看以下字段

  • mCurrentFocusmFocusedApp:判断当前焦点
  • mLayer:判断窗口层级
  • mDrawStatemSurfaceShown:判断窗口是否已绘制并可见
  • mFrame:窗口的尺寸和位置

在实际工作中,通常会配合grep命令来过滤关键信息,例如:

bash 复制代码
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp|mLayer|mDrawState'

这样可以快速获取你关心的信息,避免被大量输出淹没。

希望这个解读对你有帮助!如果你有具体的输出内容需要解读,也可以提供出来,我可以帮你分析。

相关推荐
毕设源码-朱学姐17 分钟前
【开题答辩全过程】以 基于Android的留守儿童贫困资助管理系统的设计与实现为例,包含答辩的问题和答案
android
愤怒的代码22 分钟前
深入理解 IdleHandler:从启动优化到内存管理
android·架构·kotlin
恋猫de小郭26 分钟前
OpenAI :你不需要跨平台框架,只需要在 Android 和 iOS 上使用 Codex
android·前端·openai
路在脚下,梦在心里43 分钟前
net学习总结
android·学习
走在路上的菜鸟1 小时前
Android学Dart学习笔记第二十节 类-枚举
android·笔记·学习·flutter
星光一影1 小时前
合成植物大战僵尸 安卓原生APP Cocos游戏 支持Sigmob
android·游戏·php·html5·web app
2501_915918411 小时前
iOS 项目中证书管理常见的协作问题
android·ios·小程序·https·uni-app·iphone·webview
allk551 小时前
Android ANR 深度起底:从系统埋雷机制到全链路治理体系
android
满天星83035771 小时前
【Linux】信号(下)
android·linux·运维·服务器·开发语言·性能优化
2501_915918411 小时前
提升 iOS 应用安全审核通过率的一种思路,把容易被拒的点先处理
android·安全·ios·小程序·uni-app·iphone·webview