RFC-0166:一个界面堆栈

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

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

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

摘要

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

  • 根 Presenter 组件已被弃用,取而代之的是场景管理器。
  • 输入流水线库将在具有图形功能的产品上作为场景管理器的一部分运行。
  • 界面组件之间的所有合约都应通过平台集成测试来覆盖,以确保在转换过程中行为保持一致。
  • Scenic 的 GFX API 已被弃用,取而代之的是 Flatland。

设计初衷

Fuchsia 平台目前包含多种

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

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

此 RFC 旨在明确指出哪些相关组件和 API 已弃用、哪些是记录计划,并批准迁移的计划顺序。它针对 RFC-0096:用户输入架构RFC-0147:视图系统中讨论的架构提供了更多背景信息。

利益相关方

哪些人会受到此 RFC 是否被接受的影响?(此部分为可选,但建议填写。)

辅导员

cpu@google.com

审核者

  • Scenic、运行时集成:emircan@google.com、jjosh@google.com、dworsham@google.com
  • 无障碍功能:lucasradaelli@google.com
  • 输入:quiche@google.com, jaeheon@google.com

已咨询

yeg@google.com

共同化

此计划的详细版本已在内部与 Scenic、Input 和 Accessibility 团队进行了审核。

术语库

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

设计

旧版状态与所需状态

图表:显示了旧版与所需界面堆栈(如下所述)

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

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

变更内容

弃用了根 Presenter

场景管理和输入功能将从根演示器中移除,根演示器将重命名为“虚拟键盘管理器”,以反映剩余的功能。这会移除大量未经充分测试的旧版代码。

任何目前在 Scene Manager 中不受支持的 Root Presenter 功能(例如,无障碍放大功能)都将在 Scene Manager 中实现。

集成测试

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

从 GFX 到 Flatland

所有对 GFX API 的引用和实现都将从 fuchsia.git 中移除。GFX 是一种旧版 3D API,与 Fuchsia 目前所服务的用例相比,其复杂程度过高。移除它可简化系统,并移除一大部分难以理解的 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)。在没有场景管理器的产品中,它会暂时作为独立组件运行。

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

目前,Scene Manager 缺少 RootPresenter 中的许多功能。将 Scene Manager 的功能与 Root Presenter 对齐的相关工作已在 https://fxbug.dev/42181047 中进行跟踪。 完成此操作并使用平台集成测试覆盖所有功能后,我们将转换所有剩余产品以使用场景管理器 + GFX。

过渡期结束后,Root Presenter 中的输入和场景管理代码将被移除。Root Presenter 的虚拟键盘控制器功能将保留,但该组件将更名以反映其减少的职责。

里程碑 3:将剩余商品迁移到 Flatland

Flatland 中还有一些工作需要完成,才能涵盖 GFX 中支持的所有功能。此工作在 https://fxbug.dev/42175822 中进行跟踪。 一旦这项工作完成并完全覆盖平台集成测试,我们将把剩余产品迁移到 Flatland。

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

性能

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

安全性和隐私权注意事项

此 RFC 不会引入任何新的安全或隐私问题,这些问题均已在 Flatland API 审核中涵盖。 不会收集任何用户数据。

测试

在迁移的每个阶段,我们都会在受影响的功能完全覆盖集成测试后,才允许过渡到下一阶段。由于 Root Presenter 历来缺乏此类覆盖范围,因此这应会使界面堆栈的覆盖范围总体上有所改进。

文档

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

缺点、替代方案和未知因素

这是一项复杂的多年期迁移,需要投入大量工程资源才能完成。

不进行任何操作

我们可以继续在所有使用旧版功能的产品的生命周期内维护这些功能。从以往来看,由于平台其余部分不断变化,以及缺乏全面的测试,此维护工作量很大。多个界面堆栈也会造成混淆,导致不确定特定产品上实际运行的是什么代码。虽然迁移成本高昂,但随着时间的推移,维持现状需要付出更多努力,结果也会更差,工程速度也会降低。

先过渡到 Flatland

此方法需要大量工作才能将 Flatland 支持添加到 Root Presenter。由于此代码缺乏全面的测试覆盖率,因此风险很高,需要大量一次性工作。

在先技术和参考资料