RFC-0166:一个界面堆栈

RFC-0166:一个界面堆栈
状态已接受
领域
  • 图形
  • HCI
  • 查看系统
说明

阐明了将所有 Fuchsia 产品迁移到单个图形和输入堆栈的计划和政策。

问题
Gerrit 更改
作者
审核人
提交日期(年-月-日)2022-05-04
审核日期(年-月-日)2022-06-03

摘要

此 RFC 说明了与 Fuchsia 平台中图形、输入和无障碍功能堆栈(也称为“界面堆栈”)中使用的旧版组件和 API 相关的记录计划。其中概述了计划迁移顺序,以便使用相同的图形、输入和无障碍功能堆栈实现所有 Fuchsia 产品配置。还阐明了围绕这些过渡的测试标准。具体而言:

  • Root Presenter 组件已废弃,取而代之的是 Scene Manager。
  • Input Pipeline 库将作为 Scene Manager 的一部分在包含图形的产品上运行。
  • 平台集成测试应涵盖界面组件之间的所有协定,以确保在过渡期间实现一致的行为。
  • 废弃了 Views 的 GFX API,取而代之的是 Flatland。

设计初衷

Fuchsia 平台目前包含多种方法,

  • 处理用户输入
  • 创建图形场景
  • 连接无障碍服务

目前,不同的 Fuchsia 产品配置使用了此功能的不同子集。这会导致不同产品之间出现混乱和难以调试。

本 RFC 旨在阐明所涉及的哪些组件和 API 已弃用(属于记录计划),并批准了迁移的计划顺序。它提供了有关 RFC-0096:用户输入架构RFC-0147:视图系统中讨论的架构的其他背景信息。

利益相关方

谁能决定此 RFC 是否被接受?(此部分为可选内容,但我们建议您。)

教员

cpu@google.com

审核者

  • 风景优美的运行时集成:emircan@google.com、jjosh@google.com、dworsham@google.com
  • 无障碍功能:lucasradaelli@google.com
  • 输入:quiche@google.com、jaeheon@google.com

咨询人员

yeg@google.com

社交

该计划的详细版本已由景观团队、输入团队和无障碍团队在内部审核。

术语库

  • Scenic - 用于处理图形组合、焦点管理和图形输入路由的 Fuchsia 平台组件。fuchsia.ui.scenicfuchsia.ui.gfx
  • Flatland - 记录景观 API 的计划。可在 fuchsia.ui.composition 中找到。
  • 输入流水线 - 用于处理输入事件的路由和政策的 Fuchsia 库。可以作为场景管理器的一部分运行,也可以作为独立组件运行。
  • 场景管理器 - Fuchsia 平台组件,用于处理场景场景的设置和配置以及启动输入流水线。目前缺少某些功能,特别是无障碍功能方面的功能。
  • Root Presenter - 用于处理景观场景的输入路由以及设置和配置的旧版 Fuchsia 平台组件。
  • 无障碍功能管理器 - 用于处理无障碍服务的 Fuchsia 平台组件。

设计

旧版与期望状态

旧版界面堆栈与所需界面堆栈(如下所述)的示意图

在旧版界面堆栈中,Root Presenter 负责解释来自驱动程序堆栈的输入事件,并使用 GFX 实例化场景图。Root Presenter 会将输入事件分派给 Scene,后者有时会将这些事件转发给无障碍管理器。Root Presenter 向无障碍管理器发送命令以控制放大和色彩校正。Flutter 和 Chromium 使用 GFX 创建视图。

在所需/未来的界面堆栈中,Scene Manager 负责解释来自驱动程序堆栈的输入事件,并使用 Flatland 实例化场景图。输入流水线作为 Scene Manager 组件的一部分进行实例化,并将输入事件分派给景观。View 有时会将输入事件转发到无障碍管理器。场景管理器会向无障碍管理器发送命令,以控制放大和色彩校正。Flutter 和 Chromium 使用 Flatland 创建视图。虚拟键盘控制器是一个独立的组件,仅负责传递有关屏幕键盘状态的消息。

具体变化

废弃了根 Presenter

我们将从 Root Presenter 中移除场景管理和输入功能,后者将重命名为“Virtual Keyboard Manager”,以反映其余功能。这样可以移除大量几乎未经过测试的旧代码。

