使用 Fuchsia 软件包进行开发

本文档介绍了使用 Fuchsia 软件包进行 Fuchsia 产品开发的基础知识。

概览

Fuchsia 软件包是文件和 向 Fuchsia 提供一个或多个程序、组件或服务的资源 系统。无论是不是显而易见的,几乎所有您在 YouTube 上看到的内容都是如此 Fuchsia 生活在 Fuchsia 软件包中。

在 Fuchsia 产品开发期间,如果您想向目标 Fuchsia 设备提供新软件,可以构建一个 Fuchsia 软件包来包含更改,并将其发布到开发主机上运行的本地软件包服务器。然后,Fuchsia 设备将下载软件包并更新软件。

在此设置中,您的开发主机运行一个简单的静态文件 HTTP 服务器将 Fuchsia 软件包提供给目标设备。此 HTTP 服务器(称为 Fuchsia 软件包服务器)是 Fuchsia 源代码的一部分,会在运行 fx build 命令时自动构建。

Fuchsia 目标设备通常配置为在 Fuchsia 软件包服务器。当目标设备上的更新系统发现有更改时,它会从软件包服务器提取新软件包。软件包下载后,软件包中的新软件将可在目标设备上使用。

前提条件

您的开发主机和 Fuchsia 目标设备必须能够通过 TPC/IP 通信。特别是,必须能够确定 从开发主机到目标设备的 SSH 连接。 此 SSH 连接用于向目标设备发出命令。

构建软件包

如需在 Fuchsia 源代码检出中构建包含您代码的软件包,您需要指定软件包构建规则。如需详细了解如何为软件包添加 build 规则,请参阅 Fuchsia build 系统

添加适当的构建规则后,运行以下命令 生成软件包:

fx build

检查软件包

Fuchsia 附带了 ffx 工具,用于处理软件包归档。在 Fuchsia build (fx build) 完成后,您可以使用 ffx package archive 命令来创建、列出、转储或 提取软件包归档,例如:

ffx package archive list

以下 ffx package archive list 命令示例列出了 ~/fuchsia/out/default/obj/third_party/sbase/sed_pkg/ 目录中名为 meta.far 的软件包的内容:

$ ffx package archive list ~/fuchsia/out/default/obj/third_party/sbase/sed_pkg/meta.far
+-------------------------------+
| NAME                          |
+===============================+
| meta/contents                 |
+-------------------------------+
| meta/fuchsia.abi/abi-revision |
+-------------------------------+
| meta/package                  |
+-------------------------------+

请注意,此 meta.far 软件包中包含一个名为 meta/contents 的文件。 meta/contents 文件会将软件包面向用户的文件名映射到 这些文件的 Merkle 根,例如:

$ ffx package archive cat ~/fuchsia/out/default/obj/third_party/sbase/sed_pkg/meta.far meta/contents
bin/sed=361c6e3a027cf38af0d53e1009ef3b3448f4aeb60270910a116396f5ec8eccba
lib/ld.so.1=c8ec55a14590e7e6f06f311d632744012f85084968d98a335c778f29207caa14
lib/libc++.so.2=d8a45259c74cf65c1f8470ac043c6459403fdd0bbf676092ba82f36451e4e571
lib/libc++abi.so.1=f12b37c2b9bfb43fbe33d446794a6ffeee1452b16b7c8d08b3438f3045d1f19a
lib/libfdio.so=9834d890adedc8e532899a673092271e394458e98e6cee049cb78f5a95372b11
lib/libunwind.so.1=89e5dee07ff8d2a03c58d524d8d832e79c70dcb81508f8a83c6fbf07e1539e83

如需详细了解 Fuchsia 软件包及其内容, 请参阅软件包的结构

管理软件包服务器

几乎所有在 Fuchsia 系统上运行的软件都会收集到 Fuchsia 中 软件包除了构成紫红色基础的基础套餐之外 其他软件包也可从 Fuchsia 软件包服务器。Fuchsia 软件包服务器是一种 HTTP(S) 服务器,使用 TUF(更新框架)管理 Fuchsia 软件包。此框架使用经过加密签名的 BLOB 将更新后的软件包安全地分发到搭载 Fuchsia 的设备。

如需详细了解如何启动、停止和列出 Fuchsia 软件包服务器 请参阅下列指南:

连接主机和目标

Fuchsia 源代码检出 (fuchsia.git) 包含 Fuchsia 软件包服务器,这是一个用于传送静态文件的简单 HTTP 服务器。还有紫红色 build 生成 TUF 文件树并将其传送至服务器。

