探索组件

ffx component explore 命令会启动一个交互式 shell,让您可以探索在目标设备上运行的 Fuchsia 组件的内部结构。

概念

ffx component explore 命令会启动一个范围限定为目标组件的 Dash 进程。通过这个 Dash 流程,您可以:

  • 使用熟悉的 POSIX 命令,例如 lscatgrep
  • 探索组件的传入和传出功能。

Dash 是 Fuchsia 项目中其他工具(例如 fx shell、串行控制台、终端窗口和 virtcon)之前使用的命令解释器。Dash 为开发者提供了 ffx component explore 的熟悉体验,例如 cdls,以便在 Fuchsia 组件中浏览聊天室,例如:

[host]$ ffx component explore /bootstrap/archivist
Moniker: /bootstrap/archivist
$ ls
exposed
ns
out
runtime
svc
$

不过,与 fx shell 不同的是,命名空间仅包含组件的传入和传出功能。这意味着,您可以在与组件看到的环境几乎完全相同的环境中进行探索。

探索组件

如需连接到 Fuchsia 组件并启动交互式 shell,请运行以下命令:

ffx component explore COMPONENT_IDENTIFIER

COMPONENT_IDENTIFIER 替换为您的目标组件的名称网址实例 ID。该命令还接受对这些标识符的唯一部分匹配。

以下示例命令会启动交互式 shell ($),以便探索 /bootstrap/archivst 组件:

[host]$ ffx component explore /bootstrap/archivist
Moniker: /bootstrap/archivist
$

在本指南的所有示例中,主机终端的 shell 提示符都表示为 [host]$,而组件的交互式 shell 的提示符仅表示为 $,不带 [host] 前缀。也就是说,[host]$ 表示该命令在主机的终端上运行,而 $ 表示该命令在连接到目标组件的交互式 shell 上运行。

本指南在大多数示例中还使用 /bootstrap/archivist(一个标识名)作为目标组件。在实践中,此参数应替换为目标组件的组件标识符。

探索组件可用的功能

如需探索目标组件的功能,请在组件的交互式 Shell 中前往 /ns 目录。/ns 目录包含组件的命名空间,与组件看到的完全一样,例如:

[host]$ ffx component explore /bootstrap/archivist
Moniker: /bootstrap/archivist
$ cd ns
$ ls
config
events
pkg
svc

如果您希望 shell 的命名空间与组件命名空间匹配,请使用 -l(或 --layout)标志,例如:

[host]$ ffx component explore /bootstrap/archivist -l namespace
Moniker: /bootstrap/archivist
$ ls
config
events
pkg
svc

如需详细了解这些目录,请参阅 ffx 组件探索中的命名空间根是什么?

探索组件公开的功能

/exposed 目录包含从目标组件向其父级组件公开的功能,例如:

[host]$ ffx component explore /bootstrap/archivist
Moniker: /bootstrap/archivist
$ cd exposed
$ ls
diagnostics
fuchsia.diagnostics.ArchiveAccessor
fuchsia.diagnostics.FeedbackArchiveAccessor
fuchsia.diagnostics.LegacyMetricsArchiveAccessor
fuchsia.diagnostics.LoWPANArchiveAccessor
fuchsia.diagnostics.LogSettings
fuchsia.logger.Log
fuchsia.logger.LogSink

探索组件提供的功能

如果目标组件在设备上运行,则 /out 目录包含该组件当前提供的所有功能,例如:

[host]$ ffx component explore /bootstrap/archivist
Moniker: /bootstrap/archivist
$ cd out
$ ls
diagnostics
svc
$ cd svc
$ ls
fuchsia.diagnostics.ArchiveAccessor
fuchsia.diagnostics.FeedbackArchiveAccessor
fuchsia.diagnostics.LegacyMetricsArchiveAccessor
fuchsia.diagnostics.LoWPANArchiveAccessor
fuchsia.diagnostics.LogSettings
fuchsia.logger.Log

探索组件的调试运行时数据

如果目标组件在设备上运行,则 /runtime 目录包含组件运行程序提供的调试信息,例如:

[host]$ ffx component explore /bootstrap/archivist
Moniker: /bootstrap/archivist
$ cd runtime/elf
$ ls
job_id
process_id
process_start_time
$ cat process_id
2542

在组件的 shell 中使用自定义命令行工具

如需将自定义命令行工具添加到目标组件的 shell 环境中,请使用 --tools 标志向 ffx component explore 命令提供工具软件包的网址,例如:

[host]$ ffx component explore /core/network --tools fuchsia-pkg://fuchsia.com/net-cli
Moniker: /core/network
$ net help
Usage: net <command> [<args>]

commands for net-cli

Options:
  --help            display usage information

Commands:
  filter            commands for packet filter
  if                commands for network interfaces
  log               commands for logging
  neigh             commands for neighbor tables
  route             commands for routing tables
  dhcp              commands for an interfaces dhcp client
  dhcpd             commands to control a dhcp server
  dns               commands to control the dns resolver

在组件的 shell 上以非交互方式运行命令

如需在组件的设备端 shell 中以非交互方式运行命令并接收 stdoutstderr 和退出代码,请使用 -c(或 --command)标志,例如:

[host]$ ffx component explore /bootstrap/archivist -c "cat /runtime/elf/process_id"
Moniker: /bootstrap/archivist
2542

附录

为什么我看不到父级的子组件?

Fuchsia 不允许直接从父级访问子组件。以前,使用对组件拓扑的了解访问子组件的功能会使工具变得脆弱,并且依赖于对系统拓扑进行编码的硬编码路径。

我们建议您改用以下替代方案:

  • 将功能从子组件明确路由到父组件。
  • 探索子组件本身。

这与 ffx 组件运行有何不同?

ffx component run 命令会在组件拓扑内的指定集合中创建并启动组件。不过,ffx component run 不提供任何互动功能。另一方面,ffx component explore 允许以交互方式探索拓扑中的任何现有组件。总而言之,您可以使用 ffx component explore 了解刚刚使用 ffx component run 创建的组件。

ffx 组件探索中的命名空间根是什么?

默认情况下,ffx component explore 命令会在命名空间根目录 (/) 中创建一个虚拟文件系统,其中包含以下目录:

目录 说明
/.dash 包含 Dash 所需的二进制文件。
/exposed 包含所有公开的功能。
/ns 包含组件的命名空间,这个命名空间与组件的命名空间完全相同。
/svc 包含 Dash 所需的功能。

如果目标组件在设备上运行,还会显示以下目录:

目录 说明
/out 包含组件当前提供的所有功能。
/runtime 包含组件运行程序提供的调试信息。

如果在 ffx component explore 中设置了 --layout namespace 标志,则 shell 的命名空间将与组件的命名空间匹配。

我可以使用 Dash shell 访问 Zircon 句柄或进行 FIDL 调用吗?

命令解释器无法直接支持此功能。

如何提交 ffx 组件探索功能请求?

请在 ComponentFramework > Tools 问题跟踪器组件下提交所有功能请求。