Fuchsia 封存格式 (FAR)

總覽

Fuchsia 封存格式是一種將目錄樹狀結構儲存在檔案中的格式。與 .tar 或 .zip 檔案一樣,Fuchsia 封存檔案會儲存從路徑名稱到檔案內容的對應。

Fuchsia 封存檔案有時稱為 FAR 或 FAR 封存,副檔名為 .far。

如需建立及建構 Fuchsia 套件、檢查套件內容等操作說明,請參閱「使用 Fuchsia 套件開發」。

格式

封存檔是一連串位元組,分為多個區塊:

  • 第一個區塊是索引區塊,說明其他區塊在封存檔中的位置。
  • 索引中列出的所有區塊都必須按照索引中列出的順序 (依類型排序) 顯示在封存檔中。
  • 封存檔可能包含索引中未參照的其他區塊,但這些區塊必須在索引中列出的所有區塊之後,才會出現在封存檔中。例如,內容區塊不會列在索引中。而是可從目錄區塊連到內容區塊。
  • 區塊不得重疊。
  • 所有區塊都會在 64 位元邊界上對齊。
  • 所有區塊都必須盡可能緊密排列,並遵守對齊限制。
  • 區塊之間的任何間隙都必須填入零。

所有偏移和長度都會以小端序編碼為不帶正負號的整數。

索引區塊

索引區塊為必要項目,且必須位於封存檔開頭。

  • 8 個位元組的魔術。
    • 必須是 0xc8 0xbf 0x0b 0x48 0xad 0xab 0xc5 0x11。
  • 串連索引項目的 64 位元長度 (以位元組為單位)。
  • 串連的索引項目。

任何兩個索引項目都不得具有相同類型,且項目必須依類型以遞增的字典順序排序 (例如,透過 memcmp 比較)。索引中列出的區塊必須按照索引中列出的順序儲存在封存檔中。

索引項目

  • 64 位元區塊類型。
  • 從封存檔開頭到參照區塊開頭的 64 位元偏移量,以位元組為單位。
  • 參照區塊的 64 位元長度 (以位元組為單位)。

目錄區塊 (類型「DIR-----」)

必須提供目錄區塊。目錄區塊中的項目必須具有不重複的名稱,且項目必須按照名稱以遞增的字典順序排序 (例如,與 memcmp 相比)。

  • 串連的目錄資料表項目。

這些項目代表封存檔中的檔案。目錄本身不會明確表示,這表示封存檔無法表示空白目錄。

目錄表格項目

  • 名稱。
    • 從目錄名稱區塊開頭到路徑資料的 32 位元偏移量,以位元組為單位。
    • 名稱長度 (16 位元,以位元組為單位)。
  • 16 位元的零,保留供日後使用。
  • 資料。
    • 從封存檔開頭到內容區塊開頭的 64 位元偏移量,以位元組為單位。
    • 資料的 64 位元長度 (以位元組為單位)。
  • 64 位元的零,保留供日後使用。

目錄名稱區塊 (類型「DIRNAMES」)

目錄名稱區塊是必要區塊,目錄區塊會使用這個區塊來命名內容區塊。路徑資料必須按照遞增的字典順序排序 (例如,與 memcmp 相比)。

  • 串連的路徑資料 (未指定編碼)。
  • 補零至下一個 8 位元組邊界。

雖然未指定編碼,但如果用戶端想使用 Unicode 顯示路徑資料,可能會嘗試將資料解碼為 UTF-8。路徑資料不一定是 UTF-8,因此解碼可能會失敗。

路徑資料

  • 路徑的八位元組。
    • 不得留空。
    • 不得包含 0x00 八位元組。
    • 開頭的八位元組不得為 0x2F ('/')。
    • 結尾八位元組不得為 0x2F ('/')。
    • 將路徑以 0x2F ('/') 分割,結果為區段。每個區段都必須符合下列規定:
      • 不得留空。
      • 不得為 0x2E ('.')
      • 不得為 0x2E 0x2E ('..')

內容區塊

內容區塊必須位於索引區塊中列出的所有區塊之後。內容區塊在封存檔中的顯示順序,必須與目錄中的順序相同。

  • 資料

資料必須從封存檔開頭對齊 4096 位元組邊界,且必須以零填補資料,直到下一個 4096 位元組邊界。