当前位置: 首页 > news >正文

Winscope如何让你的系统app在可以展示ViewCapture相关数据?

背景

在使用Winscope时候,发现有一个单独的ViewCapture项目

可以展示出view的完整结构

但是并不是所有的app都是支持这个ViewCapture功能,比如我们这里的DeskClock app就不支持,目前只看到Launcher是有支持的。

系统应用中的 ViewCapture

ViewCapture 是一种软件工具,用于捕获附加到其挂钩的窗口的视图属性(例如位置、大小、缩放比例和可见性)。ViewCapture 会捕获窗口内各种视图及其属性的相关信息,以便您了解特定时刻的用户体验状态,并跟踪随时间的变化。

屏幕录制可以直观呈现视图在特定时间的状态,并显示其变化情况,但它们需要大量的 CPU 资源,并且可能会影响性能。ViewCapture 工具对资源的影响较小,可以更频繁地启用。此外,ViewCapture 会在视图级别逐帧显示可视化图表,与屏幕录制相比,可更轻松地检查特定时刻的视图状态。

本页面介绍了如何在系统应用中初始化 ViewCapture。

使用

ViewCapture.java 可实现 onDrawListener 的实例,并在绘制过程中收集 ViewCapture 跟踪记录。每次帧重绘都会触发对视图树层次结构的遍历,且从窗口的根视图开始。ViewCapture 使用公共 View.java getter 方法来提取值并将其复制到后台线程,从而提高性能。ViewCapture 实现通过使用 captureViewTree 检查视图是否脏或无效来优化此过程,从而避免遍历整个视图层次结构。captureViewTree 仅适用于系统应用,并且是 UnsupportedAppUsage API 的一部分。此 API 的使用仅限于基于目标 SDK 版本的应用。

限制

以下部分介绍了运行 ViewCapture 时的性能和内存限制。

性能

ViewCapture 性能的主线程平均开销为 195 μs。不过,在最糟糕的情况下,可能需要大约 5 毫秒。请参阅 Perfetto 跟踪记录中的 vc#onDraw 切片。

开销主要源于以下操作:

遍历层次结构需要 50 μs,即使进行修剪也是如此。
从空闲列表分配器中提取对象以存储视图属性副本需要 20 μs。
通过 getter 函数提取每个属性值会导致每个视图进行多次额外的函数调用,耗时 110 μs。
因此,在始终开启跟踪 (AOT) 的情况下启用 ViewCapture 会对系统性能产生负面影响,并导致卡顿。由于存在这些性能和内存限制,因此该方法尚不适用于 AOT。我们建议仅在实验室和本地调试时使用 ViewCapture。

内存

Perfetto 的 ViewCapture 跟踪记录方法使用单个环形缓冲区,该缓冲区具有预定义的内存占用量,可防止过度占用内存。此方法通过避免为每个窗口使用单独的环形缓冲区来避免过度消耗内存,但无法解决针对每个帧在 Perfetto 中存储每个状态的整个视图层次结构的问题。记录单个窗口(例如 NexusLauncher)可能会在 10 MB 缓冲区中生成超过 30 秒的 ViewCapture 数据。不过,从系统界面捕获超过 30 个窗口需要更大的缓冲区或更短的录制时间窗口。

操作说明

请按照以下说明在系统应用中启用 ViewCapture:

将依赖项添加到 Android.bp 文件中,如启动器代码中所示。

android_library{name:"YourLib", static_libs:[..."//frameworks/libs/systemui:view_capture",...], platform_apis: true, privileged: true,}

语法拆解
以 “//frameworks/libs/systemui:iconloader_base” 为例,这是一个标准的 Label(标签) 语法:

//:代表 AOSP 源码的绝对根目录。

frameworks/libs/systemui:包路径(Package Path)。这告诉构建系统,直接去 aosp_root/frameworks/libs/systemui/ 目录下找 Android.bp(或 BUILD)文件。

:(冒号):分隔符。用来分隔“目录路径”和“目标模块名称”。

iconloader_base:目标模块名称(Target Name)。意思是提取该目录下 Android.bp 文件中,声明为 name: “iconloader_base” 的那个库。

在创建窗口时创建 ViewCapture 实例,例如:

示例 1:

