FDomain 總覽

FDomain 是一種機制,可從開發主體機器與 Fuchsia 目標裝置上的 FIDL 服務通訊。這項通訊協定是為了取代 Overnet 通訊協定而設計。

Overnet 不同,FDomain 是較簡單的端對端通訊協定,Overnet 則是對核心控制代碼進行 Proxy 處理的對等互連網狀網路 (通常不完美)。從概念上來說,這代表目標上的一組控制代碼,可透過 FIDL 通訊協定提供的作業從遠端操控。

與 Overnet 的主要差異

  • 端對端:不提供自動探索或網狀網路的設施。
  • 通訊協定中沒有控制代碼:FDomain 通訊協定本身不會轉移核心控制代碼 (絕不會使用 resource 關鍵字)。而是由主機或 FDomain 分配的 32 位元 ID 參照控制代碼。
  • 主機端 ID 分配:為減少往返行程並啟用管道,主機可以為要求建立的新控制代碼分配 ID。
  • 雙向方法:所有方法都是雙向的,且會傳回錯誤,確保一律會將不明方法錯誤回報給用戶端,進而改善相容性處理方式。

FDomain 的用途為何?

FDomain 用於支援 ffx 工具的功能,以及潛在的自動整合測試。主體機器可藉此連線至 Fuchsia 目標裝置,並透過 FIDL 與服務通訊,方式與在目標裝置上執行的元件大致相同。

FDomain 提供下列作業:

  • 建立新的插座、管道、事件和事件配對。
  • 關閉、複製及更換控點。
  • 等待把手發出信號。
  • 對管道和通訊端執行讀取和寫入作業。

透過 Zircon 核心基本體 (例如管道和通訊端) 的抽象化,主機端工具可以使用 FIDL 與目標裝置通訊,不必在主體機器上完整模擬 Zircon 核心。

什麼是彈性繫結?

「彈性繫結」(請參閱 flex.rs 和相關目標 (例如 flex_fdomainflex_fidl) 中的實作項目) 提供條件式抽象層,可讓 Rust 程式碼編譯為:

  • 使用 FDomain:從主機進行遠端通訊時,使用 FDomain 類型 (例如 fdomain_client::Channel)。
  • 使用標準 FIDL:在裝置上使用標準 Fuchsia 和 Zircon 型別 (例如 ::fidl::Channel) 進行本機通訊。

這是透過條件式編譯 (例如 #[cfg(feature = "fdomain")]) 達成。透過使用 flex.rs 中定義的型別 (例如 DialectAsyncChannelAsyncSocket),程式庫可以編寫一次,並在裝置端使用,以及透過 FDomain 遠端驅動,而不必繫結至特定傳輸實作項目。