RFC-0092:工作階段 | |
---|---|
狀態 | 已接受 |
區域 |
|
說明 | 定義工作階段元件的角色。 |
Gerrit 變更 | |
作者 | |
審查人員 | |
提交日期 (年-月-日) | 2021-04-08 |
審查日期 (年-月-日) | 2021-05-05 |
摘要
本文說明 Fuchsia 工作階段的角色和職責。
工作階段是元件。每個 Fuchsia 產品都會在工作階段中建立使用者體驗。舉例來說,工作站工作階段會將元件例項化,以便處理輸入內容、設定 Scenic 場景圖表,以及轉譯 UI。
工作階段元件提供建立產品使用者體驗所需的所有功能,因此通常是產品中權限最高的非平台元件。因此,工作階段元件可做為 Fuchsia 平台與使用 Fuchsia 建構的產品之間的界線。session_manager
是工作階段的父項元件,可公開開發人員用來控制工作階段的偵錯通訊協定。產品子類 (例如 product_eng
、product_userdebug
) 可能會產生同一工作階段的不同變種版本。
這份文件的用意是確認自 Modular Framework
已淘汰以來所做的設計決策。
提振精神
Fuchsia 平台旨在支援多項產品。這些產品由產品專屬和平台元件組成。特定產品的元件必須位於元件執行個體樹狀結構中的某處。這個工作階段是驅動使用者體驗的特定產品元件執行個體樹狀結構的根目錄。
工作階段可做為 Fuchsia 平台和產品之間的界線。因此,您可以利用這個工作階段改善產品開發週期。舉例來說,您可以銷毀工作階段並重新建立,以「重新啟動」產品的使用者體驗。
設計
本節將概述 Fuchsia 工作階段的目前設計,並強調目前設計與預期的長期設計有何不同。替代方案一節將概略說明一些潛在的長期方法。
啟動
core
是不可執行的元件,可為各產品提供一致的功能。core
是 session_manager
的父項。session_manager
會在 startup
連線至 session_manager
公開的 fuchsia.sessionmanager/Startup
通訊協定時,以回應方式例項化。
session_manager
會從其 /config/data
中位於設定檔的初始啟動工作階段讀取資料。接著,它會將工作階段例項化為動態 collection
中的子項。雖然工作階段位於集合中,但這個集合最多只會存在一個工作階段元件。也就是說,所有工作階段都會收到相同的功能組合,因為提供的功能組合不會因產品而異。如要進一步瞭解相關資訊,請參閱「Session Manager 設定」。
然後,工作階段會將自身的產品專屬元件階層例項化。即使是簡單的產品,工作階段也會負擔許多責任。舉例來說,它會設定場景圖表、連接輸入內容、整合無障礙功能等等。
功能和元件
工作階段會使用提供的功能,將所需產品體驗的元件樹狀結構例項化。工作階段必須提供工作階段元件階層中使用的所有平台功能。
即使功能僅適用於單一類別的產品,Fuchsia 平台也必須仔細考量要提供給工作階段的功能。目標是提供產品所需的控管和彈性,同時維持各產品一致的值得信賴平台。
舉例來說,如果產品有螢幕,Fuchsia 平台可能會決定為工作階段提供與螢幕互動的能力,然後讓工作階段負責例項化圖形子系統 (例如 Scenic)。這麼做可讓工作階段享有更多彈性和控管能力,但也讓 Fuchsia 平台更難發展:如果 Fuchsia 平台提供工作階段所需的建構 Scenic 所需的功能,那麼工作階段也能自行建立 Scenic 替代品。如果有足夠的產品定義自己的圖形通訊協定,則「圖形元件」只會在具有相符圖形通訊協定的系統上執行。此外,由於任何產品都能夠規避場景圖表,因此平台無法再提供場景圖表保證。
Scenic 目前會在 appmgr
下以「v1」元件形式例項化。當 Scenic 遷移至「v2」(component_manager
) 元件階層時,您必須決定要將其例項化到元件階層的哪個位置。
如要判斷是否應在工作階段中例項化元件,請考慮以下問題:「與此能力的互動是否應在各產品中保持一致?」舉例來說,產品應能選擇是否需要圖像,但如果需要圖像,則應使用 Scenic。同樣地,產品應能決定支援哪些類型的輸入裝置,但應使用輸入管道接收來自上述裝置的事件。這表示 Scenic 和輸入管道都應可由產品設定,但應在工作階段外部建立例項,因為這些元件需要的功能具有特殊權限。
在目前的架構中,基於實際原因 (例如生命週期管理、缺乏 .cml
可設定性等),部分元件預計會保留在工作階段中。Fuchsia 中有一些持續進行的努力,這些努力會引入其他平台可設定性機制,讓許多這些平台元件能夠再次在工作階段外部建立:
- 驅動程式已在工作階段外部化身,但並未在所有 Fuchsia 產品中保持靜態。
- 您需要根據安全性情境切換核心領域中定義的功能,例如為使用者版本的儲存空間啟用元件執行個體 ID 強制執行。
- 目前核心領域中已有溫度記錄器元件,但只有透過 RFC-0089 定義的機制,才能將該元件納入特定主機板。
以下是應在工作階段中明確例項化的一些元件範例:
- 圖形呈現 (「殼層」) 元件。
- 直接影響使用者體驗的元件 (例如影片播放器、終端機等)。
實作
session_manager
元件已實作,可在 session_manager 目錄中找到。
您可以在範例中找到一些簡單的工作階段範例。
您可以在 tiles-session 中找到參考 Fuchsia 產品使用的工作階段。
成效
工作階段是第一個例項化的產品擁有者元件,但許多平台元件會在工作階段元件之前例項化。
安全性考量
session_manager
會為工作階段提供所有必要功能,以便將產品使用者體驗例項化。所有工作階段都會從 session_manager
收到相同的功能組合。這個集合包含多種功能。不過,與在未遷移至使用工作階段的產品設定 (即使用 Modular Framework
的產品) 上執行的元件相比,工作階段可用的功能集較少,且更容易進行稽核。
請務必讓工作階段提供的功能通過安全性審查。Fuchsia 團隊不太可能在日後對所有工作階段進行徹底的安全性審查。因此,從平台的角度來看,工作階段的安全性在很大程度上取決於為工作階段提供的功能組合。
隱私權注意事項
session_manager
只會儲存目前工作階段的網址,而這可能會記錄下來。這項功能是對「模組化架構」的改善,該架構可管理使用者啟動的元件。
每個工作階段都需要進行完整的隱私權審查。
測試
產品擁有者需要工具來測試及偵錯工作階段。
我們會建立著重於滿足工作階段開發人員需求的測試架構。這個架構可讓開發人員測試工作階段元件階層的設定,並驗證工作階段中元件之間的互動。
開發人員可以透過 ffx
指令與執行中的工作階段互動。舉例來說,ffx session restart
會指示 session_manager
銷毀及重新建立工作階段。
說明文件
根據 RFC-194,概念說明文件已遭移除。
//src/session
中的每個二進位檔和程式庫也包含說明其用途的 README。
缺點、替代方案和未知事項
平台是工作階段的子項
工作階段和 core
之間的關係可以反轉,例如 core
是工作階段的子項。這樣一來,產品就能完全控制系統的設定方式,但代價是犧牲穩定的平台基礎。
工作階段管理員設定
session_manager
設定目前只會切換在啟動期間要例項化哪個工作階段元件。session_manager.cml
沒有差異,因此每個工作階段都提供相同的功能組合。在理想情況下,工作階段管理員設定會將提供的通訊協定數量降到最低。