RFC-0100 - 產品中繼資料

RFC-0100:產品中繼資料
狀態已接受
領域
  • 開發人員
說明

產品中繼資料的標準表示法

毛皮變化
作者
審查人員
提交日期 (年-月-日)2021-04-30
審查日期 (年-月-日)2021-06-02

摘要

Fuchsia 軟體開發套件 (SDK) 目前已推出的裝置名為 個人資料中繼資料 (在本文件中簡稱為中繼資料),其結構定義為 在 //build/sdk/meta/device_profile.json 中定義的。中繼資料的用途是 說明裝置可安裝的系統映像檔和套件我們 但發現結構定義不完整,需要翻新。另外 SDK 以外的來源,現在需要中繼資料,因此重要性也隨之增加。

這個 RFC 針對此資訊採用新的結構定義,做為 平台和工具,以及日後更新該架構的程序。

提振精神

目前中繼資料會與 SDK 一併提供。這個標籤目前包含 裝置的文字說明,以及供使用者使用的 URI 下載映像檔和套件資訊我們發現這項中繼資料 兩者都難以掌握最新資訊不完整卻無法使用。

工具最終會採用非官方慣例的圖片和套件,或 可能會變動的硬式編碼假設 (例如 下載內容)。這樣一來 會逐漸變換。

我們希望能解決這些問題。我們將指定正式的結構定義 中繼資料,以便工具使用。

如果我們發布的中繼資料正確且易於使用,SDK 使用者 他們可以選擇要刷新至裝置或開機的映像檔 搭載模擬器,但對 Fuchsia 基礎架構或 SDK 沒有實質幫助 團隊。SDK 開發人員擁有統一的可靠資料來源 向使用者提供產品資訊對於工具開發人員來說 瞭解他們如何使用這項資訊

更新簡易

中繼資料目前以硬式編碼的方式寫入 SDK 時,必須執行下列操作: 每次我們發布新圖片時手動更新。如此一來 或移除容易出錯的中繼資料這些資訊經常會下滑 版本更過時,甚至永遠不會新增。

實務上,因為 SDK 消費者無法仰賴中繼資料的準確性 提供的程式碼都會硬式編碼套件和映像檔的位置,如 以及其他巧妙的實作相關資訊 舉例來說,除了透過硬式編碼編寫網址之外,樹狀結構外模擬器 啟動作業仰賴系統中未記錄的 images.json 檔案 圖片。

本提案提供了新的中繼資料結構定義,預計對外提供 這些原則這樣會激勵我們進行更新。

完整度

現有的裝置中繼資料缺少重要詳細資料。舉例來說 刷新裝置需要分區名稱清單,以及檔案名稱 寫入這些分區這並非正式化,所以我們沒有 力求明確傳達訊息與執行閃光的工具如此一來 則難以提供穩定性 / 相容性保證

只要將結構定義缺少完整性與 更新中繼資料後,問題就更為複雜。舉例來說,假設 想確保能正常啟動的模擬器工具假設範例 使用與使用者想要執行的映像檔相同的架構。 在未嘗試啟動映像檔的情況下,工具應如何判斷其是否 特定位置的任何映像檔是否與特定架構相容? 更新結構定義後,我們就能擁有一組中繼資料 映像檔的架構及其位置但這項工具 為指定映像檔選擇正確的架構

本提案將概述中繼資料的初始結構定義,並 持續執行更新作業,確保更新與時俱進。

設計

為了提供實用且最新的資訊 產品 中繼資料 我們會採取以下做法:

  • 為中繼資料定義新的結構定義。
  • 定義更新該結構定義的程序。
  • 產生建構時符合該結構定義的中繼資料,以及 這類物件
  • 在我們的 SDK 版本中,發布符合該架構的中繼資料。 消耗的樹狀結構外電力
  • 提供標準工具和程式庫,以便使用中繼資料來刷新和 模擬工作流程

請注意,雖然在這裡定義初始結構定義,但我們允許演變 進行 API-Council 審查,不需額外的 RFC。

定義

