本文档展示了如何将组件直接添加到组件中 并在运行时与它们进行交互。
Fuchsia 基于 组件框架 应用场景。如果您是使用 以下框架,请改为参阅相应的指南:
- 会话的组成部分:构建和运行会话
- 测试组件: 运行 Fuchsia 测试
概念
在运行组件之前,您应该了解以下概念:
- 在运行时, 组件实例树 连接个人 组件实例 以父级和子级关系层次结构集中在一起。
- 组件实例会经历四种主要的生命周期状态:创建、 启动、停止和销毁。
- 答 组件名称 标识组件实例 使用它们的拓扑路径在树中移动。
- 组件实例以静态方式声明为
子组件
组件清单
或动态创建
在运行时(位于组件集合中)。每个实例
由组件
name
和url
组成。 - 答 组件网址 用于标识组件组件 网址由组件框架解析,通常解析为 软件包。
有关组件执行的更多详情,请参阅 组件生命周期。
组件实例
运行组件的第一步是将新的组件实例添加到 树。组件实例在树中的位置决定了 可用 功能 ,了解所有最新动态。
探索静态组件
静态组件已声明为
树。您可以使用 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>
fuchsia.logger.LogSink
:记录日志消息fuchsia.process.Launcher
:创建新进程
- 存储功能
<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 start
或 ffx 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 create
或 ffx 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...