首页 > 系统相关 >visible_windows生成逻辑和解析

visible_windows生成逻辑和解析

时间:2024-06-16 15:59:56浏览次数:13  
标签:控件 调用 这里 windows 写入 visible 解析 方法 属性

visible_windows生成逻辑和解析

visible_windows生成逻辑

在开发者选项中生成错误报告或命令行使用dumpstate,会生成一个bugreprot的压缩包,如

其中包含了一些dump信息,其中海有个压缩包

里面包含了一些可见窗口的控件信息,但用notepad打开却多是乱码

之前工作遇到过一个显示问题只有截图、简要log和上面bugreport,最后根据上面的控件信息结合截图然后排查代码找到疑点最后解决问题,这里介绍下上面窗口控件dump信息的生成和解析

首先找到其生成visible_windows.zip的代码:(frameworks/native/cmds/dumpstate/dumpstate.cpp)

可见这里主要是调用了cmd window dump-visible-window-views命令行,即使直接命令行调用也可以执行,其是调用的windowmanager的命令行即WindowManagerShellCommand.java中逻辑

查看其onCommand方法:

显然在调用dump-visible-window-views命令时,其会执行runDumpVisibleWindowViews方法

runDumpVisibleWindowViews主要逻辑时遍历窗口,如果窗口可见则调用窗口(WindowState)的mClient.executeCommand方法,这里mClient对端是ViewRootImpl的一个内部类W,所以,这里最后会遍历可见窗口执行其ViewRootImpl中的executeCommand方法

executeCommand方法这里显然根本逻辑只有一行,即调用ViewDebug的dispatchCommand方法,其参数view是对应窗口的控件树的根节点,其参数command是ViewDebug.REMOTE_COMMAND_DUMP_ENCODED即DUMP_ENCODED,其参数parameters是null,其参数clientStream是之前创建的输出流

继续查看下ViewDebug的dispatchCommand方法

在该场景下其调用的是dumpEncoded方法

这里主要创建了一个ViewHierarchyEncoder,后面控件也主要是通过这里写入的

encoder.addProperty

先看下这里最开始写如的widnow:left和window:top数据,其都是调用ViewHierarchyEncoder的addProperty方法

这里createPropertyIndex方法如下,其维护了一个属性名的map,其key是属性名,value是记录的该属性名出现的index,如果已经添加过对应属性名,这里则返回其对应index,如果没有添加过,则将心出现的属性名添加到map中(mPropertyNames),并将其新的index(根据属性名出现顺序从1开始递增)添加到map中

再查看下writeShort和writeInt方法,其逻辑相似,都是先写入一个标记字母表示数据类型,然后写入对应数据

view.encode

然后看下view.encode方法

beginObject和endObject(ViewHierarchyEncoder)

其中addProperty之前介绍过了,这里不重复,这里beginObject看着主要是对对应控件的信息两边加个标记,类似于加个括号以区分

encodeProperties(View和ViewGroup)

这里只分析下View和ViewGroup的方法,其他可能也有实现encodeProperties方法,但其基本逻辑作用都是相似的

先看下ViewGroup的encodeProperties方法:

这里首先调用了super方法,也即会先调用View. encodeProperties方法

addProperty方法之前分析过,添加写入的属性和其值

然后是对控件的子控件进行遍历,这里会先调用encoder的addPropertyKey方法,其与addProperty相似,只是不写入具体的数据值而已,这里也只是起到一个隔离的作用,然后即是最关键的调用子控件的encode方法,这样就可以将控件树和其各控件的属性打印出来

然后再看下View的encodeProperties,这里打印了很多控件的属性,包括对应LayoutParams、Theme等各种信息

encoder.endStream

在前面的addProperty方法分析中有介绍其添加属性名和属性值时,属性名并不是直接写入的,而是先生成一个属性名的map,然后写入的是map中属性名对应的value,也相当于其index,而这里就是将map的信息写入(mPropertyNames),相当于一个索引

总结

根据前面的分析,总结下其写入数据的逻辑,这里一般有两种数据,一种是作为类似括号功能的标记用以区分不同控件/不同作用的数据,一种是具体的控件的属性等,其添加数据写入,会生成一个类似索引表的map,将属性名都放到索引表中,写入数据时不直接写属性名,而是写入其对应索引,然后写入其值,在最后,则写入索引表信息

visible_windows解析

弄明白了生成的过程,其实解析也就不难了

而在Android源码中其实也有个简易的例子:

frameworks/base/tests/HierarchyViewerTest/src/com/android/test/hierarchyviewer/

这里参考源码中的代码结合上面分析写个完整的解析的代码(源码中Decoder.java可直接使用,这个也是包含最基本的解析数据的逻辑)

先第一步使用Decoder将数据进行解析打印出来(以NavigationBar的为例,这里只是当作例子实现下功能,代码上可能有些地方并不算完善)

