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_fdomain 和 flex_fidl) 中的實作項目) 提供條件式抽象層,可讓 Rust 程式碼編譯為:
- 使用 FDomain:從主機進行遠端通訊時,使用 FDomain 類型 (例如
fdomain_client::Channel)。 - 使用標準 FIDL:在裝置上使用標準 Fuchsia 和 Zircon 型別 (例如
::fidl::Channel) 進行本機通訊。
這是透過條件式編譯 (例如 #[cfg(feature = "fdomain")]) 達成。透過使用 flex.rs 中定義的型別 (例如 Dialect、AsyncChannel 和 AsyncSocket),程式庫可以編寫一次,並在裝置端使用,以及透過 FDomain 遠端驅動,而不必繫結至特定傳輸實作項目。