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

使用adb命令获取设备UI(hierarchy)信息 安卓设备版本在4.0以上,而且打开了View Server(这不一定根据手机,有的手机不需要打开就能通过Hierarchy Viewer可以看到app的UI结构),如果不能看到,执行打开命令: adb shell service call window 1 i32 4939 然后通过执行如下命令判断是否开启View Server:  adb shell service call win 阅读详情
AI摘要

学员询问普通window进行dumpsys相关的viewtree问题,因无像activity一样好用的命令。经探索,发现activity在ViewRootImpl的dump方法中调用dumpViewHierarchy输出。基于Window在wms端和app端的对象及跨进程通讯,设计了wms扩展命令,还包装成test.sh。

背景

有学员粉丝朋友在群里面问到一个如何针对普通的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技术干货,请关注下面“千里马学框架”

adb获取当前页面的UI布局层次结构 获取当前应用的activity屏幕上所有控件的UI布局层次关系并保存在xml文件里面,可以执行下面命令: adb shell uiautomator dump /sdcard/ui.xml 实质是调用了Android系统下的/system/bin/uiautomator.jar的dumpWindowHierarchy方法。 参考: http://android-doc.github.io/tools/help/uiautomator/index.html http://android-doc.github 阅读详情

相关推荐

Android view绘制流程详解(一)ViewTree的生成

ViewTree的生成 类的介绍: ActivityThread:它是Activity的一个主线程,是main入口。其中有个内部类ApplicationThread extends ApplicationNative extends Binder,当ApplicationNative通过binder通信在onTransact方法获取到Activity的各种生命周期,通过schedule_xxx_xxx_transaction的处理各个生命周期的分支,在分支中通过handler机制将消息发送到Activit

massonJ的博客 798

手把手教你搞定CAC会议投稿:从LaTeX模板到PDF eXpress避坑全流程

本文详细解析CAC会议投稿全流程,重点介绍LaTeX模板调整、Turnitin查重技巧及PDF eXpress校验避坑指南。通过实战案例和代码示例,帮助研究者高效完成IEEE格式论文投稿,避免常见技术性失误,提升投稿成功率。

weixin_29969209的博客 397

Android UIAutomator浅谈

Android UIAutomator浅谈Android UIAutomator浅谈 简介 准备 UI元素查找 访问UI控件 指定一个选择器 执行动作 集合操作 操作可以滚动的UI元素 校验结果 Api UiDevice UiObject 总结 链接 简介Uiautomator是谷歌推出的,用于UI自动化测试的工具,也就是普通的手工测试,点击每个控件元素看看输出的结果是否符合预期。比如登陆界面分别输

流水不腐小夏 8560

【FPGA】Robei EDA 的使用(7)—— Robei文件上板试验

#沐朝露兮以自华,觅大道兮以求成 我又滚过来了,研究了20多天RISCV,结果最后因为硬件问题导致无法在比赛中使用RISCV CPU,虽然已经临近比赛后期了,非常的崩溃,但是也没有什么办法。唉,一切不过是从头再来罢了。(写写博客舒缓我心中苦闷) ————————————————进入正文的分割线———————————————— 今天介绍一下如何利用 Robei EDA 生成文件,导入vivado中,综合下载到开发板里。拿我一个PWM控制舵机的代码为例。 Robei EDA设置 假设代码模块(model文件)经

Ninquelote的博客 2563

FINN vs GFED vs GFAS vs QFED:四大火灾排放清单实战对比(含Python数据处理代码)

本文针对GFED、FINN、GFAS、QFED四大主流火灾排放清单,提供了实战对比分析与Python数据处理代码。通过量化对比东南亚农业火点与亚马逊雨林大火两个典型场景,揭示了不同清单在时空分辨率、算法内核和应用场景上的核心差异,并给出了基于研究目标、区域和模型的清单选择决策框架,帮助研究人员为空气质量模拟或火灾影响评估挑选最合适的数据源。

s3t4u的博客 422

Android系统之ViewTree的创建与绘制

1. ViewTree的创建 在分析Activity启动过程中: Activity启动流程会执行startSpecificActivityLocked ActivityThread.performLaunchActivity //onCreate -> onStart SetContentView创建DecorView(DecorView = ContentView(用户需要显示的组件) + 系统其它组件) ActivityThread.handleResumeActivity //on

litao55555的博客 2745

【知识点总结】电路原理 第一讲

大家好,从今天起,我将开始更新自上大学以来所学到的各种知识,之所以选择更新它们是因为最近我一直在收拾整理自己自上大学以来所收获到的各种知识,看着那厚厚一沓的书本心里不由得犯愁。如果我想找到特定的知识,那岂不是得翻到猴年马月。俗话说得好,下雨天打鞋子,闲着也是闲着,为此我设置一个专栏,将知识点一一分类总结,目的在于更好的整理所学的知识。本人学艺不精,有一些知识点地方可能存在瑕疵,希望各位大佬可以多多指教。以下是本篇文章正文内容虚断:一般通用性运算放大器的正反向输入端之间的电阻非常非常的大。

weixin_51130221的博客 4万+

Android性能分析和优化之Trace View、Dump View Hierarchy

trance view。 a、打开 androd stuido -> tools -> android device Monitor (DDMS)。 b、在 DDMS中 选择进程启动 start method profiling(trace view) 见下图: c、启动停止之后,则如下图所示: 如上图所示,在 trance view 中根据 以下3部分来定位...

wangqiubo2010的博客 2107