本文中採用下列定義:

  • 「結構定義」是中繼資料機構的正式說明。
  • 中繼資料是指定結構定義的具體例項化。
  • 構件是指任何在中繼資料內經常參照的具體檔案或資料 特定內容
  • 資訊清單是包含成果清單的中繼資料。
  • 「映像檔」是指刷新實體裝置時所需的一組構件 或啟動模擬器
  • 套件是 Fuchsia 一般封裝的軟體發布單位 匯出為 Fuchsia ARchive (FAR) 檔案的格式。
  • 產品建構設定 這個檔案用於建立映像檔和套件
  • 產品套裝組合是一組圖片和套件, 建構產品
  • 目標 (裝置) 是一種實體或虛擬 Fuchsia 裝置,用於執行 產品。

我們會使用 JSON 來代表中繼資料。schemata 則是以 在 json-schema.org 定義的草稿 7 格式

Schemata

本章節詳細說明瞭初始規定和我們即將推出的異動 對應至結構定義

初始結構定義的需求

  1. 中繼資料必須有不重複的名稱或 ID。
  2. 中繼資料必須具有使用者可理解的說明。
  3. 中繼資料結構定義必須版本化。
  4. 中繼資料必須指定目標裝置硬體特性。在 其中必須包含:
    1. 目標 CPU 架構,目前為 arm64 或 x64。
  5. 中繼資料必須指定一或多個產品組合,每個組合都必須 包括:
    1. 專屬名稱。
    2. 使用者可理解的說明。
    3. 圖片組合。
    4. 套件組合。
  6. 中繼資料可以納入額外的產品中繼資料做為鍵/值組合 目的在於協助使用者選擇想要的產品。例如 中繼資料包括建構類型 (user 與 eng)、啟動類型 (一般 對比遭逮捕)。
  7. 圖片或套件組合必須:
    1. 指定一或多個基本 URI。
      1. URI 中繼資料必須允許使用者指定特定格式。適用對象 例如,URI 的存取權可能已封存 (tarball 或 zip) 或純文字。
      2. 使用這項中繼資料的 SDK 工具必須支援 gshttp(s)file URI 配置。需要 file URI 才能在本機存取。
      3. 如果 SDK 工具會使用這項中繼資料,就不得要求驗證 假使構件是可公開存取的
    2. 指定 Flash 中繼資料,並附上充分的詳細資料 透過 Fastboot 通訊協定佈建裝置
    3. 指定模擬器中繼資料,包含充分的資訊 詳細資料,在虛擬裝置上啟動映像檔。

漸進式結構定義更新

有幾項未來的結構定義發展方向。 例如:

  1. 實體硬體中繼資料可能包含裝置硬體功能,例如 以及螢幕、鍵盤或指標裝置等讀取資料
  2. 虛擬硬體中繼資料可能會指定虛擬裝置的特性 就足以佈建模擬器

為因應這種情況,結構定義是版本化的。版本是字串 每次新增或移除結構定義元素時就會更新。工具可以鎖定的目標 多種不同的結構定義版本,或使用者可能需要改用較舊版本 才能使用舊版 schemata

為簡化版本之間的轉換,我們提議靈活的剖析和 版本管理架構我們推出的版本化信封,可以 JSON 剖析。剖析工具可以讀取版本欄位,同時忽略 。這可讓工具為 每個支援的結構定義版本

我們建議使用隨機產生的每個結構定義檔案,分別建立版本 8 位數的十六進制數字,所有現有的數字不得重複 結構定義檔案為了避免碰撞,建議您 實作建構時間衝突偵測功能,防止意外重複 提交內容。

由於結構定義可能包含透過 $ref 設施提供的其他結構定義,因此我們建議 ,將結構定義版本附加到結構定義檔案名稱。這麼做 區分常見檔案的多個版本,例如 //build/sdk/meta/common.json,這麼做也會觸發版本重新計算作業 參照網址結構定義中

每項不相容的結構定義變更作業,例如新增或移除必填欄位 會觸發版本重新計算作業

我們允許透過 API 審查程序變更結構定義。 結構定義異動屬於「開發人員功能」專區。

實作

