Fuchsia 软件包是文件的层次结构集合,用于向 Fuchsia 系统提供一个或多个程序、组件或服务。Fuchsia 软件包是用来表示
但与许多其他套件系统不同,该单元由
部分,而不是单个二进制文件 BLOB
。
在启动时,Fuchsia 系统上会存在一些软件包,并且可以从 BLOB
中的 Fuchsia 软件包服务器下载其他软件包。Fuchsia 软件包服务器是 HTTP(S) 服务器。这些 BLOB
由 Merkle 进行唯一定义
根。BLOB
的命名方式是根据其内容,使用 Fuchsia Merkle Root 算法。如果两个 BLOB
具有相同的内容,则它们具有相同的名称。因此,每个 BLOB
都有一个唯一标识符,并且
此 Merkle 将
root 作为键。此过程消除重复的 BLOB
,
两个软件包之间可能存在例如,Google Analytics 中的
多个软件包仅在设备上存储一次。
软件包服务器会充当信任根, 每个软件包
软件包还可以声明对
子软件包
来创建嵌套软件包的层次结构。
构建规则将软件包与每个子软件包的构建目标相关联。在构建时,软件包构建工具会在父级软件包的元数据中记录子软件包,并将每个子软件包名称映射到其软件包哈希(用于标识子软件包的 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
具有
merkleroot,实际上也称为
软件包的 Merkleroot。
软件包的 meta/
目录至少包含两个文件:
meta/package
软件包标识文件。这是一个 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
与绝对软件包网址一样,资源路径可以包含,也可以不包含。