Fuchsia 软件包

Fuchsia 软件包是文件的分层集合,用于向 Fuchsia 系统提供一个或多个程序、组件或服务。Fuchsia 软件包是一个术语,表示分发单元,但与许多其他软件包系统不同,该单元由多个部分组成,而非单个二进制文件 BLOB

在启动时,Fuchsia 系统上会存在一些软件包,并且可以从 BLOB 中的 Fuchsia 软件包服务器下载其他软件包。Fuchsia 软件包服务器是 HTTP(S) 服务器。这些 BLOB 由 Merkle 根唯一定义。BLOB 的命名方式是根据其内容,使用 Fuchsia Merkle Root 算法。如果两个 BLOB 具有相同的内容,则它们具有相同的名称。因此,每个 BLOB 都有一个唯一标识符,并使用此 Merkle 根作为键写入永久存储空间。此过程旨在消除软件包之间可能存在的 BLOB 重复。例如,存在于多个软件包中的共享库只会在设备上存储一次。

软件包服务器充当信任根,因为它会验证每个软件包的真实性。

子软件包,从而创建嵌套软件包的层次结构。 构建规则会将软件包与每个子软件包的构建目标相关联。在构建时,软件包构建工具会在父级软件包的元数据中记录子软件包,并将每个子软件包名称映射到其软件包哈希(用于标识子软件包的 BLOB ID)。这样可以确保,如果不更改父级的 Merkle(软件包哈希),则子软件包列表和每个子软件包的内部内容都不会更改。

子软件包启用

  • 封装的依赖项(软件包本身就是“软件包树”)
  • 隔离的 /pkg 目录(分组的组件无需将其文件、库和元数据合并到单个共享命名空间中)
  • 可靠的依赖项解析(系统和构建工具可确保子软件包始终与其软件包“同行”)

如需详细了解如何使用子软件包将组件及其依赖项打包,请参阅子软件包组件

文件包类型

构成 Fuchsia 操作系统的软件包分为三组,这会影响其管理方式:

基本软件包

这些软件包是 Fuchsia 操作系统基础的一部分,被视为对安全性和系统至关重要。解析基于正在运行的 Fuchsia 系统的软件包始终会返回设备上的版本,而不是软件包服务器上可能存在的新版本。不过,基础软件包可以在 OTA 流程中更新。

由于这些软件包在系统运行时不可变,因此必须使用 fx ota 更新这些软件包,以触发无线下载 (OTA) 更新。

缓存的软件包

这些是设备上不属于基础软件包的软件包。这些软件包在设备刷写或铺设时存在,因此如果设备在没有网络连接的情况下启动,这些软件包便可供使用。如果软件包服务器上有其他软件包可用,缓存的软件包会在解析过程中更新。这些软件包不会在系统更新期间更新,而是会暂时更新。

Fuchsia 还可以根据运行时资源需求,驱逐正在运行的系统上的缓存软件包以释放资源。

Universe 文件包

这些软件包存在于软件包服务器上,但不存在于设备上。

软件包的结构

在大多数情况下,Fuchsia 中的软件包是 BLOB 的集合,至少包含一个名为 meta.far 的内容寻址 BLOB

在 Fuchsia 中,您可以使用 ffx package build 命令构建软件包。

从本质上讲,软件包是零个或多个内容寻址项的树。软件包包含以下内容:

meta.far

软件包元数据归档文件 meta.far 包含与软件包相关的元数据,以 meta/ 目录的形式呈现。meta.far 有一个 Merkle 根,在实际操作中也称为软件包的 Merkle 根。

软件包的 meta/ 目录至少包含两个文件:

  • meta/package

    软件包 ID 文件。这是一个 JSON 文件,其中包含软件包的名称和版本。

  • meta/contents

    内容文件。此文件由 ffx package build 命令创建。此文件会将软件包面向用户的文件名映射到这些文件的 Merkle 根。

如果软件包声明了子软件包,meta/ 目录还包含:

  • meta/fuchsia.pkg/subpackages

    子软件包文件。这是一个 JSON 文件,其中包含每个声明的子软件包的名称和版本。从父级软件包的角度来看,在解析子软件包时,子软件包名称会用作相对软件包网址。

    软件包构建工具会遍历子软件包引用(通过 build 依赖项声明和引用每个子软件包的其他软件包清单文件的软件包清单文件声明),以计算每个子软件包的版本(软件包哈希)并生成 subpackages 文件。

此外,meta/ 目录还可以包含组件清单等文件。如需详细了解组件清单,请参阅组件清单

meta/ 之外的 BLOB

软件包的大多数文件位于 meta/ 目录之外,并且每个文件都是 BLOB

例如,这些文件可以如下所示:

  • bin/foo
  • lib/libfdio.so
  • data/mydata.db

文件包的标识

Fuchsia 中的每个软件包都由 package-url 标识。

绝对软件包网址

绝对 Fuchsia 软件包网址用于标识可通过系统地址访问的软件包,无需任何其他上下文,如下所示:

fuchsia-pkg://repository/package-name?hash=package-hash#resource-path

Fuchsia 对 fuchsia-pkg 网址的解读因网址的哪些部分存在而异:

  • 如果存在代码库、软件包和资源部分,则网址用于标识软件包中的指定资源。
  • 如果只有代码库和软件包部分,则网址会标识所指明的软件包本身。
  • 如果只有仓库部分,则网址会标识所指明的仓库本身。

软件包部分可以表达不同程度的具体性。必须至少提供软件包名称,可选地后跟软件包哈希。

如果缺少软件包哈希,软件包解析器会从可供客户端使用的软件包变体的最新修订版中提取资源。

相对软件包网址

相对 Fuchsia 软件包网址会将给定之前加载的软件包(或子软件包)标识为“上下文”的子软件包。代码库和父级软件包是隐式的,子软件包名称用于在父级软件包的 "meta/fuchsia.pkg/subpackages" 文件中查找软件包哈希。(软件包哈希无法替换)。相对软件包网址如下所示:

package-name#resource-path

与绝对软件包网址一样,资源路径可以包含,也可以不包含。