privateSafeCloseable mViewCapture;@OverrideprotectedvoidonCreate(Bundle savedInstanceState){...mViewCapture=ViewCaptureFactory.getInstance(this).startCapture(getWindow());}

示例 2:

privateSafeCloseable mViewCapture;@OverrideprotectedvoidonAttachedToWindow(){super.onAttachedToWindow();if(enableViewCaptureTracing()){mViewCaptureCloseable=ViewCaptureFactory.getInstance(getContext()).startCapture(getRootView(),".NotificationShadeWindowView");}...}

在销毁窗口时关闭 ViewCapture 实例,如以下示例所示:

示例 1:

@OverridepublicvoidonDestroy(){...if(mViewCapture!=null)mViewCapture.close();}

示例 2:

@OverrideprotectedvoidonDetachedFromWindow(){super.onDetachedFromWindow();if(mViewCaptureCloseable!=null){mViewCaptureCloseable.close();}...}
http://www.jsqmd.com/news/1404916/

相关文章:

  • 3 个步骤免费用上中国行政区划矢量地图:省市县四级 Shapefile 一次拿全
  • 2026新型大圆机设备厂家实力解析:针织/单双面/提花源头工厂优选 - 卓企推荐
  • 关于GEO营销公司有哪些,你该知道这几点:技术交付ROI全维度对比 - 资讯报道
  • 从即梦换到知漫剧的真实体验:一站式出片解决角色场景连贯,新手少走弯路
  • 从NTP到Chrony:现代Linux服务器时间同步配置与排障指南
  • 2026 年 8 月新发布:宜君可靠的包装袋抖音推广平台有哪些,刷抖音时突然弹出的这玩意儿,竟能帮商家把包装袋卖成爆款,还省了十几万流量费? - 行业推荐官【认证】
  • AI搜索优化让制造业老板在AI里被客户找到 - 红枫叶GEO优化公司
  • 浏览器请求头编辑实战:把半小时的手动调试压缩成一条规则
  • 从投料到成品只需90分钟:河北CCS产线的一站式极速之旅,千亿集群加速跑
  • 告别“已售罄“:大麦网自动化抢票脚本的零基础上手指南
  • 人形机器人开发实战:从仿真环境搭建到AI大模型控制
  • 使用Disk2vhd实现Windows物理机在线热迁移至虚拟机
  • 装修设计出图,选基础还是报建深度?一张决策树厘清成本边界
  • SourceTree修改已推送commit信息的完整指南
  • 上海地区加蓬COC认证服务机构参考指南 附长三角企业办理指引 - 互联网科技品牌测评
  • Ubuntu软件源更新失败:从诊断到解决,全面解析E:无法下载错误
  • 东莞靠谱招聘网站 / 平台分类推荐(按实用性排序)
  • 3dsconv实用指南:把3DS卡带镜像变成可安装CIA,其实只需一条命令
  • 2026 罗茨风机几大头部厂家对比:赤豪风机、章鼓、华东风机、百事德机械怎么选?
  • AI优化让摄影工作室在AI搜索里被客户找到 - 红枫叶GEO优化公司
  • AI Agent开发教程:从核心能力到工程实践的全方位指南
  • 2026年8月深度GEO优化公司怎么选才靠谱**:实测数据盘点与分级选型建议 - 资讯报道
  • OpenCore Legacy Patcher 完整使用指南:老款 Mac 免费跑上最新 macOS
  • geo优化公司哪家好到底怎么选?头部GEO机构硬核实测横评与企业选型避坑指南 - 资讯报道
  • 深入UEFI底层:用grub-mod-setup_var解锁BIOS隐藏设置
  • 基于Java+SpringBoot的招聘网站的设计与实现源码+文档+讲解视频
  • 2026年福州小程序与APP开发公司:这8家本土服务商在技术、全链路服务与行业案例中表现突出 - 软件测评师
  • 基于STM32与离线语音识别的智能巡检小车设计与实现
  • 最新GEO服务商哪家靠谱怎么选才不踩坑:六大维度横评帮你选对不踩坑 - 资讯报道
  • 2026年8月国内304不锈钢工字钢公司推荐,不锈钢工字钢/316L不锈钢工字钢,304不锈钢工字钢源头厂家找哪家 - 企业权威推荐大使