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_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 傳輸」。