news 2026/8/16 13:34:36

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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();}...}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/16 13:34:14

深度拆解 Windows Hello:从红外成像到密钥全流程

当你看向笔记本屏幕,一秒完成系统解锁,这就是 Windows Hello 带给我们的无感登录体验。多数人只知道它好用,却很少了解这套系统并不是简单的摄像头拍照比对,而是由红外成像活体采集、安全隔离运算、TPM2.0 硬件密钥体系共同搭建的…

作者头像 李华
网站建设 2026/8/16 13:33:29

原神成就导出终极攻略:YaeAchievement 五分钟搞定全平台数据同步

原神成就导出终极攻略:YaeAchievement 五分钟搞定全平台数据同步 【免费下载链接】YaeAchievement 更快、更准的原神数据导出工具 项目地址: https://gitcode.com/gh_mirrors/ya/YaeAchievement 如果你玩《原神》已经有一阵子,多半体会过这样的纠…

作者头像 李华
网站建设 2026/8/16 13:28:52

OpenClaw+轻量云:自建AI知识库实现秒级检索与成本优化实战

1. 项目缘起:从“慢半拍”到“秒级响应”的痛点 最近在折腾个人知识库,相信不少朋友跟我一样,从 Obsidian、Notion 这类笔记工具,到 Dify、AnythingLLM 这类 AI 知识库,都尝试过一圈。工具换来换去,核心痛点…

作者头像 李华
网站建设 2026/8/16 13:24:55

义乌出口退税公司怎么挑选?

义乌作为全球小商品贸易枢纽,出口退税政策是外贸企业资金周转与成本控制的核心支撑。随着跨境电商、市场采购贸易等新业态崛起,义乌出口退税在政策适配、操作优化等方面面临新课题。本文结合行业观察,从现状、痛点及应对策略展开分析&#xf…

作者头像 李华
网站建设 2026/8/16 13:22:52

大模型推理轨迹窃取:原理、风险与防御指南

你有没有想过,当你在调用一个闭源大模型(比如 GPT-4、Claude 或文心一言)的 API 时,你得到的不仅仅是一个答案?在答案生成之前,模型内部可能经历了一个复杂的“思考”过程——我们称之为 推理轨迹 。这个…

作者头像 李华
网站建设 2026/8/16 13:21:19

Windows平台VSCode+MinGW动态库开发实战:从环境搭建到部署调用

1. 项目缘起:为什么要在Windows上用VSCode和MinGW搞动态库? 如果你是一个在Windows平台上用C语言做开发的程序员,尤其是从Linux/macOS环境转过来的,大概率会对Visual Studio那套庞大的IDE又爱又恨。爱的是它功能齐全,调…

作者头像 李华