如何实现对窗口window的viewtree进行dump Hierarchy-安卓framework实战开发
背景
有学员粉丝朋友在群里面问到一个如何针对普通的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详细代码和资料参考如下链接
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
其他课程七件套专题:
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw
视频试看:
https://www.bilibili.com/video/BV1wc41117L4/
参考相关链接:
https://blog.csdn.net/zhimokf/article/details/137958615
更多framework假威风耗:androidframework007