运行组件

本文档展示了如何将组件直接添加到组件中 并在运行时与它们进行交互。

Fuchsia 基于 组件框架 应用场景。如果您是使用 以下框架,请改为参阅相应的指南:

概念

在运行组件之前,您应该了解以下概念:

  • 在运行时, 组件实例树 连接个人 组件实例 以父级和子级关系层次结构集中在一起。
  • 组件实例会经历四种主要的生命周期状态:创建、 启动、停止和销毁。
  • 组件名称 标识组件实例 使用它们的拓扑路径在树中移动。
  • 组件实例以静态方式声明为 子组件 组件清单动态创建 在运行时(位于组件集合中)。每个实例 由组件 nameurl 组成。
  • 组件网址 用于标识组件组件 网址由组件框架解析,通常解析为 软件包。

有关组件执行的更多详情,请参阅 组件生命周期

组件实例

运行组件的第一步是将新的组件实例添加到 树。组件实例在树中的位置决定了 可用 功能 ,了解所有最新动态。

探索静态组件

静态组件已声明为 树。您可以使用 ffx component show 来确定名称,并 静态组件实例的组件网址:

ffx component show COMPONENT_NAME

COMPONENT_NAME 替换为组件名称。以下示例 显示了 pkg-resolver 组件的命令输出:

$ ffx component show pkg-resolver
               Moniker: /core/pkg-resolver
                   URL: fuchsia-pkg://fuchsia.com/pkg-resolver#meta/pkg-resolver.cm
                  Type: CML static component
       Component State: Resolved
       Execution State: Running
...

无法在运行时创建或销毁静态组件实例。

管理动态组件

动态组件是在运行时在集合内创建的。您可以使用 ffx component create,用于创建新组件实例并提供目标 名称,以及用于解析 组件:

ffx component create TARGET_MONIKER COMPONENT_URL

TARGET_MONIKER 替换为新组件的目标名称 并将 COMPONENT_URL 替换为 组件。例如,以下命令会创建一个新的 ffx-laboratory 集合中名为 hello-world 的组件实例:

$ ffx component create /core/ffx-laboratory:hello-world fuchsia-pkg://fuchsia.com/hello-world-rust#meta/hello-world-rust.cm
URL: fuchsia-pkg://fuchsia.com/hello-world-rust#meta/hello-world-rust.cm
Moniker: /core/ffx-laboratory:hello-world
Creating component instance...

同样,使用 ffx component destroy 销毁动态组件实例 为其命名:

ffx component destroy TARGET_MONIKER

TARGET_MONIKER 替换为要销毁的组件的名称。通过 以下示例销毁了上面创建的 hello-world 组件:

$ ffx component destroy /core/ffx-laboratory:hello-world
Moniker: /core/ffx-laboratory:hello-world
Destroying component instance...

组件执行

树状结构中存在组件实例后,您就可以启动和停止目标 实例(使用 ffx component)。

启动实例

使用 ffx component start 显式启动组件实例:

ffx component start TARGET_MONIKER

TARGET_MONIKER 替换为要启动的组件的名称。通过 以下示例会启动之前创建的 hello-world 组件:

$ ffx component start /core/ffx-laboratory:hello-world
Moniker: /core/ffx-laboratory:hello-world
Starting component instance...

停止实例

使用 ffx component stop 终止正在运行的组件实例的执行 并使用其名称:

ffx component stop TARGET_MONIKER

TARGET_MONIKER 替换为要停止的组件的名称。通过 以下示例会停止访问上面启动的 hello-world 组件:

$ ffx component stop /core/ffx-laboratory:hello-world
Moniker: /core/ffx-laboratory:hello-world
Stopping component instance...

运行组件

ffx component run 命令提供了运行基本组件的快速入门信息 。这是 ffx component create 的快捷方式,后跟 ffx component start

ffx component run TARGET_MONIKER COMPONENT_URL

TARGET_MONIKER 替换为新组件的目标名称 并将 COMPONENT_URL 替换为 组件。例如,以下命令会创建一个新的 ffx-laboratory 内名为 hello-world-rust 的组件实例 集合:

$ ffx component run /core/ffx-laboratory:hello-world-rust fuchsia-pkg://fuchsia.com/hello-world-rust#meta/hello-world-rust.cm
URL: fuchsia-pkg://fuchsia.com/hello-world-rust#meta/hello-world-rust.cm
Moniker: /core/ffx-laboratory:hello-world-rust
Creating component instance...
Starting component instance...

上面的示例相当于运行以下单个 ffx 命令:

$ ffx component create /core/ffx-laboratory:hello-world-rust fuchsia-pkg://fuchsia.com/hello-world-rust#meta/hello-world-rust.cm
$ ffx component start /core/ffx-laboratory:hello-world-rust

更新组件的方法

更改组件时,您常常需要更新组件的某个组件 虚拟机实例例如,您可以更改组件的 然后使用新的二进制文件运行该组件。您也可以将 以便添加新的功能路由,并希望让这些功能 设备上可用的路由

ffx component reload 命令是最快速、最完整的 重新加载组件。但这并不是唯一的途径 方法可以针对特殊用例进行更精确的操作。

下文对这些方法进行了总结,并对其进行了详细说明。

摘要

