RFC-0182:淘汰 config-data | |
---|---|
狀態 | 已接受 |
區域 |
|
說明 | 意圖淘汰舊機制,以便在各存放區的元件之間提供/使用設定檔 |
問題 | |
Gerrit 變更 | |
作者 | |
審查人員 | |
提交日期 (年-月-日) | 2022-06-30 |
審查日期 (年-月-日) | 2022-08-15 |
摘要
本 RFC 建議:
- 宣告
[config-data]
機制已淘汰。 - 為現有用途建立許可清單。
- 隨著時間推移,將現有的
config-data
用法替換為其他更優質的解決方案。 - 最終從 Fuchsia 中移除對
config-data
的支援。
提振精神
這份 RFC 的當前目標,是建立大致的共識,為現有的 config-data
用法建立許可清單,並偏好不擴充該許可清單。我們會提供與這項立即目標無關的其他資訊,以提供額外背景資訊,並滿足各方利益相關者的請求。
[config-data]
是設定檔的機制,可在執行階段提供該元件命名空間中的特定檔案,藉此調節已封裝元件的行為。
config-data
會使用未強制執行的契約或慣例,針對目標元件的套件名稱建立「遠端詭異動作」。這會造成問題,因為套件名稱無法做為穩定的 ID,無法成為 Fuchsia SDK 途徑的一部分、使用 SDK 進行版本控制,以及隨著時間演進,例如宣告支援的視窗和允許軟性轉換。經驗證明,以套件名稱為基礎的契約會導致不穩定的執行階段假設,且維護成本高昂。
此外,由於 config-data
會將開發人員套件的內容與含有設定檔的基礎套件內容混合,因此會造成令人困惑的開發人員體驗,開發人員會推送套件的新修訂版本,但在執行階段看到舊設定檔。開發人員經常會詢問,為何他們推送套件的更新版本,但卻在 /config/data
下看到過時的檔案,而沒有意識到這些檔案來自不同的套件。向開發人員說明這項行為時,必須向他們揭露平台實作細節,例如「基本套件」,這表示抽象化失敗,因此不建議這麼做。更不用說,這類週期性工作流程的不一致性會導致工作效率下降。
config-data
非常適合解決以下問題:在產品組裝的不同階段,參與者需要影響不受直接控管的元件。使用 config-data
時,來自某個位置 (存放區、建構系統等) 的設定值可用於調節來自其他位置的元件行為。
在某些情況下,元件和設定具有相同的來源,但使用者仍偏好使用 config-data
做為整合點。這可讓使用者產生一個套件,並將不同的設定值側載至此套件所包含的元件。當產生多個套件的成本很高時,這項功能就很實用,例如每個套件版本都需要個別上傳至後續整合點。
目前有許多 config-data
的替代方案。這些方法包括根據目錄功能、結構化設定、透過通訊協定功能提供設定,以及封裝設定檔與使用這些檔案的元件,來轉送設定目錄。
雖然淘汰 config-data
的現有用途和功能本身並非當務之急,但我們應將新用途導向新式解決方案,並促使現有用途的擁有者遷移至新式替代方案。
在這種情況下,最佳做法是為 config_data()
GN 規則建立許可清單,並使用現有的用法進行初始化。隨著時間推移,許可清單的項目數量預計會趨近於零,但如果目前的替代方案不適用,則可將新用途加入許可清單。當新的用途獲得核准,允許變更時,應事先說明原因,以減少程式碼審查的流失率。
相關人員
- 元件架構團隊:建立
config-data
及其目前的替代方案。 - 建構團隊:
config-data
建構時間邏輯的維護者。 - 軟體組合團隊:
config-data
組合時間邏輯的維護人員。 config-data
目前的使用者,涵蓋多個團隊。
協助人員:
- hjfreyer@google.com
審查者:
- aaronwood@google.com
- adamperry@google.com
- awolter@google.com
- ddorwin@google.com
- fmil@google.com
- geb@google.com
- jsankey@google.com
- kpozin@google.com
- wez@google.com
- yaar@google.com
- ypomortsev@google.com
社會化:
此 RFC 草稿在發布前已由元件架構和軟體組合技術主管審查。
背景
config-data
的運作方式
在舊版 appmgr
(又稱為 CFv1) 中,config-data
是透過將已啟動的元件套件名稱與 config-data
基本套件中的子目錄進行比對來實作。如果找到相符項目,系統會在啟動的元件命名空間中,於路徑 /config/data
下提供相符的子目錄。
定義 config-data
的方式是指定要提供的檔案、在元件傳入命名空間中提供這些檔案的路徑 (依慣例,在 /config/data
下方),以及一或多個元件的套件名稱,這些元件應在這些路徑中提供這些檔案。
舉例來說,元件可能會要求使用設定檔,如下所示:
{
use: [
{
directory: "config-data",
rights: [ "r*" ],
path: "/config/data",
},
],
}
這表示元件要求嵌入者提供名為「config-data」的唯讀目錄能力,該功能會在 /config/data
的架構中顯示,讓依賴 /config/data
的現有程式碼不必經過修改即可運作。
父項元件或領域可能會有以下宣告:
{
children: [
{
name: "font-provider",
url: "fuchsia-pkg://fuchsia.com/fonts#meta/font-provider.cm",
},
],
offer: [
{
directory: "config-data",
from: "parent",
to: [ "#font-provider" ],
subdir: "fonts",
},
],
}
這個方法會從父項接受包含多個子目錄的 config-data
,並將包含字型提供者設定資料的 example
子目錄,轉送至該元件。
config-data
的內容可能來自以下建構定義:
import("//build/config.gni")
config_data("example_config_data") {
for_pkg = "example"
sources = [
"file1.dat",
"file2.dat",
...
]
outputs = [ "{{source_file_part}}" ]
}
上方的目標和其他類似目標會由建構系統收集,以形成名為 config-data
的套件內容。接著,專門設計的路由規則會將 config-data
套件的所有內容,以上述 for_pkg
參數所示的子目錄形式,路由至核心領域和其他位置,並進一步將這些內容分派給會使用這些內容的各種元件。
config-data
目前的使用方式
config-data
具備多種用途。以下列舉幾個說明範例:
- ICU 資料和 tzdata:ICU 程式庫的資料,特別是時區資料 (「tzdata」),會在執行階段以
config-data
的形式提供。在 Fuchsia 平台來源中定義這些資料檔案的單一來源,並將檔案提供給來自不同來源 (例如 Chromium、Flutter、Google 內部存放區等) 的元件,以確保只使用這些檔案的單一修訂版本。這可達成一致性 (例如,所有元件都同意使用單一 tzdata,不論來源為何) 和效率 (所有元件都共用相同的 ICU 球狀結構,不論建構時間或地點為何)。 buildinfo
和hwinfo
元件的值會以config-data
的形式提供。這些元件是使用平台原始碼建構,但可能需要由產品設定。目前config-data
是這項設定機制的服務。- 在平台來源中定義的「設定」UI 元件,可設定為在不同裝置上公開不同的硬體切換按鈕。舉例來說,SetUI 在 Astro 和 Sherlock 裝置上的行為不同,目前由
config-data
管理。 - 平台字型供應器元件可設定為提供特定產品的字型。字型檔案和說明其屬性的資訊清單會以
config-data
的形式提供,並在樹狀結構外產品組合中新增。
設計與導入
我們會建立建構時間回歸停止功能,以免未經明確核准就使用 config-data
。系統會檢查現有用法的許可清單,並由 OWNERS
檔案管理許可清單的變更。我們會指派元件架構團隊的擁有者,代表 fuchsia.git,以及使用 config-data
代表其用法的花瓣。代表將負責管理各自的許可清單項目,例如協助進行重構或指定燒毀作業。
實作回歸停止點的方式並不重要。常見且可能的實作策略是變更 config-data
GN 範本,在目標上新增依附於設定的顯示清單。值得注意的是,這項功能只涵蓋樹狀結構內的用法,但限制樹狀結構外產品組合中 config-data
的新用法也相當重要。我們也可能會在這裡與 PDK 團隊合作,開發適當的機制。
深入探討 config-data
的替代方案不在本 RFC 的討論範圍內。參考這些替代方案時,請詳閱上方連結的說明文件。
建立提供元件設定的最佳做法,或為 config-data
以外的遷移指南提供種子,不在本 RFC 的討論範圍內。我們正在製作這類文件,並會與此 RFC 分開發布。
成效
config-data
套件的特殊且有趣之處在於,所有檔案都會封裝在 meta/
路徑下。這表示檔案會封存至 meta.far
檔案。儲存在基礎 blobfs 檔案系統中時,磁碟上的檔案大小會四捨五入至區塊大小,通常為 8KiB。將設定檔一起封存後,便可省去捨入所產生的額外負擔。這點很重要,因為設定檔通常數量眾多且體積較小,因此總的額外負擔可能會大於這些檔案的壓縮大小總和。
使用其他解決方案時,如果儲存空間很重要,請使用相同或等同的技術,確保儲存空間效率一致。
人體工學
config-data
的替代方案具有更好的人因設計,最重要的原因是這些替代方案不依賴以套件名稱為基礎的脆弱合約,也不依賴「遠端動作」。
回溯相容性
有時需要以軟性轉換方式,從 config-data
遷移至其他服務。在轉換期間,使用設定資料的元件必須能夠接受兩種輸入格式:config-data
和所選的替代方案。
安全性考量
這項 RFC 並未引入任何新的設定機制,我們用來取代 config-data 的所有機制都已存在於系統中,且已通過安全性審查。元件作者在設計或變更安全性相關功能的設定時,應諮詢安全性團隊。
隱私權注意事項
這份 RFC 並未引入任何新的設定機制,我們用來取代設定資料的所有機制都已存在於系統中,且已通過隱私權審查。元件作者在設計或變更隱私權敏感功能的設定時,應諮詢隱私權團隊。
測試
config-data
提供的替代方案都已建立測試最佳做法。如需特定功能的測試資訊,請參閱說明文件。舉例來說,請參閱使用 Realm Builder 測試結構化設定的指南。只要按照下列步驟操作,就能輕鬆取代測試中的結構化設定值:
realm_builder.SetConfigValue(child_name, key, value_for_test);
當我們需要將設定資料以檔案形式提供給測試中的元件 (例如在整合測試中) 時,可以將檔案與測試一併封裝,然後從測試元件 (位於測試領域根目錄) 將檔案以資料目錄形式路由至測試中的元件。例如:
{
....
capabilities: [
{
directory: "test_config",
rights: [ "r*" ],
path: "/test_config",
},
],
children: [
{
name: "component_under_test",
...
},
],
offer: [
{
directory: "test_config",
from: "self",
as: "config",
},
],
}
說明文件
為支援從 config-data
遷移,我們會提供遷移指南。遷移指南可協助開發人員選擇最適合其用途的替代方案,並提供其他說明文件。
關於人力和流失率的附註
接受此 RFC 不會對 config-data
現有使用者施加任何要求,要求他們遷移至新式替代方案。如果您已指派遷移工作,則應有核心遷移團隊負責執行大部分工作。作者建議,在 CFv2 遷移完成前,不要開始這類工作,但我們應該加快腳步,並完成回歸停止點。
在有專人負責遷移作業之前,允許清單的更新作業 (例如支援重構) 應在 1 個工作天內審查並核准。
缺點、替代方案和未知事項
結構化設定是一種新機制,仍在不斷改進中。舉例來說,有些用於表達設定所需的功能 (例如其他資料類型) 尚未實作。
能力路由目前不受平台版本控制的影響。我們計劃支援在 ABI 修訂版本中調節能力路徑,但這項機制尚未設計完成。