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_fdomain 和 flex_fidl 等相关目标)提供了一个条件抽象层,允许将 Rust 代码编译为:
- 使用 FDomain:使用 FDomain 类型(如
fdomain_client::Channel)从宿主机进行远程通信。 - 使用标准 FIDL:使用标准 Fuchsia 和 Zircon 类型(例如
::fidl::Channel)在设备上进行本地通信。
这是通过条件编译(例如 #[cfg(feature = "fdomain")])实现的。通过使用 flex.rs 中定义的类型(例如 Dialect、AsyncChannel 和 AsyncSocket),库可以编写一次,并通过 FDomain 在设备上使用和远程驱动,而无需绑定到特定的传输实现。