如何实现对窗口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技术干货,请关注下面“千里马学框架”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值