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.rs 中的实现以及 flex_fdomainflex_fidl 等相关目标)提供了一个条件抽象层,允许将 Rust 代码编译为:

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

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