如上即是解析打印出来的文件,虽然并不完善,但可以看到已经没有乱码了,而结合之前的生成逻辑,根据这里的打印也可以识别出信息内容了

第一行是1,查找打印出来的索引表,其代表window:left,第二行是0,表示window:left是0

第三行是2,查找打印出来的索引表,其代表window:top,第四行是2792,表示window:top是2792

这几行也符合前面生成逻辑里的最开始的打印信息

要将解析更完善一步的话也很简单,最后面的map是索引表,可将索引表的具体信息直接替换成前面的索引index,这样看着更方便,这里不进一步举例

标签:控件,调用,这里,windows,写入,visible,解析,方法,属性
From: https://www.cnblogs.com/luoliang13/p/18250713

相关文章

  • Windows系统上安装部署苹果系统(Mac OS)的几种方法
    /*MacOS苹果系统,正常情况下,只能安装到苹果公司自己出品的Mac电脑,俗称白苹果,不能安装到各种组装机或者其他品牌的品牌机上,黑苹果的的原理,就是通过一些“破解补丁”工具欺骗macOS系统,让苹果系统认为你的电脑其实是一台苹果电脑,从而可以安装运行。*/1.购买苹果笔记本或苹果一......
  • Ubuntu server 24 (Linux) 安装部署samba服务器 共享文件目录 windows访问
    1安装sudoaptupdatesudoapt-getinstallsamba#启动服务sudosystemctlrestartsmbd.servicesudosystemctlenablesmbd.service#查看服务2创建用户#创建系统用户sudouseraddtest2#配置用户密码sudosmbpasswd-atest2#smbpasswd:-a添加用户-......
  • windows系统python代码打包为exe
    目录1建立虚拟环境condavenv2打包安装pyinstaller打包1建立虚拟环境好处:打包文件小,成功率高。坏处:代码使用到的第三方库需要重新安装如果不想使用虚拟环境,直接看2打包。conda如果没有conda,直接使用venv。查看虚拟环境condaenvlist创建虚拟环境condacreate......
  • Linux DNS域名解析服务
    DNS域名解析服务BIND域名服务基础DNS系统的作用及类型BIND的安装和控制BIND服务的配置文件使用BIND构建域名服务器构建缓存域名服务器构建主域名服务器构建从域名服务器BIND域名服务基础DNS系统的作用及类型整个Internet大家庭中连接了数以亿计的服务器、个人......
  • 全面的初级入门指南,从安装到基本使用,再到一些高级功能的介绍,帮助用户在实际操作中逐步
    大纲:WindowsNmap初级使用教程1.简介什么是Nmap?Nmap的主要功能和用途安全和法律注意事项2.安装Nmap前提条件从官方网站下载Nmap安装步骤验证安装3.基本使用打开命令提示符运行你的第一个Nmap扫描示例命令:nmap目标IP地址理解基本的输出结果4.常用扫......
  • 【禁用Windows Defender】Defender Control v2.1
    #简介DefenderControl是一款小型便携式免费软件,可以完全禁用Windows中的WindowsDefender。在特殊的情况的环境里会有不错的效果~提醒:使用前请了解你在干什么,否则请不要轻易使用!#软件截图#更新日志不同的阻塞方法一些代码改进#下载恭喜你发现宝藏站点哦,不妨点进......
  • 【解决方案】Windows git clone报错:Filename too long
    ✨报错提示Windows在处理Gitclone时可能会遇到Filenametoolong的错误,这是由于Windows对文件路径长度的限制(默认最大路径长度为260个字符)。以及不知道为什么Pwsh中部分文件名乱码了✨解决方案Termianl运行以下命令启用Git的长路径支持gitconfig--systemcor......
  • VirtIO drivers for Linux, Windows and etc.
    WhydoyouneedVirIOdriver?It'susefulwhenyouuseLinux/WindowsVMsinPVE.UsuallywhenyouattachanetworktotheVM,youwouldclickthe"Hardware"->"NetworkDevice"->"Bridge"->"vmbr0"o......
  • Windows中搭建centos虚拟机和MySQL
    背景前一段时间,博主为了在家里搭建学习环境,想模拟一个生产环境,尝试了Windows安装WSL、Vmwareworkstationplayer安装Ubuntu、把Window删了直接装Ubuntu、把Ubuntu删了装回Windows(Windows一直无法安装到SSD,最后拆了电脑拔了机械硬盘才装成功)的多个阶段,发现还是Windows用的习惯......
  • 基于交换机端口划分VLAN 千字解析
    实验目的及要求:(1)掌握交换机配置的几种模式及基本配置命令。(2)掌握VLAN的原理及基于交换机端口的VLAN划分方法。实验方法:基于单台交换机实现端口VLAN划分并验证;使用cicsopackettracer模拟器完成网络拓扑图如下所示:在三台PC机上设置IP地址如下:连通性测试:三台计算机两......