dumpsys activity activities中的Task和ActivityRecord信息解读
系统开发中,我们经常通过dumpsys activity activities,或者dumpsys activity xxx,xxx为具体的Activity名,通过这些方式来查看某个或者全部Activity的信息。
下面的dumpsys信息就是在上图所示的场景下,通过dumpsys activity activities得到的信息,这里截取了第一个Task,来解读Task中各个字段的信息。
* Task{b7f40b1 #1 type=undefined U=0 visible=true visibleRequested=true mode=fullscreen translucent=false sz=1}* Task{c66ea45 #6 type=undefined U=0 rootTaskId=1 visible=true visibleRequested=true mode=fullscreen translucent=false sz=1}mLastPausedActivity: ActivityRecord{6977e8e u0 com.android.launcher3/.uioverrides.QuickstepLauncher t6}mLastNonFullscreenBounds=Rect(699, 77 - 1221, 1039)isSleeping=falsetopResumedActivity=ActivityRecord{6977e8e u0 com.android.launcher3/.uioverrides.QuickstepLauncher t6}* Hist #0: ActivityRecord{6977e8e u0 com.android.launcher3/.uioverrides.QuickstepLauncher t6}packageName=com.android.launcher3 processName=com.android.launcher3launchedFromUid=0 launchedFromPackage=null launchedFromFeature=null userId=0app=ProcessRecord{ee55ee5 1248:com.android.launcher3/u0a74}Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.android.launcher3/.uioverrides.QuickstepLauncher (has extras) }rootOfTask=true task=Task{c66ea45 #6 type=undefined}taskAffinity=nullmActivityComponent=com.android.launcher3/.uioverrides.QuickstepLauncherbaseDir=/data/app/~~-Ma3a7ZTpeC5g9fEOgTtgw==/com.android.launcher3-5UIYMfzBrMaV5DZ1ogn43w==/base.apkdataDir=/data/user/0/com.android.launcher3stateNotNeeded=true componentSpecified=true mActivityType=homecompat={240dpi always-compat} theme=0x7f12000cmLastReportedConfigurations:mGlobalConfig={1.0 ?mcc0mnc [en_US] ldltr sw720dp w1280dp h696dp 240dpi lrg long land night -touch qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1920, 1080) mAppBounds=Rect(0, 0 - 1920, 1080) mMaxBounds=Rect(0, 0 - 1920, 1080) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} s.16 fontWeightAdjustment=0}mOverrideConfig={1.0 ?mcc0mnc [en_US] ldltr sw720dp w1280dp h664dp 240dpi lrg long land night -touch qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1920, 1080) mAppBounds=Rect(0, 0 - 1920, 1032) mMaxBounds=Rect(0, 0 - 1920, 1080) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=home mAlwaysOnTop=undefined mRotation=ROTATION_0} s.4 fontWeightAdjustment=0}CurrentConfiguration={1.0 ?mcc0mnc [en_US] ldltr sw720dp w1280dp h664dp 240dpi lrg long land night -touch qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1920, 1080) mAppBounds=Rect(0, 0 - 1920, 1032) mMaxBounds=Rect(0, 0 - 1920, 1080) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=home mAlwaysOnTop=undefined mRotation=ROTATION_0} s.8 fontWeightAdjustment=0}RequestedOverrideConfiguration={0.0 ?mcc0mnc ?localeList ?layoutDir ?swdp ?wdp ?hdp ?density ?lsize ?long ?ldr ?wideColorGamut ?orien ?uimode ?night ?touch ?keyb/?/? ?nav/? winConfig={ mBounds=Rect(0, 0 - 0, 0) mAppBounds=null mMaxBounds=Rect(0, 0 - 0, 0) mDisplayRotation=undefined mWindowingMode=undefined mDisplayWindowingMode=undefined mActivityType=home mAlwaysOnTop=undefined mRotation=undefined} ?fontWeightAdjustment}taskDescription: label="null" icon=null iconResource=/0 iconFilename=null primaryColor=ff191c20backgroundColor=ff191c20 statusBarColor=0 navigationBarColor=0backgroundColorFloating=ff191c20launchFailed=false launchCount=0 lastLaunchTime=-5m49s837msmHaveState=false mIcicle=nullstate=RESUMED delayedResume=false finishing=falsekeysPaused=false inHistory=true idle=trueoccludesParent=true noDisplay=false immersive=false launchMode=2mActivityType=homemImeInsetsFrozenUntilStartInput=truewindows=[Window{ddf3e3e u0 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}]windowType=2mOccludesParent=trueoverrideOrientation=SCREEN_ORIENTATION_UNSPECIFIEDrequestedOrientation=SCREEN_ORIENTATION_UNSPECIFIEDmVisibleRequested=true mVisible=true mClientVisible=true reportedDrawn=true reportedVisible=truemNumInterestingWindows=1 mNumDrawnWindows=1 allDrawn=true lastAllDrawn=false)startingData=null firstWindowDrawn=true mIsExiting=falsenowVisible=true lastVisibleTime=-1m25s655msconnections={ConnectionRecord{cc59e78 u0 com.android.launcher3/com.android.quickstep.TouchInteractionService:@39f53db flags=0x0}}resizeMode=RESIZE_MODE_RESIZEABLEmLastReportedMultiWindowMode=false mLastReportedPictureInPictureMode=falsesupportsSizeChanges=SIZE_CHANGES_UNSUPPORTED_METADATAconfigChanges=0xdf3neverSandboxDisplayApis=falsealwaysSandboxDisplayApis=falseareBoundsLetterboxed=falsemCameraCompatControlState=hiddenmCameraCompatControlEnabled=false
这段输出展示了 Android 系统中 Activity Manager Service (AMS) 所管理的一部分任务(Task)和活动(Activity)的状态。这里主要关注的是与 Launcher3 (包名 com.android.launcher3
) 相关的 Task 和 Activity。
整体结构
输出内容大致分为两个层级:
- Task 层级: 代表一个应用程序的任务栈。这里显示了两个 Task,Task #1 和 Task #6。Task #6 是我们主要关注的,因为它包含了 Launcher 的 Activity。
- ActivityRecord 层级: 代表 Task 中的一个具体 Activity 实例。这里详细展示了 Task #6 中的
com.android.launcher3/.uioverrides.QuickstepLauncher
这个 Activity 的状态。
Task 字段解析 (Task{c66ea45 #6 ...}
)
Task{c66ea45 #6 ...}
: 标识一个 Task 对象。c66ea45
: Task 对象在内存中的标识符(哈希码)。#6
: Task 的唯一 ID。type=undefined
: Task 的类型,undefined
通常表示标准的应用程序 Task。U=0
: 运行该 Task 的用户 ID,0 通常是设备主用户。rootTaskId=1
: 该 Task 所属的根 Task ID,与显示和任务组织有关。visible=true
,visibleRequested=true
: Task 当前是否可见,以及是否被请求可见。两者都为true
表示 Task 正在显示。mode=fullscreen
: Task 的窗口模式,这里是全屏模式。translucent=false
: Task 顶部的 Activity 是否是半透明的。false
表示不透明。sz=1
: Task 中包含的 Activity 数量,这里为 1。
mLastPausedActivity: ActivityRecord{...}
: 此 Task 中最后一个被暂停的 Activity(在这里是 Launcher 自己)。mLastNonFullscreenBounds=Rect(...)
: Task 最后一次处于非全屏状态(如分屏、自由窗口)时的边界信息。isSleeping=false
: AMS 是否认为此 Task 处于休眠状态。topResumedActivity=ActivityRecord{...}
: 当前位于此 Task 栈顶且处于 Resumed 状态的 Activity(即当前用户正在交互的 Activity,这里是 Launcher)。
ActivityRecord 字段解析 (* Hist #0: ActivityRecord{6977e8e u0 ...}
)
这是 Task #6 中唯一的 Activity (Hist #0
表示历史记录中的第 0 个,即栈顶)。
ActivityRecord{6977e8e u0 ...}
: 标识一个 ActivityRecord 对象。6977e8e
: ActivityRecord 对象在内存中的标识符。u0
: 用户 ID。com.android.launcher3/.uioverrides.QuickstepLauncher
: Activity 的完整组件名称 (包名/类名)。t6
: 该 Activity 所属的 Task ID。
packageName=com.android.launcher3
,processName=com.android.launcher3
: 应用包名和进程名。launchedFromUid=0
,launchedFromPackage=null
,launchedFromFeature=null
: 启动此 Activity 的来源信息 (UID, 包名, 特性)。Uid 0 通常是系统。userId=0
: 运行此 Activity 的用户 ID。app=ProcessRecord{...}
: 托管此 Activity 的进程记录 (ProcessRecord
) 的引用。Intent { ... }
: 启动此 Activity 的 Intent。这里是标准的ACTION_MAIN
和CATEGORY_HOME
,表明这是 Home 应用(桌面)。flg=0x10000100
是 Intent 的 Flag。rootOfTask=true
: 表明此 Activity 是其所在 Task 的根 Activity。task=Task{c66ea45 #6 ...}
: 指向所属 Task 的引用。taskAffinity=null
: Task Affinity(任务相关性),null
表示使用默认的(基于包名)。mActivityComponent
: 重复的组件名称。baseDir
,dataDir
: 应用 APK 文件和数据目录的路径。stateNotNeeded=true
: 一个 AMS 内部的优化标志。componentSpecified=true
: 表明启动 Intent 中明确指定了组件名称。mActivityType=home
: Activity 的类型,这里明确是home
类型。compat={240dpi always-compat}
: 兼容性信息,包括屏幕密度(240dpi)和兼容模式。theme=0x7f12000c
: 应用到此 Activity 的主题资源 ID。mLastReportedConfigurations
,mOverrideConfig
,CurrentConfiguration
,RequestedOverrideConfiguration
: 这些字段详细描述了应用于此 Activity 的各种配置信息,包括:mGlobalConfig
: 全局设备配置。mOverrideConfig
: 应用于此 Activity 的覆盖配置(可能因窗口模式、显示区域等而不同)。CurrentConfiguration
: 当前实际生效的配置。RequestedOverrideConfiguration
: Activity 请求的覆盖配置。- 内部包含信息如:屏幕密度 (
dpi
)、尺寸 (swdp
,wdp
,hdp
)、屏幕方向 (land
)、区域语言 (en_US
)、日夜模式 (night
)、窗口配置 (winConfig
- 包含窗口边界mBounds
、应用可用边界mAppBounds
、最大边界mMaxBounds
、显示旋转mDisplayRotation
、窗口模式mWindowingMode
、Activity类型mActivityType
等)。s.X
表示配置的序列号。
taskDescription: ...
: 应用为最近任务界面提供的描述信息,包括标签 (label
)、图标 (icon
)、主颜色 (primaryColor
)、背景色 (backgroundColor
)、状态栏颜色 (statusBarColor
)、导航栏颜色 (navigationBarColor
) 等。launchFailed=false
,launchCount=0
,lastLaunchTime=-5m49s837ms
: 启动失败标志、启动次数、上次启动时间(相对于 dumpsys 执行时间)。mHaveState=false
,mIcicle=null
: 是否有保存的实例状态 (onSaveInstanceState
) 数据。null
表示没有。state=RESUMED
: Activity 当前的生命周期状态。RESUMED
表示 Activity 在前台,用户可以交互。delayedResume=false
,finishing=false
,keysPaused=false
,inHistory=true
,idle=true
: 其他内部状态标志,表示是否延迟恢复、是否正在结束、按键是否暂停、是否在历史栈中、是否空闲。occludesParent=true
: 此 Activity 是否完全遮挡了它下面的 Activity。noDisplay=false
: Activity 是否没有界面显示。immersive=false
: 是否处于沉浸模式。launchMode=2
: 在 Manifest 中定义的启动模式。2
通常对应singleTask
(对于 Launcher 来说很常见)。mImeInsetsFrozenUntilStartInput=true
: 与输入法窗口 (IME
) Insets 相关的内部标志。windows=[Window{...}]
: 与此 Activity 关联的 WindowManager 窗口列表。windowType=2
: 窗口类型,2
通常是基础应用窗口 (TYPE_BASE_APPLICATION
)。mOccludesParent=true
: 重复的遮挡标志。overrideOrientation
,requestedOrientation
: 覆盖的屏幕方向和请求的屏幕方向。UNSPECIFIED
表示未指定。mVisibleRequested=true
,mVisible=true
,mClientVisible=true
,reportedDrawn=true
,reportedVisible=true
: 各种内部维护的可见性和绘制状态标志。mNumInterestingWindows=1
,mNumDrawnWindows=1
,allDrawn=true
,lastAllDrawn=false
: 与窗口绘制完成状态相关的标志。allDrawn=true
表示所有重要窗口都已绘制完成。startingData=null
: 启动窗口(Starting Window)的数据,null
表示没有或已结束。firstWindowDrawn=true
: 第一个窗口是否已绘制。mIsExiting=false
: Activity 是否正在执行退出动画。nowVisible=true
,lastVisibleTime=-1m25s655ms
: 当前是否可见,以及上次可见的时间。connections={...}
: 与此 Activity 关联的服务连接。这里显示连接到了TouchInteractionService
,这是 Quickstep 手势导航服务。resizeMode=RESIZE_MODE_RESIZEABLE
: Activity 的尺寸调整模式,表明它是可调整大小的。mLastReportedMultiWindowMode=false
,mLastReportedPictureInPictureMode=false
: 上次报告的多窗口/画中画模式状态。supportsSizeChanges=SIZE_CHANGES_UNSUPPORTED_METADATA
: 指示如何支持尺寸变化。configChanges=0xdf3
: Activity 在 Manifest 中声明的android:configChanges
属性的位掩码值,表示它可以自行处理哪些配置更改而无需重建。neverSandboxDisplayApis=false
,alwaysSandboxDisplayApis=false
: 与 Display API 沙盒化(一种兼容性措施)相关的标志。areBoundsLetterboxed=false
: 当前是否处于 Letterbox 模式(为了兼容性而在屏幕上显示黑边)。mCameraCompatControlState=hidden
,mCameraCompatControlEnabled=false
: 与摄像头兼容性处理(针对屏幕挖孔、刘海等的特殊处理)相关的状态和启用标志。
总的来说,这段信息非常详细地记录了 Launcher 这个 Home 应用 Activity 在特定时刻的运行状态、配置、窗口信息、生命周期、所属任务等关键信息,是调试和分析 Android 应用行为和系统状态的重要依据。