實作結構定義時,主要需新增結構定義 到 fuchsia.git 確定其接受 API 審查。這裡還有兩個 問題:中繼資料產生的位置為何?中繼資料在哪裡? ?

系統會一開始產生裝置中繼資料:

  • 這是 Fuchsia 版本 fuchsia.git 的一部分;
  • 在發布供外取用的圖片時一併發布和
  • 作為 SDK 發布項目的一部分

也可能會在其他位置 (尤其是圖片和套件) 產生 在 SDK 版本外發布。

ffx 工具將大量使用裝置中繼資料,而工具會使用這些資料 刷新裝置並啟動模擬器。由於我們會發布這個結構定義 使用 SDK, Fuchsia 樹狀結構外的工具也可能使用中繼資料: 不必遵守其他規範

透過這個方法,無論是在樹狀結構中或 樹狀結構外使用,系統會使用裝置中繼資料做為規格。

這些工作都需要設計超出此 RFC 範圍的設計。

常見結構定義

我們將以下列方式擴充 Common.json 結構定義的定義。不需要 由於這並非不相容的 變更。為求簡潔,以下省略了採用 common.json 中的現有定義。

為求簡潔,我們會省略檔案原始內容,並使用 ... 來表示 或遺漏任何資料

/** build/sdk/meta/common.json */
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "id": "http://fuchsia.com/schemas/sdk/common.json",
  "definitions": {
    ...,
    "envelope": {
      "description": "A versioned envelope.",
      "type": "object",
      "properties": {
        "version": {"$ref": "#/definitions/version"},
        "data": {
          "description": "The payload."
         }
      },
      "required": [
        "version",
        "data"
      ],
      "additionalProperties": false
    },
    "versioned_sdk_element": {
      "type": "object",
      "allOf": [
        {"$ref": "#/definitions/envelope"},
        {
          "type": "object",
          "properties": {
            "data": {
              "oneOf": [
                {"$ref": "#/definitions/sdk_element"}
              ]
            }
          }
        }
      ]
    },
    "version": {
      "description": "An opaque version string. The string may include any characters. Tools must not attempt to draw any conclusions about inter version compatibility other than the version 'X' manifest complies with the version 'X' of the schema and is therefore parsable by the version 'X' parser. There are no guarantees, for example, a parser for version 'B' may be able to parse a JSON document versioned 'A'.",
      "type": "string",
      "minLength": 1
    },
  }
}

請注意,因為這個結構定義定義了我們使用的結構定義版本 名稱無法輕易變更工具必須讀取符合此規則的檔案 以便瞭解信封的 JSON

裝置

同一部裝置上可能會安裝多張圖片,因此我們會分解裝置 硬體規格裝置硬體 規格有兩個用途

  1. 其說明執行映像檔的最低硬體需求。
  2. 指定專為執行映像檔而建立的虛擬 (模擬) 裝置。

我們針對實體和虛擬裝置推出兩個新版本的 SDK 元素。

舞出新方向

目前我們只關注實體的 CPU 架構 裝置。日後的新版 結構定義。為了提供完整範例 以下定義結合信封結構定義與 sdk_element 結構定義1

/** build/sdk/meta/physical_device-c906d79c.json */
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "id": "http://fuchsia.com/schemas/sdk/physical_device-c906d79c.json",
  "description": "A physical device specification.",
  "type": "object",
  "allOf": [
    {"$ref": "common.json#/definitions/envelope"},
    {
      "type": "object",
      "properties": {
        "data": {
          "allOf": [
            {"$ref": "common.json#/definitions/sdk_element"},
            {
              "properties": {
                 "type": {
                   "allOf": [
                     {"$ref": "common.json#/definitions/type"},
                     {"enum": ["physical_device"]}
                   ]
                 }
              }
            },
            {"$ref": "hardware-f9928aa4391e2ae3644ce712074a1ef7.json#/definitions/requirements"}
          ]
        }
      }
    }
  ]
}

實體裝置規定結構定義

這個結構定義讓我們能夠表明裝置硬體需求。這樣一來, 確保裝置硬體與應用程式要使用的構件 佈建工作目前僅說明 CPU 架構。

