元件會透過功能彼此互動。功能結合了資源存取權和一組權利,可提供存取控管機制,以及與資源互動的方式。Fuchsia 功能通常會存取底層的核心物件,這些物件會透過元件的命名空間提供。
元件只能透過命名空間中可探索的功能,以及收到的少數編號控制代碼,與系統和其他元件互動。
能力轉送
元件會在元件資訊清單中,宣告提供給系統的新功能,以及其他元件 (或架構) 提供的功能。元件架構會使用這些宣告填入命名空間。
如要在執行階段使用功能,也必須有從取用元件到供應商的有效功能路徑。由於功能通常會透過父項元件傳送至子項元件,因此父項元件在定義子項元件的沙箱時扮演重要角色。
部分能力類型會轉送至環境,而非個別元件執行個體。環境會設定架構的行為,適用於指派環境的領域。架構會存取並使用路由至環境的功能。元件例項無法在執行階段存取環境中的功能。
可用性功能可讓元件聲明預期能力可用的情況。
轉送術語
路由術語可分為下列類別:
- 聲明功能在元件、父項和子項之間的路由方式:
- 元件使用或提供的功能聲明:
use:針對可執行的元件,宣告這個元件在執行階段所需的功能。除非另有指定,否則功能會從parent轉送,且每個能力都必須有來自來源的有效路徑。capabilities:宣告這個元件提供的功能。這裡必須顯示self提供或公開的功能。 這些功能通常會對應至 <0x0A
偵測循環
元件架構會強制執行元件之間提供的功能不會形成週期。最簡單的週期範例是:元件從子項 A 提供能力給子項 B,並從 B 提供給 A,但沒有弱式選項。
偵測到以下時間的週期:
- 子項元件及其父項。
- 目前的元件及其子項。
目前的元件可執行下列動作:
use的功能,除非是提供給這些子項的功能。use父項的能力。expose的能力。
如果出現週期性行為,可以採取幾種策略來解決這個問題。
- 將其中一個連結標示為
dependency: "weak"。就週期偵測或關機順序而言,功能較弱不算依附元件。使用弱能力的元件應經過程式設計,確保弱能力不存在或消失時,元件仍能正常運作。 - 將其中一個元件分割為兩個較小的元件,且這兩個元件沒有週期。
- 反轉其中一個依附元件的順序。舉例來說,
A可以使用B的第二項能力,而不是使用A的功能。B方法是在A和B的資訊清單中新增能力,然後在A的資訊清單中新增use。
功能類型
可轉送的功能如下:
| 類型 | 說明 | 轉送至 |
|---|---|---|
protocol |
檔案系統節點,用於開啟由 FIDL 通訊協定支援的管道。 | 元件 |
service |
用於開啟其中一個服務例項管道的檔案系統目錄。 | 元件 |
directory |
檔案系統目錄。 | 元件 |
storage |
可寫入的檔案系統目錄,與使用該目錄的元件隔離。 | 元件 |
dictionary |
將其他功能組合在一起的功能。 | 元件 |
resolver |
這項能力在環境中註冊後,會導致具有特定網址配置的元件透過該解析器解析。 | 環境 |
runner |
這項能力在環境中註冊後,架構就能在啟動元件時使用該執行元件。 | 環境 |
範例
請參考下列範例,瞭解如何透過元件執行個體樹狀結構進行能力轉送:

在這個例子中:
echo元件執行個體會將fuchsia.Echo通訊協定做為其中一項已宣告的能力提供。echo_tool元件執行個體需要使用fuchsia.Echo通訊協定能力。
每個中介元件都會合作,明確將 fuchsia.Echo 從 echo 路由至 echo_tool:
echo會公開fuchsia.Echo,因此通訊協定會對父項services可見。selfservices會將子項echo的fuchsia.Echo公開給父項shell。shell從子項services向另一個子項tools提供fuchsia.Echo。tools提供fuchsia.Echo給子項echo_tool。parent
元件架構 會授予 echo_tool 的要求使用 fuchsia.Echo,因為系統已找到提供該通訊協定能力的元件有效路徑。
如要進一步瞭解元件在執行階段如何連結至功能,請參閱「通訊協定開啟的生命週期」。