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
的父级。系统会在响应 startup
连接到 session_manager
公开的 fuchsia.sessionmanager/Startup
协议时实例化 session_manager
。
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 强制执行。
- 温度记录器组件目前存在于核心领域,但仅通过 RFC-0089 中定义的机制包含在某些开发板上。
以下是应在会话中明确实例化的组件示例:
- 图形界面(“shell”)组件。
- 直接有助于提升用户体验的组件(例如视频播放器、终端等)。
实现
session_manager
组件已实现,可在 session_manager 目录中找到。
您可以在示例中找到一些简单的会话示例。
您可以在 tiles-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
没有任何差异,因此每个会话都会提供一组相同的功能。理想情况下,会话管理器配置应尽可能减少提供的协议数量。