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 使用,而不受限於特定傳輸實作。
傳輸
FDomain 可根據環境和連線需求,透過不同的傳輸機制執行。
網路傳輸 (SSH)
根據預設,FDomain 會透過 SSH 工作階段傳送流量,透過 TCP/IP 網路連線至目標。主機端 FFX 用戶端會與目標建立 SSH 連線、透過連線建立 FIDL 要求通道,並與遠端控制服務 (RCS) 通訊。這種傳輸方式速度很快,且支援所有開發人員工作流程,包括高頻寬套件服務。
USB 傳輸 (VSOCK)
FDomain 也可以使用 USB VSOCK 通訊協定 (使用 usb: 位址),透過 USB 連線執行。這項傳輸方式提供可靠的高頻寬連線,無須設定網路。主機端的 FFX 用戶端會透過 USB 連結,直接與目標的 VSOCK Daemon 通訊。由於 USB 裝置支援主動匯流排列舉,FFX 會自動探索並連線至這些裝置,無須手動介入子工具。
UART 傳輸 (序列)
FDomain 也可以透過實體序列埠 (UART) 執行,讓您與沒有網路連線的裝置互動及偵錯。
如需詳細的設定操作說明、探索工作流程、實作詳細資料和 UART 傳輸指令,請參閱「UART 傳輸」。