RFC-0092 - 会话

RFC-0092:会话
状态已接受
区域
  • 会话
说明

定义会话组件的角色。

Gerrit 变更
作者
审核人
提交日期(年-月-日)2021-04-08
审核日期(年-月-日)2021-05-05

摘要

本文档介绍了 Fuchsia 会话的角色和职责。

会话是一个组件。每个 Fuchsia 产品都会在会话中构建其用户体验。例如,工作站会话会实例化组件,以处理输入、设置 Scenic 场景图并渲染其界面。

会话组件具有创建产品用户体验所需的所有功能,因此通常是产品中权限最高的非平台组件。因此,会话组件充当 Fuchsia 平台与使用 Fuchsia 构建的产品之间的边界。session_manager 是会话的父级组件,并公开了开发者可用于控制会话的调试协议。商品款式/规格(例如 product_eng、product_userdebug)可能会导致同一会话出现不同的变体。

本文档旨在批准自 Modular Framework 弃用以来做出的设计决策。

动机

Fuchsia 平台旨在支持多种产品。这些产品由产品专用组件和平台组件组成。产品专用组件必须位于组件实例树中的某个位置。会话是驱动用户体验的产品特定组件实例树的根。

会话充当 Fuchsia 平台和产品之间的边界。因此,该会话可用于改进产品开发周期。例如,可以销毁并重新创建会话,以“重启”产品的用户体验。

设计

本部分概述了 Fuchsia 会话的当前设计,并重点介绍了当前设计并非预期长期设计的情况。“替代方案”部分简要介绍了一些可能的长期方法。

启动

core 是一个不可执行的组件,用于提供在各个产品中保持一致的功能。core 是 session_manager 的父级。 session_manager 会在 startup 连接到 session_manager 公开的 fuchsia.sessionmanager/Startup 协议时实例化。

session_manager 会从其 /config/data 中的配置文件读取初始启动会话。然后,它会在动态 collection 中将该会话实例化为子级。虽然会话位于集合中,但此集合中最多只能有一个会话组件。这意味着所有会话都会获得相同的功能集,因为提供的功能集不会因产品而异。如需了解详情,请参阅会话管理器配置。

然后,会话会实例化其自己的产品专用组件层次结构。 即使对于简单的产品,会话最终也会承担很多责任。 例如,它会配置场景图、连接输入、集成无障碍功能等。

功能和组件

会话使用其提供的功能来实例化所需产品体验所需的组件树。必须为会话提供会话组件层次结构中使用的所有平台功能。

Fuchsia 平台必须仔细考虑向会话提供的功能,即使这些功能特定于单个产品类别也是如此。我们的目标是为产品提供所需的控制力和灵活性,同时维护一个在各个产品中保持一致的可信平台。

例如,考虑带显示屏的产品。Fuchsia 平台可能会决定为会话提供与显示屏交互的功能,然后让会话负责实例化图形子系统(例如 Scenic)。 这为会话提供了很大的灵活性和控制力,但也使 Fuchsia 平台更难演进:如果 Fuchsia 平台为会话提供了实例化 Scenic 所需的功能,它也会使会话能够创建自己的 Scenic 替代项。如果有足够多的产品定义了自己的图形协议,则“图形组件”将仅在具有匹配图形协议的系统上运行。此外,平台无法再保证场景图,因为任何产品都可以绕过它们。

Scenic 目前在 appmgr 下实例化为“v1”组件。将 Scenic 迁移到“v2”(component_manager) 组件层次结构时,需要决定在组件层次结构中的哪个位置实例化它。

如需确定是否应在会话中实例化某个组件,请考虑以下问题:“与此功能进行的互动是否应在各个产品中保持一致”?例如,产品应该能够选择是否需要图形,但如果需要图形,则应使用 Scenic。 同样,产品应该能够决定其支持的输入设备类型,但应使用输入流水线从这些设备接收事件。这意味着 Scenic 和输入流水线都应可由产品配置,但应在会话之外实例化,因为这些组件所需的功能具有特权。

在当前架构中,出于实际原因(例如生命周期管理、缺乏 .cml 可配置性等),其中一些组件计划在会话中运行。Fuchsia 正在开展多项工作,以引入其他平台可配置性机制,从而使许多这些平台组件能够再次在会话之外实例化:

  • 驱动程序已在会话之外实例化,但在所有 Fuchsia 产品中并非静态。
  • 核心领域中定义的功能需要根据安全上下文进行切换,例如在用户 build 上为存储启用组件实例 ID 强制执行。
  • temperature-logger 组件目前存在于核心领域中,但仅通过 RFC-0089 中定义的机制包含在某些开发板上。

以下是一些应在会话中明确实例化的组件示例:

  • 图形呈现(“shell”)组件。
  • 直接影响用户体验的组件(例如视频播放器、终端等)。

实现

session_manager 组件已实现,可在 session_manager 目录中找到。

您可以在示例中找到一些简单的示例会话。

您可以在 workbench_session 和 terminal_session 中找到参考 Fuchsia 产品使用的会话。

性能

会话是第一个被实例化的产品自有组件,但许多平台组件会在会话组件之前实例化。

安全注意事项

session_manager 为会话提供实例化产品用户体验所需的所有功能。所有会话都会从 session_manager 收到同一组功能。此集合包含各种功能。不过,与在尚未迁移到使用会话的产品配置(即使用 Modular Framework 的产品)上运行的组件相比,会话可用的功能集更小,也更易于审核。

请务必确保提供给会话的功能通过安全审核。Fuchsia 团队未来不太可能对所有会话进行全面的安全审核。因此,从平台的角度来看,会话的安全性在很大程度上取决于为会话提供的一组功能。

隐私注意事项

session_manager 仅存储当前会话的网址,该网址可能会被记录。这是对模块化框架的改进,该框架管理由用户启动的组件。

每个会话都需要进行全面的隐私权审核。

测试

产品所有者需要工具来测试和调试其会话。

我们将创建一个专注于会话开发者需求的测试框架。借助此框架,开发者可以测试会话组件层次结构的设置,并验证会话中组件之间的交互。

开发者将能够通过 ffx 命令与正在运行的会话进行交互。 例如,ffx session restart 会指示 session_manager 销毁并重新创建会话。

文档

根据 RFC-194,概念文档已被移除。

//src/session 中的每个二进制文件和库也都包含一个 README 文件,用于说明其用途。

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

平台作为会话的子级

会话与 core 之间的关系可以反转,使 core 成为会话的子级。这样一来,产品就可以完全控制系统的配置方式,但代价是牺牲稳定的平台基础。

会话管理器配置

session_manager 配置目前仅切换在启动期间实例化哪个会话组件。session_manager.cml 中没有差异,因此每个会话都提供相同的功能集。理想情况下,会话管理器配置应尽量减少提供的协议数量。

在先技术和参考资料