RFC-0092:会话 | |
---|---|
状态 | 已接受 |
领域 |
|
说明 | 定义会话组件的角色。 |
Gerrit 更改 | |
作者 | |
审核人 | |
提交日期(年-月-日) | 2021-04-08 |
审核日期(年-月-日) | 2021-05-05 |
总结
本文档介绍了 Fuchsia 会话的角色和职责。
会话是一个组件。每个 Fuchsia 产品都在一个会话中构建其用户体验。例如,工作站会话会实例化组件来处理输入、设置景观场景图并渲染其界面。
会话组件提供了打造产品用户体验所需的所有功能,因此通常是产品中权限最高的非平台组件。因此,会话组件充当 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 平台可能会决定为会话提供与屏幕交互的功能,然后让会话负责实例化图形子系统(例如,风景)。 这为会话提供了极大的灵活性和可控性,但也增加了 Fuchsia 平台演进的难度:如果 Fuchsia 平台为会话提供实例化 Views 所需的功能,则也让会话能够创建自己的 Views 替代品。如果足够多的产品定义了自己的图形协议,则“图形组件”只会在具有匹配图形协议的系统上运行。此外,平台无法再提供关于场景图的保证,因为任何产品都可以规避它们。
Views 目前已实例化为 appmgr
下的“v1”组件。当 View 迁移到“v2”(component_manager
) 组件层次结构时,需要确定它在组件层次结构中的实例化位置。
如需确定是否应在会话内实例化某个组件,请考虑这样一个问题:“与此功能的互动是否应在各产品中保持一致”?例如,产品应该能够选择是否需要图形,但如果产品需要图形,则应使用“景观”。同样,产品应该能够决定其支持哪些类型的输入设备,但它应使用输入流水线来接收来自上述设备的事件。这意味着,Scape 和输入流水线都应可配置产品,但在会话外进行实例化,因为这些组件所需的功能具有特权。
在当前架构中,出于实际原因(例如,生命周期管理、缺少 .cml
可配置性等),计划将其中一些组件存在于会话中。Fuchsia 目前正在进行多项工作,引入了其他平台可配置性机制,使许多平台组件能够在会话之外再次进行实例化:
- 驱动程序已在会话之外实例化,并且在所有 Fuchsia 产品中并非静态。
- 在核心领域中定义的功能需要根据安全上下文进行切换,例如为 user build 中的存储空间启用组件实例 ID 强制执行。
- 目前,温度记录器组件存在于核心领域,但仅通过 RFC-0089 中定义的机制包含在某些开发板上。
下面列举了一些示例来说明应在会话内明确实例化的组件:
- 图形呈现(“Shell”)组件。
- 直接提供用户体验的组件(例如视频播放器、终端等)。
实现
session_manager
组件已实现,可在 session_manager 目录中找到。
您可以在示例中找到一些简单的示例会话。
参考 Fuchsia 产品使用的会话可在 tiles-session 中找到。
性能
会话是第一个实例化的由产品拥有的组件,但许多平台组件会先于会话组件进行实例化。
安全注意事项
session_manager
为会话提供了实例化产品用户体验所需的所有功能。所有会话从 session_manager
接收同一组 capability。此集合包含各种功能。但是,与为在尚未迁移为使用会话的产品配置(即使用 Modular Framework
的产品)上运行的组件提供的功能集相比,提供给会话的功能集更小、更易于审核。
为会话提供的功能必须经过安全审核。Fuchsia 团队未来不太可能对所有会话进行全面的安全审核。因此,从平台的角度来看,会话的安全性在很大程度上依赖于为会话提供的一组功能。
隐私注意事项
session_manager
仅存储当前会话的网址,该网址可能会被记录。这与“模块化框架”相比,后者用于管理用户启动的组件。
每次会话都需要经过全面的隐私权审核。
测试
产品所有者需要用于测试和调试会话的工具。
我们将创建一个侧重于会话开发者需求的测试框架。例如,此框架允许开发者测试其会话组件层次结构的设置,并验证会话中组件之间的交互。
开发者将能够通过 ffx
命令与正在运行的会话进行交互。例如,ffx session restart
会指示 session_manager
销毁并重新创建会话。
文档
根据 RFC-194,概念文档已被移除。
//src/session
中的每个二进制文件和库还包含一个说明其用途的 README 文件。
缺点、替代方案和未知情况
作为会话子级的平台
会话与 core
之间的关系可以反转,使 core
成为会话的子级。这样,产品就可以完全控制系统的配置方式,但代价是拥有稳定的平台基础。
会话管理器配置
session_manager
配置目前仅切换在启动期间要实例化的会话组件。session_manager.cml
没有变化,因此每个会话都提供同一组功能。理想情况下,会话管理器配置应最大限度地减少提供的协议数量。