概览
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 字节边界之前必须用零填充数据。