RFC-0182:淘汰 config-data | |
---|---|
狀態 | 已接受 |
區域 |
|
說明 | 意圖淘汰舊版機制,以在存放區之間的元件之間提供/使用設定檔 |
問題 | |
變更 | |
作者 | |
審查人員 | |
提交日期 (年/月) | 2022-06-30 |
審查日期 (年/月) | 2022-08-15 |
摘要
本 RFC 建議如下:
- 將
[config-data]
機制宣告為已淘汰。 - 為現有用途建立許可清單。
- 一段時間過後,請將
config-data
的現有用法替換為其他更實用的解決方案。 - 最終從 Fuchsia 移除對
config-data
的支援。
提振精神
這項 RFC 的立即目標是針對現有 config-data
用量建立許可清單,建立概略的共識,並且偏好不要擴充上述許可清單。與此立即目標無關的資訊,將可在各方相關人員依要求提供額外的背景資訊。
[config-data]
是一種設定檔機制,可在執行階段讓該元件的命名空間中取得特定檔案,藉此改變封裝元件的行為。
config-data
會使用目標元件的套件名稱不強制執行的合約或慣例來建立「遠處恐怖動作」。這會造成問題,因為套件名稱並不實用,因為套件名稱可以成為 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 blob)。 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 不會引進任何新的設定機制,也就是系統中已存有用於設定設定資料的替代方案,也已通過他們專屬的安全性審查。元件作者在設計或變更安全性相關功能的設定時,應先瞭解安全性。
隱私權注意事項
這個 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 遷移完成後才開始執行這類工作,但我們應該先確認並停止迴歸問題。
在遷移作業有專屬人力配置的時間之前,建議您在一個工作天內審查並核准許可清單內容,例如支援重構。
缺點、替代方案和未知
結構化設定是全新且不斷演進的機制。比方說,尚未實作呈現設定所需的部分功能 (例如其他資料類型)。
功能轉送功能目前不受平台版本管理的影響。我們打算建構在 ABI 修訂版本上調節能力路徑的支援,但這個機制尚未設計。