/** build/sdk/meta/hardware-c0a116ca.json */
{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "definitions": {
        "requirements": {
            "properties": {
                "hardware": {
                    "additionalProperties": false,
                    "properties": {
                        "cpu": {
                            "additionalProperties": false,
                            "properties": {
                                "arch": {
                                    "oneOf": [
                                      {"$ref": "common.json#/definitions/target_arch"}
                                    ]
                                }
                            },
                            "required": ["arch"],
                            "type": "object"
                        }
                    },
                    "required": ["cpu"],
                    "type": "object"
                }
            },
            "required": ["hardware"],
            "type": "object"
        },
    },
    "description": "Hardware requirements for running a product image.",
    "id": "http://fuchsia.com/schemas/sdk/hardware-c0a116ca.json"
}

虛擬

虛擬裝置規格讓我們可以選擇合適的產品 用於啟動模擬器的套件。日後的修訂版本 ,這是為了設定模擬器而進一步開發的功能舉例來說 下列結構定義使用新定義的 versioned_sdk_element 結構定義。

/** build/sdk/meta/virtual_device-8a8e2ba9.json */
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "id": "http://fuchsia.com/schemas/sdk/virtual_device-8a8e2ba9.json",
  "description": "A virtual device specification for launching emulators.",
  "type": "object",
  "allOf": [
    {"$ref": "common.json#/definitions/versioned_sdk_element"},
    {
      "type": "object",
      "properties": {
        "data": {
          "type": "object",
          "properties": {
             "type": {
               "allOf": [
                 {"$ref": "common.json#/definitions/type"},
                 {"enum": ["virtual_device"]}
               ]
             },
             "description": {"type": "string"},
             "virtual": {"$ref": "virtual_hardware-4c5d1a5d.json#/definitions/spec"}
          },
          "required": ["virtual"]
        }
      }
    }
  ]
}

虛擬裝置需求結構定義

虛擬硬體規格是用來選取 產品套件。

/** build/sdk/meta/virtual_hardware-4c5d1a5d.json */
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "id": "http://fuchsia.com/schemas/sdk/virtual_hardware-4c5d1a5d.json",
  "description": "A virtual device specification for launching emulators.",
  "definitions": {
    "spec": {
      "emu": {
        "type": "object",
        "properties": {
          "cpu": {
            "type": "object",
            "properties": {
              "arch": {
                "oneOf": [
                  {"$ref": "common.json#/definitions/target_arch"}
                ]
              }
            },
            "required": ["arch"],
            "additionalProperties": false
          }
        },
        "required": ["cpu"],
        "additionalProperties": false
      }
    },
    "required": ["emu"]
    }
  }
}

產品組合

映像檔和套件套件提供軟體構件的存取權 安裝在裝置上

