本文說明元件管理工具如何與個別元件例項互動,以管理元件的生命週期。
生命週期狀態
元件例項會經歷下列主要生命週期狀態:
元件執行個體可能會在儲存媒體上保留隔離的永久狀態,以便在未執行時使用,有助於在重新啟動時維持連續性。
建立時間
建立元件執行個體的方法如下:
每個元件執行個體都有元件網址 (說明如何解析元件) 和路徑名稱 (從根目錄的路徑唯一識別執行個體)。詳情請參閱「元件 ID」。
已解決
解析元件執行個體時,系統會擷取指定元件網址的元件宣告。元件管理服務會找出環境中支援相符網址配置的元件解析器,藉此解析元件網址。開發人員可以使用 ffx component resolve 指令手動解決元件問題。
元件必須成功解析,才能啟動。
已開始
啟動元件執行個體會載入並執行元件的程式,並提供元件所需的存取權。
啟動元件執行個體最常見的原因,是另一個元件繫結至其中一個公開功能。開發人員也可以使用 ffx component start 指令手動啟動元件。
啟動後,元件執行個體會持續執行,直到停止為止。
已停止
停止元件執行個體會終止元件的程式,但會保留元件的持續性狀態。當元件的執行器定義的程式結束時,元件就會進入這個狀態。
元件架構可能會因下列原因停止元件執行個體:
- 元件即將遭到刪除。
- 系統正在關機。
元件可以實作生命週期處理常式 (範例),接收即將終止等事件的通知。請注意,在資源耗盡、當機或斷電等情況下,元件可能不會收到這些事件。
關機
元件管理服務會將元件執行個體的最終執行狀態設為關機,表示無法重新啟動,並發出訊號,指出執行個體可以安全地刪除。
已刪除
元件執行個體可能會透過下列方式終止:
- 在執行階段動態從集合中移除。如果元件是遭移除元件的子項,也會發生這種情況。
一旦銷毀,Component Manager 就會從元件拓撲中完全移除執行個體,包括所有持續性狀態。相同元件的新執行個體會各自擁有身分和狀態,與先前的所有執行個體不同。
生命週期動作
本節說明元件架構用來轉換元件執行個體生命週期狀態的常見動作。
裝訂
當元件執行個體 A 連線至 B 提供的某些能力時,就會繫結至另一個元件執行個體 B。A如果元件尚未執行,這會導致元件 B
啟動。
具體來說,A 可以透過兩種方式繫結至 B:
A會連線至其命名空間中的能力,該功能由B「公開」或「提供」。這是最常見的做法。A會繫結至fuchsia.component.Binder架構通訊協定,該通訊協定是由B公開或提供。與傳統能力不同,這個通訊協定是由元件架構實作。
停止訂餐
當元件架構決定關閉元件時,會依據元件及其子項的依附元件決定關閉順序。這項行為是遞迴的,也就是說,關閉元件會關閉該元件下的完整拓撲。
領域內的元件會依特定順序關閉,關閉順序取決於這些元件之間的強烈依附元件。元件之間的依附元件會形成有向無環圖 (DAG),且元件會依目標到來源的順序關閉。
依附元件圖表中會考量所有功能。功能預設會以強烈依附元件的形式提供,但用戶端可以指定 dependency: weak 來提供依附元件。
舉例來說,假設領域包含 A、B、C、D 等元件。我們提供以下優惠:
A強烈建議您B和C。B強烈建議提供C的能力。C弱式提供B的能力。
以下是相關領域的繪圖:
關機順序如下:
D和C沒有任何依附元件,因此可以按任意順序關閉。B即可在C後關閉。A即可在B後關閉。
弱依附元件
請注意,元件依附元件會形成 DAG,也就是沒有週期。也就是說,在上述範例中,C 無法強烈建議 A 提供能力。
不過,C 可以透過 dependency: "weak" 提供 A 能力。
弱依附元件不屬於依附元件 DAG,也不會影響關機順序。