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 系统的软件包 返回设备上的版本,而不是 可能存在于软件包服务器上不过,基础软件包可作为 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
与绝对软件包网址一样,可能会包含资源路径,也可能不包含资源路径。