目标 Fuchsia 设备上的更新代理最初不知道在哪里查找更新。将目标上的更新代理连接到软件包服务器 在开发主机上运行时,必须告知目标 运行容器

默认情况下,Fucsia 软件包服务器会自动向 默认目标。您可以在启动服务器时使用 --no-device 选项停用此行为。

以下命令用于管理目标设备上的软件包仓库:

启动 Fuchsia 软件包服务器并在目标上配置更新代理 您可以运行以下命令(也可以直接运行 fx serve):

fx serve -v

fx serve 命令用于运行软件包服务器,通常由开发者使用。不过,建议使用 -v 选项,因为它允许该命令输出更多输出,这有助于您进行调试。如果打包服务器成功连接到目标设备,该命令会在开发主机上的 shell 中输出 Ready to push packages! 消息。

目标设备上的更新代理将保持配置状态,直到重新刷写。 更新代理后,Fucsia 软件包服务器会尝试重新配置 目标设备重新启动。

触发软件包更新

在 Fuchsia 中,软件包未“安装”但会根据需要缓存 基础。

Fuchsia 生态系统中有两类软件包:

  • Basebase 软件包集是一组对系统正常运行至关重要的软件,必须保持一致。当使用 --with-base 标志将软件包提供给 fx set 命令时,Fuchsia 构建系统会将软件包分配给 base

    此类软件只能通过执行完整的系统更新(通常称为 OTA [无线下载] 更新)进行更新,该更新使用 fx ota 命令执行。

  • 临时软件cacheuniverse 软件包集中包含的软件包属于临时软件。这些更新是按需提供的。紫红色 当向 universe 提供软件包时,构建系统会将其分配给 使用 --with 标志的 fx set 命令。

    将新软件包提取到目标位置时,暂时性软件会更新到最新的可用版本。

以下命令用于发布 Fuchsia 软件包和更新 目标设备:

  • fx serve:在本地为二者运行 Fuchsia 软件包服务器 build-push 和 OTA。
  • fx ota:在目标设备上触发完整系统更新并重新启动。
  • fx test:针对测试目标设备构建和运行测试。

触发 OTA

有时,许多软件包可能会发生更改。例如,内核可能会发生变化,或者系统软件包可能会发生变化。由于 base 软件包在系统运行时不可变,因此如需向目标设备引入内核变更或系统软件包中的变更,则需要进行 OTA 或刷写。(OTA 更新通常比刷写设备更快)。

如需触发目标设备的 OTA 更新,请运行以下命令:

fx ota

fx ota 命令会要求目标设备从可用的任何更新源执行更新。如需通过 OTA,请在开发环境中更新 build 连接到同一 LAN 中的目标设备,您首先需要构建 系统 (fx build)。构建完成后,如果 fx serve [-v] 命令尚未在开发主机上运行, 命令,以便目标设备可以使用 Fuchsia 软件包服务器作为更新 来源。-v 选项会输出有关目标设备正在从软件包服务器请求的文件的更多信息。使用 -v 选项时,目标设备会检索所有新文件,因此会出现大量输出。

完成 OTA 后,目标设备将重新启动。

问题和注意事项

请注意在使用 Fuchsia 软件包时可能会遇到以下问题。

你可以让自己的

推送的每个更新都存储在内容寻址文件系统 blobfs 中。 重新启动后,更新后的软件包可能不可用,因为 在 blobfs 中找到这些编号的索引仅保存在 RAM 中。系统目前 不会对无法访问或不再使用的软件包进行垃圾回收( 垃圾收集是最近的创新!),但最终还是会的。

fx gc 命令会重新启动目标设备,然后从设备中驱逐所有旧的暂时性软件,从而释放空间。

在不重新启动的情况下重启

如果要更新的软件包托管由 Fuchsia 管理的服务,则该服务 可能需要重启。不建议重新启动,因为这样速度会很慢,并且软件包会还原为设备上刷写的版本。通常,开发者可以通过要求组件正常终止或使用 ffx component stop 命令强制停止组件,来终止系统上的一个或多个正在运行的组件。重新连接到组件服务或通过 ffx component startfx test 调用后,系统会在启动前缓存软件包服务器中提供的新版本。

在 Fuchsia 树之外封装代码

您可以打包和推送位于 Fuchsia 树之外的代码,但需要完成更多工作。Fuchsia 软件包格式非常简单。它由用于描述软件包内容的元数据文件组成,Fuchsia 软件包文档中对此进行了详细介绍。元数据文件会添加到 TUF 文件树中,其中每个内容都以其 Merkle 根哈希命名,并放入 TUF 文件树根目录 (blobs) 下。