SystemUi中自定义的dump实现原理和使用

发布于:2025-07-21 ⋅ 阅读:(12) ⋅ 点赞:(0)

查看com.android.systemui当前的信息状态

1.adb命令:

adb shell dumpsys activity service com.android.systemui

2.结果:

SERVICE com.android.systemui/.ImageWallpaper 274d3e3 pid=779 user=0
  Client:
    State of wallpaper com.android.systemui.ImageWallpaper@36eba43:
      Engine com.android.systemui.ImageWallpaper$GLEngine@5b7e8c0:
        mInitializing=false mDestroyed=false
        mVisible=true mReportedVisible=true
        mDisplay=Display id 0: DisplayInfo{"内置屏幕", displayId 0", displayGroupId 0, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, real 800 x 1280, largest app 1184 x 1136, smallest app 800 2, appVsyncOff 1000000, presDeadline 21276595, mode 1, defaultMode 1, modes [{id=1, width=800, height=1280, fps=47.0, alternativeRefreshRates=[]}], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[], mMaxLuminance=500.0, mMaxAverageLuminance=500.0, mMinLuminance=0.0}, userDisabledHdrTypes [], minimalPostProcessingSupported false, rotation 0, state ON}, DisplayMetrics{density=2.0, width=800, height=1184, scaledDensity=2.0, xdpi=320.0, ydpi=320.0}, isValid=true
        mCreated=true mSurfaceCreated=true mIsCreating=false mDrawingAllowed=true
        mWidth=1280 mCurWidth=1280 mHeight=1280 mCurHeight=1280
        mType=-1 mWindowFlags=16 mCurWindowFlags=16
        mWindowPrivateFlags=33554436 mCurWindowPrivateFlags=33554436
        mWinFrames=
    ClientWindowFrames{frame=[0,0][1280,1280] display=[-10000,-10000][10000,10000] backdrop=[0,0][1280,1280]}
        mConfiguration={1.0 ?mcc?mnc [zh_CN] ldltr sw400dp w400dp h568dp 320dpi nrml port finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 800, 1280) mAppBounds=Rect(0, 0 - 800, 1184) mMaxBounds=Rect(0, 0 - 800, 1280) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} as.2 s.10 fontWeightAdjustment=0}
        mLayout={(0,0)(1280x1280) gr=TOP START CENTER ty=WALLPAPER fmt=RGBX_8888 wanim=0x103030e
      fl=NOT_FOCUSABLE NOT_TOUCHABLE LAYOUT_IN_SCREEN LAYOUT_NO_LIMITS LAYOUT_INSET_DECOR
      pfl=WANTS_OFFSET_NOTIFICATIONS USE_BLAST
      bhv=DEFAULT}
        mZoom=0.0
        mPreviewSurfacePosition=null
        mPendingXOffset=0.0 mPendingXOffset=0.0


等等......

3.执行流程和原理解释:

🔍 什么是 activity service

adb shell dumpsys 命令中:

adb shell dumpsys activity service com.android.systemui
  • activity:表示你正在访问的是 ActivityManagerService(AMS) 提供的功能。
  • service:AMS是管理service这个抽象类的组件

所以,这条命令的意思是:

“请通过 ActivityManagerService 找到 com.android.systemui 这个 SystemUIService,并调用它的 dump() 方法输出调试信息”


🧠 Android 系统中 Service 的 dump 机制

Android 中的每个service都可以重写以下方法:

protected void dump(FileDescriptor fd, PrintWriter pw, String[] args)

当执行 adb shell dumpsys activity service <PACKAGE_NAME> 时,系统会:

  1. 找到运行中的、由 ActivityManagerService 管理的对应包名的 Service。
  2. 调用该 Service 的 dump() 方法。
  3. 输出调试信息到控制台。

📌 以 SystemUIService 为例

你看到的这个类:

public class SystemUIService extends Service

它重写了 dump() 方法:

@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
    mDumpHandler.dump(fd, pw, args);
}

mDumpHandler.dump(...) 最终会调用到 DumpManager 的 dumpDumpables(),从而触发所有注册了并实现了 Dumpable的类的 dump()方法。


✅ 总结:activity service 的含义

命令部分 含义
adb shell dumpsys 调用 Android 的 dumpsys 工具
activity 表示你要访问的是 ActivityManagerService(AMS)
service 表示你要 dump 的是一个系统服务(Service)
com.android.systemui 要 dump 的服务所属的包名
SystemUIService.dump() 实际被调用的方法,最终调用 DumpManager的 dumpDumpables(),从而触发所有注册了并实现了 Dumpable的类的 dump()方法。

📚 类比理解

你可以把 adb shell dumpsys activity service com.android.systemui 理解为:

“请让系统找到 SystemUI 这个服务自己的dump架构,然后让它自己打印出当前所有注册的调试信息。”

这些调试信息包括:

  • 状态栏、通知栏的状态
  • 电池信息
  • 悬浮窗、手势、导航栏等模块的运行状态
  • 各种日志缓冲区的内容

💡 小技巧:如何只 dump 某个模块?

如果你只想看某个模块的调试信息,可以加参数:

adb shell dumpsys activity service com.android.systemui | grep -A 20 "StatusBar"

或者:

adb shell dumpsys activity service com.android.systemui --target=StatusBar

前提是你在 DumpManager中实现了dump 的逻辑。


如需进一步了解 dumpsys 命令的使用方式,也可以运行:

adb shell dumpsys --help

网站公告

今日签到

点亮在社区的每一天
去签到