/** build/sdk/meta/product_bundle-514c2856.json */
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "id": "http://fuchsia.com/schemas/sdk/product_bundle-514c2856.json",
  "description": "Artifacts required to boot and run software on a device.",
  "type": "object",
   "allOf": [
    {"$ref": "common.json#/definitions/versioned_sdk_element"},
    {
      "type": "object",
      "properties": {
        "data": {
          "type": "object",
          "properties": {
             "type": {
               "allOf": [
                 {"$ref": "common.json#/definitions/type"},
                 {"enum": ["product_bundle"]}
               ]
             },
             "description": {
               "description": "A human readable description of the product bundle.",
               "type": "string"
             },
             "device_refs": {
               "description": "A list of physical or virtual device names this product can run on.",
               "type": "array",
               "minItems": 1,
               "items": {
                   "type": "string",
                   "minLength": 1
               }
             },
             "metadata": {
               "description": "A list of key-value pairs describing product dimensions. Tools must not rely on the presence or absence of certain keys. Tools may display them to the human user in order to assist them in selecting a desired image or log them for the sake of analytics. Typical metadata keys are: build_info_board, build_info_product, is_debug.",
               "$ref": "common.json#/definitions/key_value_list"
             },
             "manifests": {
               "description": "Manifests describing how to boot the product on a device.",
               "flash": {"$ref": "flash_manifest-c85dbd8e.json#/definitions/manifest"},
               "emu": {"$ref": "emu_manifest-b0708439.json#/definitions/manifest"}
             },
             "images": {
               "description": "A list of system image bundles. Each image bundle must be equivalent to all others. I.e., all image bundle URIs are effectively mirrors of each other. Their formats may vary. Pick an entry that best suits your needs.",
               "type": "array",
               "minItems": 1,
               "items": {"$ref": "#/definitions/image_bundle"}
             },
             "packages": {
               "description": "A list of package bundles. Each package bundle must be equivalent to all otherwise. I.e., all package bundle URIs are effectively mirrors of each other. Their formats may vary. Pick an entry that best suits your needs.",
               "type": "array",
               "minItems": 1,
               "items": {"$ref": "#/definitions/package_bundle"}
             }
          },
          "required": ["device_refs", "manifests", "images", "packages"]
        }
      }
    }
  ],
  "definitions": {
    "image_bundle": {
      "description": "A set of artifacts necessary to provision a physical or virtual device",
      "type": "object",
      "properties": {
         "base_uri": {
           "description": "A base URI for accessing artifacts in the bundle.",
           "$ref": "#/definitions/bundle_uri"
         },
         "format": {
           "description": "Bundle format: files - a directory layout; tgz - a gzipped tarball. In case of the 'files' format, the base base path points to a directory. The manifest paths is relative to the directory. To get a full path append a path inside the manifest to base_uri. In case of the 'tgz' format, the base path points to the archive. The manifest path is relative within the archive."
           "enum": [
             "files",
             "tgz"
            ]
         }
      },
      "required": [
        "base_uri",
        "format"
      ],
      "additionalProperties": false
    },
    "package_bundle": {
      "description": "A set of artifacts necessary to run a physical or virtual device",
      "type": "object",
      "properties": {
         "repo_uri": {
           "description": "A package repository URI. This may be an archive or a directory.",
           "$ref": "#/definitions/bundle_uri"
         },
         "format": {
           "description": "Repository format: files - a directory layout; tgz - a gzipped tarball.",
           "enum" : [
             "files",
             "tgz"
           ]
         },
         "blob_uri": {
           "description": "An optional blob repository URI. If omitted, it is assumed to be <repo_uri>/blobs. If repo_uri refers to a gzipped tarball, ./blobs directory is expected to be found inside the tarball.",
           "$ref": "#/definitions/bundle_uri"
         }
      },
      "required": [
        "repo_uri",
        "format"
      ],
      "additionalProperties": false
    },
    "bundle_uri": {
      "description": "Allowed system image and package bundle URIs.",
      "type": "string",
      "format": "uri",
      "pattern": "^(?:http|https|gs|file):\/\/"
    }
  }
}

Flash 架構

以 Flash 結構定義為基礎的資訊清單會描述刷新所需的映像檔構件 裝置。資訊清單與 建構應用程式Flash 中繼資料將嵌入產品套件 SDK 元素中。

/** build/sdk/meta/flash_manifest-c85dbd8e.json */
{

  "$schema": "http://json-schema.org/draft-07/schema#",
  "id": "http://fuchsia.com/schemas/sdk/flash_manifest-c85dbd8e.json",
  "description": "A manifest that describes how to flash a device.",
  "type": "object",
  "properties": {
    "manifest": {"$ref": "#/definitions/manifest"}
  },
  "required": ["manifest"],
  "additionalProperties": false,
  "definitions": {
    "manifest": {
      "description": "A named list of partitions and OEM files necessary to flash a device.",
      "type": "object",
      "properties": {
        "hw_revision" : {
          "description": "A board name used to verify whether the device can be flashed using this manifest.",
          "type": "string"
        },
        "products": {
          "description": "A list of product specifications that can be flashed onto the device.",
          "type": "array",
          "items": {"$ref": "#/definitions/product"},
          "minItems": 1
        }
      },
      "required": ["hw_revision", "products"],
      "additionalProperties": false
    },
    "product": {
      "description": "A named product specification.",
      "type": "object",
      "properties": {
        "name": {
          "description": "A unique name of this manifest.",
          "type": "string"
        },
        "partitions": {
          "description": "A list of partition names and file names corresponding to the partitions.",
          "$ref": "common.json#/definitions/key_value_list"
        },
        "bootloader_partitions": {
          "description": "A list of partition names and file names corresponding to the partitions.",
          "$ref": "common.json#/definitions/key_value_list"
        },
        "oem_files": {
          "description": "A list of OEM command and file names corresponding to the command.",
          "$ref": "common.json#/definitions/key_value_list"
        }
      },
      "required": ["name", "partitions"],
      "additionalProperties": false
    }
  }
}

