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(“/”)。
    • segments 是按 0x2F ('/') 拆分路径的结果。每个片段都必须满足以下要求:
      • 不得为空。
      • 不得正好为 0x2E(“.”)
      • 不得正好为 0x2E 0x2E(“..”)

内容块

内容区块必须位于索引分块中列出的所有分块之后。内容块必须按照其在目录中列出的顺序显示在归档文件中。

  • data

从归档开始,数据必须在 4096 字节边界上对齐,并且在下一个 4096 字节边界之前必须用零填充数据。