adb shell dumpsys activity activities
• Display #:屏幕的displayId,默认主屏是0,堆栈在display上自上而下输出,越往上越在栈顶图层越在上
• RootTask #:根栈的taskId,原生非分屏场景的RootTask就是Task本身,也就是RootTask并没有包含嵌套其他子栈
• type=:栈类别,一般应用栈是standard,桌面是home mode=:窗口模式,全屏是fullscreen,原生悬浮窗是freeform、分屏是split-screen-primary和split-screen-secondary,若窗口类型是厂商自定义,可能输出不同的自定义值
• mBounds=:Task的大小范围,全屏栈值都是0,分屏、悬浮窗才有值
• mResumedActivity:栈中当前resume的activity
• mLastPausedActivity:栈中当前pause的activity
• * Task{2ad2d3b #158 type=standard A=10212:com.tencent.qqlive U=0 visible=true mode=freeform translucent=false sz=2} RootTask的子Task信息(非分屏场景的RootTask就是Task本身,从taskId上可以看出),158是taskId,类型是普通应用,uid是10212,包名(进程名)是com.tencent.qqlive,用户id是0即主用户,窗口模式是悬浮窗,非透明栈,栈内有2个activity对象
• affinity=:区别栈的亲和度,默认不配置就是包名,affinity可以使得一个应用内部的activity分属多个栈
• intent=:表示启动该栈首个activity使用的intent
• Activities=:表示task内部的activity集合,末尾的activity是栈顶的activity
• mRootProcess=ProcessRecord{c3a5ced 3866:com.tencent.qqlive/u0a212} :root process表示栈根activity的进程(一个栈可能存在不同进程的activity),3866是进程id,u0a212是主用户下uid为10212的包
• mResizeMode=:栈是否resizeable,决定栈能否支持多窗口
• * Hist #:打印栈内每个activity的信息
• packageName=:表明该activity所在包,processName=:表明该activity所在进程
• launchedFromUid=:表明activity被哪个uid的包所启动(activity拉起溯源的关键信息)
• Intent {:表示启动activity所用的intent,栈内根activity的这个intent与启动task的intent等同
• baseDir=:表示activity所在包的安装路径, dataDir=:表明进程数据所在路径
• CurrentConfiguration=:表明activity的当前的config信息 state=:表明activity的当前生命周期状态
• idle=:表明该activity是否执行完onResume生命周期且回调系统侧刷新activity的idle状态,部分应用hook应用进程的一些调度后会导致该状态无法置true进而导致一些切换场景的问题
• windows=:打印activity对应的window对象信息
• mOrientation=:activity所请求的orientation值(Activity.setRequestedOrientation动态请求或者AndroidManifest.xml给activity节点静态配置android:screenOrientation值)
• mVisible=:表明activity在系统侧是否已经设置visibile mClientVisible=:表明是否通知应用端刷新activity窗口可见性
• reportedDrawn=:表明activity的窗口是否绘制完毕
• maxAspectRatio=:用于高长宽比全面屏使用,表明activity是否可以充满屏幕(targetsdk大于等于O的不配置默认满屏)
• minAspectRatio=:用于低长宽比的折叠屏展开态使用,表明activity是否可以充满屏幕(S版本开始不配置默认满屏)
• configChanges=:十六进制值,表明activity在AndroidManifest中配置的android:configChanges属性值,字符串与十六进程值对应关系参见ActivityInfo类,该值决定config发生变化时activity走relaunch还是onConfigurationChanged
adb shell dumpsys window windows
• Window #:打印每个window的窗口信息,即WindowState对象,在dump信息中搜索窗口的关键字就搜这个
• mDisplayId=:window所在displayId
• rootTaskId=:window所在task的taskId(若是分屏窗口,则该taskId是分屏的根taskId,不是window所在task的taskId)
• mOwnerUid=:窗口所在应用的uid showForAllUsers=:窗口是否在所有用户下可见(attrs.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS可以达到窗口在所有用户下可见的目的)
• package=:窗口所在应用包名
• mAttrs=:应用指定的窗口起点和宽高
• adjust=:反映的是窗口属性中的softInputMode值,作用于输入法弹出时窗口布局刷新
• layoutInDisplayCutoutMode=:反映窗口是否需要使用挖孔(挖孔屏)、曲边(曲面屏),常量值在WindowManager中
• ty=:窗口类型,比如应用窗口、输入法、壁纸之类的,常量值在WindowManager类中定义
• fl=:窗口指定的flags,比如要透壁纸的SHOW_WALLPAPER pfl=:窗口指定的privateFlags
• vsysui=:作用于窗口是否显示导航栏和状态栏及其状态
• Requested w= h=:请求的窗口宽高
• mActivityRecord=:窗口对应的activity
• mViewVisibility=:窗口可见性, 0x0是visible, 0x4是invisible,0x8是gone
• mFullConfiguration=:窗口当前的config信息
• mHasSurface=:窗口是否已创建surface
• mFrame=:窗口的最终大小
• WindowStateAnimator{:打印窗口对应的WindowStateAnimator对象
• mSurface=:窗口对应的图层surface
• shown=:表示图层是否显示
• mDrawState=:窗口的绘制状态,应用若正常绘制完成状态应该为HAS_DRAWN
• isVisible=:表明窗口是否可见
adb shell dumpsys SurfaceFlinger
一般查看图层dump信息按照以下步骤操作:
1 、在dump文件中先搜索关键字 HWC layers 找到所有可见图层
- Display 0 HWC layers:该节点下展示所有可见图层大小和位置信息(图层的可见区域一定是屏幕内的区域)
- Layer name:表示图层名字
- Window Type:窗口类型,比如应用窗口、输入法、壁纸之类的,常量值在WindowManager类中定义
- Comp Type:表示图层合成方式,DEVICE表示GPU硬件合成、CLIENT表示CPU软件合成
- Disp Frame:表示图层的位置(left、top、right、bottom)
2、找到目标图层并搜索图层名字
比如腾讯视频悬浮窗页面com.tencent.qqlive/com.tencent.qqlive.ona.activity.VideoDetailActivity#0,然后搜索该关键字找到图层bufferlayer
- BufferStateLayer:图层bufferlayer是个BufferStateLayer, bufferlayer的父图层及以上节点都是ContainerLayer
- Region VisibleRegion:指的是图层在屏幕内的可见区域
- z=:图层的z轴顺序,也就是层级高低,值越大越高,不过不同应用栈的activity窗口层级比较,需要上溯到EffectLayer (Task=这个父图层去比较,看activity所在Task在TaskDisplayArea上的z值大小。
- pos:图层起点
- size=:图层大小
- crop:图层裁剪区域(left,top,width,height)
- cornerRadius=:图层圆角浮点值
- tr=:图层缩放比
- parent=:图层父节点
- zOrderRelativeOf=:层级相对节点图层
- metadata=:图层携带的metadata键值属性
- shadowRadius=:图层的四周阴影半径,R版本开始SurfaceControl支持直接给图层设置阴影半径
WindowStateAnimator(WindowSurfaceController)
3、从BufferStateLayer可以一级级通过parent属性值往上溯源查看父节点ContainerLayer图层信息
WindowState
ActivityRecord
Task