模擬器結構定義

模擬器結構定義會指定啟動產品所需的映像檔構件 。

/** build/sdk/meta/emu_manifest-b0708439.json */
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "id": "http://fuchsia.com/schemas/sdk/emu_manifest-b0708439.json",
  "definitions": {
    "manifest": {
      "description": "A manifest that describes how to boot an emulator.",
      "type": "object",
      "properties": {
        "kernel": {
          "description": "A path to the kernel image file. The path is relative to the image bundle base.",
          "type": "string",
          "minLength": 1
        },
        "initial_ramdisk": {
          "description": "A path to the initial ramdisk, the kernel ZBI. The path is relative to the image bundle base.",
          "type": "string",
          "minLength": 1
        },
        "disk_images": {
          "description": "A list of one or more disk image paths to FVM images. Each path is relative to the image bundle base.",
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
          },
          "minItems": 1
        }
      },
      "required": ["kernel", "initial_ramdisk", "disk_images"],
      "additionalProperties": false
    }
  }
}

其他常見定義

以下是額外定義的額外內容。詳情請參閱這一節: Common.json。 為求簡潔,以下省略了採用 common.json 中的現有定義。

/** build/sdk/meta/common.json */
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "id": "http://fuchsia.com/schemas/sdk/common.json",
  "definitions": {
    ...,
   "key_value": {
     "description": "A key-value pair.",
      "type": "array",
      "items": [
        {"type": "string"},
        {"type": ["number", "string"]}
      ],
      "minItems": 2,
      "additionalItems": false
    },
    "key_value_list": {
      "description": "A list of key-value pairs.",
      "type": "array",
      "items": {"$ref": "#/definitions/key_value"}
    }

範例

裝置

實體裝置

以下是裝置硬體規格的範例。

{
  "version": "c906d79c",
  "data": {
    "type": "physical_device",
    "name": "generic-x64",
    "description": "A generic x64 device.",
    "hardware": {
      "cpu": {
        "arch": "x64"
      }
    }
  }
}

產品組合

實體裝置上的終端機

這個範例說明通用的終端機產品可在一般 x64 上開機 裝置上有兩個封存鏡像,適用於可存取的圖片和套件 透過 gshttps 為基礎的 URI。

{
  "version": "514c2856",
  "data": {
    "type": "product_bundle",
    "name": "generic-x64",
    "description": "A terminal x64 product.",
    "device_refs": ["generic-x64"],
    "metadata": [
      ["build-type", "release"],
      ["product", "terminal"]
    ],
    "manifests": {
      "flash": {
        "hw_revision": "x64",
        "products" : [
          {
            "bootloader_partitions": [],
            "name": "fuchsia",
            "oem_files": [],
            "partitions": [
              ["", "fuchsia.zbi"],
              ["", "zedboot.zbi"],
              ["", "fuchsia.vbmeta"],
              ["", "zedboot.vbmeta"]
            ]
          }
        ]
      }
    },
    "images": [
      {
        "base_uri": "gs://fuchsia/development/0.20201216.2.1/images/generic-x64.tgz",
        "format": "tgz"
      },
      {
        "base_uri": "https://storage.googleapis.com/fuchsia/development/0.20201216.2.1/images/generic-x64.tgz",
        "format": "tgz"
      }
    ],
    "packages": [
      {
        "repo_uri": "gs://fuchsia/development/0.20201216.2.1/packages/generic-x64.tar.gz",
        "format": "tgz"
      },
      {
        "repo_uri": "https://storage.googleapis.com/fuchsia/development/0.20201216.2.1/packages/generic-x64.tar.gz",
        "format": "tgz"
      }
    ]
  }
}
Android Emulator 上的終端機

這個例子說明 x64 版本的一般終端產品 模擬器。映像檔和套件都能直接從 GCS 存取。

{
  "version": "514c2856",
  "data": {
    "type": "product_bundle",
    "name": "generic-x64",
    "description": "A terminal x64 product.",
    "device_refs": ["qemu-x64"],
    "metadata": [
      ["build-type" , "debug"],
      ["product", "terminal"]
    ],
    "manifests": {
      "emu": {
        "kernel": "qemu-kernel.kernel",
        "initial_ramdisk": "zircon-a.zbi",
        "disk_images": ["storage-sparse.blk"]
      }
    },
    "images": [
      {
        "base_uri": "https://storage.googleapis.com/fuchsia-artifacts/builds/8852232026486839104/images/",
        "format": "files"
      }
    ],
    "packages": [
      {
        "repo_uri": "https://storage.googleapis.com/fuchsia-artifacts/builds/8852232026486839104/packages/",
        "blob_repo_uri": "https://storage.googleapis.com/fuchsia-artifacts/blobs/",
        "format": "files"
      }
    ]
  }
}

成效

這不太可能對效能產生影響,因為產生中繼資料 剖析功能並不會耗用大量資源

人體工學

發布標準化中繼資料應移除 也不需要繁雜的硬式編碼設定

我們選擇 JSON,是因為這種格式具有良好成熟的格式,事實上也是事實 Fuchsia 設定檔的標準。JSON 結構定義格式已正式化 也經過了同儕審查

回溯相容性

中繼資料簡介不會影響回溯相容性,因為 現有中繼資料沒有使用者。

系統會透過 API 審查及管理這些 schemata 日後的修訂版本 一套標準 LSC 程序,包含測試與高度互動 重要客戶。建立結構定義版本後,系統會協助處理這個程序 定義。

安全性考量

以這些結構定義為基礎的中繼資料,安全比現有解決方案低。 這會特別以硬式編碼的方式寫入類似資訊

我們會在 在這些結構定義中根據資安團隊正在接受的意見回饋,此 可能是在部署前進行重要的是,工具必須驗證 下載構件的內容: 構件必須與目標的內容相符 中繼資料的發布時間其中一種做法就是 雜湊函式輸出的結果 例如 TUF

工具為 Fuchsia SDK 的一部分,會取用這個結構定義並擷取 構件必須實施額外的安全措施以確保傳輸 以防止中間人等攻擊。他們可能是 拒絕從不安全 / 不受信任的位置擷取或使用構件。

隱私權注意事項

本提案沒有已知的隱私權注意事項。可能有隱私權 發布中繼資料的人員或團隊須注意的事項我們希望他們能 或自行審查隱私權。舉例來說,發布中繼資料的團隊 必須審慎考量他們追蹤下載的方式

測試

雖然結構定義的存在不需要測試,但我們會確保 符合結構定義我們也會提供 相容性測試,確保工具能繼續使用舊版結構定義, 無從得知

說明文件

雖然目前在結構定義之外並未規劃任何說明文件,不過 所以情況會隨需求變動建立或更新結構定義的開發人員 可能需要提供詞彙解釋,說明每個架構 以及它們之間的互動方式

缺點、替代方案和未知

我們正努力利用特定 API 來指定裝置映像檔。這個引數包含 並善用現有 變更管理程序,並為我們提供工具 但靈活彈性的缺點, 可能會因為官僚體系障礙而變更結構定義的時間較長)。

既有藝術品和參考資料

本文件會收集並整合 如前文所述你可以在下列位置找到許多現有中繼資料: //build/images/BUILD.gn;例如:閃爍的最新版本 請參閱這裡所列的結構定義


  1. 所有中繼資料都會以 SDK 元素的形式發布。