如何实现对窗口window的viewtree进行dump Hierarchy-安卓framework实战开发

119 阅读2分钟

背景

有学员粉丝朋友在群里面问到一个如何针对普通的window进行dumpsys相关的viewtree问题,即展示每个window的view的层级树。比如我们知道activity的话可以使用如下命令进行dump

adb shell dumpsys activity com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher

这里activity后面的就是componentName,即每一个activity的名字,然后在输出里面就会有下面的view层级展示: 在这里插入图片描述 但是针对普通window却没有发现有和activity一样好用的命令,可以直接dump。

探索分析

看看activity是怎么dump出来的view tree情况 在这里插入图片描述 可以看到activity实际是在ViewRootImpl的dump方法中调用了dumpViewHierarchy方法,才可以输出的。那么看看ViewRootImpl的dump方法是被谁调用的? 在这里插入图片描述 可以看到确实只有Activity的dumpInner里面才有调用这个ViewRootImpl的dump方法,没有看到有其他普通window啥的对这个ViewRootImpl进行调用,并没有发现在window相关的地方有调用这个ViewRootImpl的dump方法。

方案设计

首先大家知道每一个Window其实在wms端有对应的windowstate对象,同时在app端一般也会有一个ViewRootImpl对象。 在这里插入图片描述二者关系如上图,wms端和app端都是可以进行相互跨进程通讯。

基于以上背景知识可以设计一个wms的扩展命令

在这里插入图片描述改善的更加完善: 这里也可以不传递具体的window name,可以把屏幕当前显示的window都进行dump,在打包成一个zip 在这里插入图片描述

具体实现成果:

把相关扩展命令包装成了一个test.sh,把所有当前屏幕显示

./test.sh 1.zip

在这里插入图片描述 打开看看Launcher的情况: 在这里插入图片描述 相关的完整实现的patch可以找马哥获取(仅限vip付费学员)

更多framework技术干货,请关注公众号“千里马学框架”