命令 说明 最新动态 包裹 最新动态 清单 果酱 资源
ffx 组件重新加载 经停点, 最新动态, 并开始
ffx 组件 destroy/create/start 毁坏 然后开始
ffx 组件运行 --recreate 毁坏 然后开始
ffx 组件 停止/启动 停止和 开始 不包含 破坏
  • “更新软件包”意味着当更新软件包时 已重新加载。
  • “更新清单”表示重新加载清单缓存,更新 FIDL 文件中包含的路由和其他信息。
  • "保留资源"例如存储空间 而是由销毁命令释放的存储分区中

重新加载

使用以下命令更新组件的代码和清单,同时保留资源:

ffx component reload TARGET_MONIKER

此命令会先关闭该组件,然后重新加载并重新启动该组件。通过 命令会在不销毁组件或 资源释放

reload 命令可保留组件的资源,如存储空间。这个 如果初始化、获取或重新创建速度缓慢,则保留会很有帮助 调试特定状态的资源。

如果销毁组件的成本很高,则重新加载速度也会更快,例如 需要关闭并重启某个会话或 设备/模拟器。

销毁/创建/启动

要完全重新加载组件并丢弃获取的资源,可以先销毁 现有组件实例,然后重启它。使用:

$ ffx component destroy TARGET_MONIKER
$ ffx component create TARGET_MONIKER COMPONENT_URL
$ ffx component start TARGET_MONIKER

这一过程将重新加载软件包和清单, 功能更改将会更新。不过,销毁该组件也会 释放其使用的所有资源如果您的目标是 从完全重新初始化的组件开始。

运行 --recreate

一个类似于销毁/创建/启动序列的便捷命令 将 run 命令与 --recreate 搭配使用:

ffx component run TARGET_MONIKER COMPONENT_URL --recreate

停止/启动

尽管这并不是执行更新的主要方式,但这样做会产生负面影响, 启动组件会对其部分更新

$ ffx component stop TARGET_MONIKER
$ ffx component start TARGET_MONIKER

假设有一个软件包管理器(如 ffx serve)正在运行,最新版本的 系统就会加载并运行该组件的代码不过,由于缓存内容 适用于 Fuchsia 组件框架,因此系统不会更新清单。通过 包含您的组件的路由和其他信息,如 *.cm 文件。因此,如果您更改组件的功能路由, 并启动该组件不会捕捉这些更改。

ffx-laboratory

ffx-laboratory 是一个组件集合,提供一组受限的 开发能力。Google 提供了以下功能 组件:

  • 协议功能 <ph type="x-smartling-placeholder">
  • 存储功能 <ph type="x-smartling-placeholder">
      </ph>
    • tmp:临时存储(非永久性)
    • data:由 /tmp 支持的模拟永久性存储
    • cache:由 /tmp 支持的模拟缓存存储空间
  • 目录功能 <ph type="x-smartling-placeholder">
      </ph>
    • /dev:驱动程序管理器提供的设备驱动程序 devfs
    • /boot:组件管理器提供的只读 bootfs

ffx-laboratory 是一个 transient 集合。 此集合中的组件实例在停止后仍将保留。接收者 销毁此集合中的组件实例时,请使用 ffx component destroy 命令。

问题排查

本部分包含您在运行应用时可能会遇到的常见问题, 组件。

无法解析该组件

使用 ffx component startffx component run 时,您可能会遇到 如果组件框架无法解析组件实例,则会发生以下错误:

$ ffx component run /core/ffx-laboratory:hello-world fuchsia-pkg://fuchsia.com/hello-world#meta/hello-world.cm
URL: fuchsia-pkg://fuchsia.com/hello-world#meta/hello-world.cm
Moniker: /core/ffx-laboratory:hello-world
Creating component instance...
Starting component instance...
Lifecycle protocol could not bind to component instance: InstanceCannotResolve

当组件网址无法解析为有效组件时,就会发生这种情况 清单。

如需解决此问题,请验证以下内容:

组件实例已存在

使用 ffx component createffx component run 时,您可能会遇到 如果组件实例已存在,则会发生以下错误:

$ ffx component run /core/ffx-laboratory:hello-world fuchsia-pkg://fuchsia.com/hello-world#meta/hello-world.cm
URL: fuchsia-pkg://fuchsia.com/hello-world#meta/hello-world.cm
Moniker: /core/ffx-laboratory:hello-world
Creating component instance...
Component instance already exists. Use --recreate to destroy and recreate a new instance, or --name to create a new instance with a different name.

如果目标名称已被其他组件使用,就会发生这种情况 实例。

要解决此问题,请使用 ffx component destroy 命令手动销毁实例:

$ ffx component destroy /core/ffx-laboratory:hello-world
Moniker: /core/ffx-laboratory:hello-world
Destroying component instance...

如果您使用的是 ffx component run,请添加 --recreate 标志以销毁 实例并重新创建:

$ ffx component run /core/ffx-laboratory:hello-world fuchsia-pkg://fuchsia.com/hello-world#meta/hello-world.cm --recreate
URL: fuchsia-pkg://fuchsia.com/hello-world#meta/hello-world.cm
Moniker: /core/ffx-laboratory:hello-world
Creating component instance...
Component instance already exists. Destroying...
Recreating component instance...
Starting component instance...

或者,添加 --name 标志以创建使用不同 名称:

$ ffx component run /core/ffx-laboratory:hello-world fuchsia-pkg://fuchsia.com/hello-world#meta/hello-world.cm --name hello-world-2
URL: fuchsia-pkg://fuchsia.com/hello-world#meta/hello-world.cm
Moniker: /core/ffx-laboratory:hello-world-2
Creating component instance...
Starting component instance...