模拟IC版图DRC实战:手把手教你搞定MIM电容天线错误和ESD.10g违例

本文深入解析模拟IC版图中的MIM电容天线错误和ESD.10g违例问题,提供从错误解码到实战修复的完整指南。通过电路图修改、版图优化和验证闭环等步骤,帮助工程师高效解决DRC错误,特别适用于ADC等精密模拟电路设计。文章还分享了高级排错技巧和预防性设计策略,大幅提升流片成功率。

weixin_27697385的博客 295

ROS环境下UR机械臂与Realsense相机手眼标定实战指南

本文提供了在ROS环境下,对UR机械臂与Realsense相机进行手眼标定的完整实战指南。详细介绍了从环境搭建、软件包安装、硬件配置到分步数据采集与计算的完整流程,并分享了常见的避坑技巧与精度优化方法,旨在帮助开发者高效、准确地完成标定,为后续的机器人视觉应用奠定坚实基础。

sunny的博客 648

Android+uiautomator2.0实现离线运行UI测试

Android+uiautomator2.0实现离线运行UI测试目的参考文档实现工程搭建1、新建一个Android应用2、给UI增加Button,修改res/layout目录下activity_main.xml文件3、修改MainActivity.java文件MainActivity Class,添加Button事件、uiautomator线程、创建CMDUtils类等4、新建一个Module,用于编写uiautomator脚本5、修改mytestcase模块的build.gradle文件6、编写uiaut

leeeeeena's blog 4588

小龙虾们的好伙伴专栏导航

本文系统解析了OpenClaw技术架构,包括Channel层和网关层的设计实现,并与AgentSkills等技术方案进行对比。同时提供了OpenClaw的系列实用指南,涵盖小龙虾培养、客户资源管理、系统自动化巡检以及技术趋势助手构建等应用场景,帮助用户从零成本入门到高效落地应用,实现业务全流程自动化管理。

wend的博客 212

UIAutomator2.0详解(UIDevice篇----Hierarchy)

UIDevice类提供了4个(实际只有3个)关于Hierarchy(布局层次关系)的接口。 先列举一下接口。(1)public void setCompressedLayoutHeirarchy(boolean compressed) (2)public void dumpWindowHierarchy(File dest) throws IOException (3)public void

breakloop 6338

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

查看当前view tree结构

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33692284的博客 472

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

bootstrap之DumpWindowHierarchy

DumpWindowHierarchy package io.appium.android.bootstrap.handler; import android.os.Environment; import com.android.uiautomator.core.UiDevice; import io.appium.android.bootstrap.AndroidComm...

weixin_34106122的博客 261

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

小知识分享:adb uiautomator 命令 dump ui 树信息

之前给大家分享过一篇文章,讲述如何通过 getevent/sendevent/input 命令向 android 手机设备接收和发送操作事件,来解决自动化脚本场景的需求。其实还有一个小知...

滴水穿石,点石为金 1万+

[ios]打印ViewTree

查看当前view tree结构   下列代码加入到AppDelegate   - (void)dumpView:(UIView *)aView atIndent:(int)indent into:(NSMutableString *)outstring { for (int i = 0; i < indent; i++) [outstring appendString:...

ipoolo的专栏 182

UIDevice: dumpWindowHierarchy提示open failed: EACCES (Permission denied)错误

1. dumpWindowHierarchy报错:Open Failed:EACCES(Permission denied)

shfscut的博客 833

Android 11 替换Launcher后导致近期任务无效

替换默认主界面, 更换为指定第三方Launcher后, 点击导航栏的RECENT键无效. 究其原因在于, 在旧版本SDK上, 删除Launcher3并不会影响RECENT的功能 , 而在新的SDK上,RECENT功能集成于Launcher3目录下, 删除 Launcher3后, 导致SystemUI调用对应的RECENT界面启动的服务失败....

ansondroider的博客 5518

uiautomator uidevice dumpWindowHierarchy无法保存xml文件的bug

我使用android 4.4.3, android sdk tool版本23.0.2,调用dumpWindowHierarchy没有报错,但是在官网文档著名的路径/data/local/tmp下面没有找到保存的布局xml文件。 后来发现这是一个由来已久的bug, issue地址

ccliangbo的专栏 4910

从QuickstepLauncher启动Settings的focus切换

打开WMS log:adb shell dumpsys window -d enable a adb logcat |grep -Ei "Looking for focus|findFocusedWindow: Found new focus|Changing focus from|No focusable window|Relayout of Window|Gaining focus|Focus entered window" 从QuickstepLauncher启动Settings的focus切换..

一杯咖啡的专栏 1301

【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树

下面2个图来自Unity3d官网开发文档:们玩的王者荣耀,原神等游戏的开发,都是类似在这么一个3D场景下进行的,开发者将使用3D建模工具来创建地形、建筑、植被等地图元素,并通过材质和贴图来增强地图的视觉效果。比如这张图片里放了3个颜色的柱子。除了这些物体外,可以看到还有一个摄像机(Camera),它是用来捕捉画面的, 毕竟手机屏幕是2D的,简单来说这个摄像机能捕捉到的画面就是我们手机屏幕上显示的内容,比如这张图片捕捉到的画面是右下角的内容。

隔壁小王的博客 2435
上一篇: aosp13/14上自由窗口实战开发之CaptionWindow原理差异分析
下一篇: 安卓aosp14上自由窗口划线边框Freeform Caption实战开发-千里马framework实战
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

千里马学框架

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

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

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

打赏作者

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

抵扣说明:

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

余额充值