FDomain 概览

FDomain 是一种机制,用于从开发主机与 Fuchsia 目标设备上的 FIDL 服务进行通信。它旨在取代 Overnet 协议。

Overnet 是一个对等网状网络,用于代理内核句柄(通常不完美),而 FDomain 则是一个更简单的端点到端点协议。从概念上讲,它表示目标上的一组句柄,这些句柄可以通过 FIDL 协议提供的操作进行远程操作。

与 Overnet 的主要区别

  • 端点到端点:不提供自动发现或网状网络功能。
  • 协议中没有句柄:FDomain 协议本身不会传输内核句柄(从不使用 resource 关键字)。而是通过主机或 FDomain 分配的 32 位 ID 来引用句柄。
  • 主机端 ID 分配:为了减少往返次数并实现流水线,主机可以为请求创建的新句柄分配 ID。
  • 双向方法:所有方法都是双向的,并且会返回错误,从而确保未知方法错误始终会报告给客户端,从而改进兼容性处理。

如何使用 FDomain?

FDomain 用于支持 ffx 工具的功能,并可能支持自动化集成测试。它允许主机连接到 Fuchsia 目标设备,并通过 FIDL 与服务进行通信,其方式与在目标设备上运行的组件大致相同。

FDomain 提供以下操作:

  • 创建新的套接字、通道、事件和事件对。
  • 关闭、复制和替换标识名。
  • 等待句柄上的信号。
  • 在通道和套接字上执行读取和写入操作。

通过提供 Zircon 内核基元(如通道和套接字)的抽象,它允许主机端工具使用 FIDL 与目标设备通信,而无需在主机上完全模拟 Zircon 内核。

什么是 Flex 绑定?

“Flex 绑定”(请参阅 flex.rs 中的实现以及 flex_fdomain 和 flex_fidl 等相关目标)提供了一个条件抽象层,允许通过以下任一方式编译 Rust 代码:

  • 使用 FDomain:使用 FDomain 类型(例如 fdomain_client::Channel)从主机进行远程通信。
  • 使用标准 FIDL:使用标准 Fuchsia 和 Zircon 类型(例如 ::fidl::Channel)在设备上进行本地通信。

这是通过条件编译(例如 #[cfg(feature = "fdomain")])实现的。通过使用 flex.rs 中定义的类型(例如 Dialect、AsyncChannel 和 AsyncSocket),库可以编写一次,并在设备端和通过 FDomain 远程驱动,而无需绑定到特定的传输实现。

传输

FDomain 可以通过不同的传输机制运行,具体取决于环境和连接要求。

网络传输 (SSH)

默认情况下,FDomain 通过 SSH 会话隧道传输流量,从而通过 TCP/IP 网络连接到目标。主机端 FFX 客户端与目标建立 SSH 连接,通过该连接建立 FIDL 请求隧道,并与远程控制服务 (RCS) 通信。此传输方式速度很快,并且支持所有开发者工作流,包括高带宽软件包传送。

USB 传输 (VSOCK)

FDomain 还可以使用 USB VSOCK 协议(使用 usb: 地址)通过 USB 连接运行。 此传输方式可提供可靠的高带宽连接,而无需进行网络配置。主机端 FFX 客户端通过 USB 链路直接与目标的 VSOCK 守护程序通信。由于 USB 设备支持主动总线枚举,因此 FFX 会自动发现并连接到这些设备,而无需手动干预子工具。

UART 传输(串行)

FDomain 还可以通过物理串行端口 (UART) 运行,让您能够与没有网络连接的设备进行交互和调试。

如需详细了解 UART 传输的设置说明、发现工作流、实现细节和命令,请参阅 UART 传输。