场景管理器中目前不支持的任何 Root Presenter 功能(例如无障碍放大功能)都将在场景管理器中实现。

集成测试

界面堆栈的所有功能(图形、不同形式的用户输入、无障碍功能)现在都需要封闭集成测试,以确保平台组件之间的协定保持稳定。

从 GFX 到 Flatland

对 GFX API 的所有引用和实现都将从 Fuchsia.git 中移除。GFX 是旧版 3D API,比 Fuchsia 目前支持的用例复杂得多。移除该 API 可以简化系统,并移除大量不易理解的 API Surface。

这还允许运行时实现(Flutter、Chromium)从其代码库中移除 GFX 支持。

弃用顺序

为了将所有产品移至所需的相同配置,我们必须更改组件拓扑(将 Root Presenter 替换为 Scene Manager)以及使用的 API(GFX 与 Flatland)。为了为图形 API 过渡提供可靠的测试覆盖范围,我们首先要在正确的组件拓扑上对齐所有产品。完成后,我们会将 GFX 上剩余的所有产品转换为 Flatland。

实现

在所有阶段,都应使用 build 标志控制迁移,以便轻松进行手动测试和回滚。

里程碑 0(已完成):仅限工作站上的 Flatland

工作站配置已于 2022 年第 1 季度转为使用 Flatland 处理图形。

里程碑 1(已完成):其他产品迁移至输入流水线

自 2022 年第 2 季度起,所有其他 Fuchsia 产品都已改用输入流水线(而非 Root Presenter)进行输入事件路由。在没有 Scene Manager 的产品中,它暂时作为独立组件运行。

里程碑 2:将所有产品过渡到场景管理器

目前,场景管理器缺少 Root Presenter 中的许多功能。https://fxbug.dev/42181047 会跟踪关于让 Scene Manager 实现与 Root Presenter 的功能相当的工作。完成上述操作并且平台集成测试涵盖所有功能后,我们会将其余所有产品转换为使用 Scene Manager + GFX。

在此过渡之后,Root Presenter 中的输入和场景管理代码将被移除。Root Presenter 的虚拟键盘控制器功能将保留下来,并且组件将重命名,以体现其责任范围缩小。

里程碑 3:将其余产品转换为 Flatland

Flatland 中还做了一些额外的工作,以涵盖 GFX 中支持的所有功能。如需了解这项工作,请访问 https://fxbug.dev/42175822。平台集成测试完成这项工作并全面覆盖后,我们会将其余产品转移到 Flatland。

在此版本发布并稳定后,GFX 的 API 和实现可能会被移除。请注意,这包括 Sense 组件中的代码以及多个界面框架中的集成代码。

性能

由于 Flatland 的效率提高,里程碑 3 可以提高某些产品配置的性能。当 Flatland 能够将合成委托给显示控制器(即不涉及 GPU)时,这属于正常现象;也就是说,在某些设备类型上可以使用该功能。您应该在每次过渡期间监控性能,但预计这种情况不会变差。

安全和隐私权注意事项

本 RFC 不引入 Flatland API 审核未涵盖的任何新的安全或隐私问题。系统不会收集任何用户数据。

测试

在迁移的每个阶段,我们会针对受影响功能的全面集成测试范围限制转换。由于 Root Presenter 过去未进行此类覆盖,因此应该能够全面改善界面堆栈的覆盖率。

文档

随着里程碑的完成,应该从文档中移除对 Root Presenter 和 GFX 的引用。

缺点、替代方案和问题

这是一项跨越多个季度的复杂迁移,将需要大量工程工作才能完成。

不进行任何操作

我们可以在使用该旧版功能的所有产品的生命周期内继续保留旧版功能。过去,由于平台其余部分在不断更改并且缺乏全面的测试,这种维护一直以来都是实质性的。多个界面堆栈还令人感到困惑,导致给定产品上实际运行的代码不确定。虽然迁移成本高昂,但随着时间的推移,维持现状将需要更多的精力,结果会更差,工程速度也会下降。

请先过渡到 Flatland

采用这种方法时,需要大量工作才能为 Root Presenter 添加 Flatland 支持。由于此代码缺少全面的测试覆盖范围,因此存在风险,需要完成大量一次性的工作。

现有艺术和参考资料