RFC-0166:一个界面堆栈

RFC-0166:One UI 堆栈
状态已接受
区域
  • 图形
  • HCI
  • 视图系统
说明

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

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

摘要

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

  • 根 Presenter 组件已被弃用,取而代之的是场景管理器。
  • 输入流水线库将作为 Scene Manager 的一部分在具有图形的设备上运行。
  • 平台集成测试应涵盖界面组件之间的所有协定,以确保在转换过程中行为保持一致。
  • Scenic 的 GFX API 已废弃,取而代之的是 Flatland。

设计初衷

Fuchsia 平台目前包含多种

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

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

本 RFC 旨在阐明哪些相关组件和 API 已废弃,哪些是记录在案的计划,并批准迁移的计划顺序。它提供了有关 RFC-0096:用户输入架构RFC-0147:View 系统中所讨论架构的更多背景信息。

利益相关方

哪些人对此 RFC 的接受与否有利益相关?(此部分为可选部分,但建议填写。)

教员

cpu@google.com

Reviewers:

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

咨询了

yeg@google.com

社交

此计划的详细版本已在内部由 Scenic、输入和无障碍功能团队审核。

术语库

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

设计

旧版状态与期望状态

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

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

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

具体变化

废弃了根 Presenter

场景管理和输入功能将从 Root Presenter 中移除,该 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 for Graphics。

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

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

里程碑 2:将所有产品迁移到 Scene Manager

目前,Scene Manager 缺少 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 和实现可能会被移除。请注意,这包括 Scenic 组件中的代码以及多个界面框架中的集成代码。

性能

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

安全和隐私权注意事项

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

测试

在迁移的每个阶段,我们都会根据受影响功能的完整集成测试覆盖率来控制过渡。由于 Root Presenter 历来缺少此类覆盖率,因此这应该会使界面堆栈的覆盖率整体提升。

文档

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

缺点、替代方案和未知情况

这是一项需要数个季度才能完成的复杂迁移,需要投入大量工程资源才能完成。

不进行任何操作

我们会在所有使用该旧版功能的产品的生命周期内继续维护该旧版功能。由于平台的其余部分不断变化,并且缺乏全面的测试,因此过去这项维护工作非常繁重。多个界面堆栈也会造成混淆,导致无法确定给定产品上实际运行的代码。虽然迁移成本很高,但随着时间的推移,维持现状将需要付出更多努力,并且会导致效果变差和工程速度降低。

先过渡到 Flatland

这种方法需要进行大量工作才能向 Root Presenter 添加 Flatland 支持。由于此类代码缺乏全面的测试覆盖率,因此存在风险,并且需要大量的废弃工作。

在先技术和参考文档