探索元件

ffx component explore 指令會啟動互動式殼層,方便您探索在目標裝置上執行的 Fuchsia 元件內部。

概念

ffx component explore 指令會啟動 Dash 程序,範圍限定於目標元件。透過這項 Dash 程序,你可以:

  • 使用熟悉的 POSIX 指令,例如 lscatgrep
  • 探索元件的傳入和傳出功能。

Dash 是 Fuchsia 專案其他工具 (例如 fx shell、序列埠控制台、終端機視窗和 virtcon) 先前使用的指令解譯器。Dash 為開發人員提供熟悉的體驗,例如 cdls,方便在 Fuchsia 元件中瀏覽空間,例如:ffx component explore

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

不過,與 fx shell 不同的是,命名空間只包含元件的傳入和傳出功能。這項限制表示您可以在與元件所見幾乎相同的環境中探索。

探索元件

如要連線至 Fuchsia 元件並啟動互動式殼層,請執行下列指令:

ffx component explore COMPONENT_IDENTIFIER

COMPONENT_IDENTIFIER 替換為目標元件的別名網址執行個體 ID。這項指令也接受這些 ID 的部分相符專屬項目。

以下範例指令會啟動互動式殼層 ($),用於探索 /bootstrap/archivst 元件:

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

在本指南的所有範例中,主機終端的殼層提示會以 [host]$ 表示,而元件互動式殼層的提示則會以 $ 表示,不含 [host] 前置字元。換句話說,[host]$ 表示指令是在主機的終端機上執行,而 $ 則表示指令是在連線至目標元件的互動式殼層上執行。

本指南在大多數範例中,也會使用 /bootstrap/archivist (即路徑名稱) 做為目標元件。實作時,這個引數應替換為目標元件的元件 ID。

探索元件可用的功能

如要探索目標元件的功能,請前往元件互動式殼層中的 /ns 目錄。/ns 目錄包含元件的命名空間,與元件所見的命名空間完全相同,例如:

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

如要讓殼層的命名空間與元件命名空間相符,請使用 -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.ArchiveAccessor.feedback
fuchsia.diagnostics.ArchiveAccessor.legacy_metrics
fuchsia.diagnostics.ArchiveAccessor.lowpan
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.ArchiveAccessor.feedback
fuchsia.diagnostics.ArchiveAccessor.legacy_metrics
fuchsia.diagnostics.ArchiveAccessor.lowpan
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 環境:

為目前的工作階段新增工具

如要暫時新增工具,請使用 --tools 旗標將工具的套件網址傳遞至 ffx component explore 指令。

舉例來說,這會將 net-cli 工具組新增至 /core/network 元件的殼層,以供目前工作階段使用:

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

永久顯示工具

元件擁有者可以讓特定工具隨時供使用者使用。如要執行這項操作,請在元件資訊清單的 fuchsia.dash.launcher-tool-urls 構面中新增工具套件網址:

<rest of component manifest above>
facets: {
    "fuchsia.dash.launcher-tool-urls": [ "fuchsia-pkg://fuchsia.com/magma-debug-utils" ],
},

當使用者在這個元件上執行 ffx component explore 時,指令會自動從資訊清單解析並載入工具。使用者必須執行可提供指定工具的套件伺服器,否則會看到警告。

[host]$ ffx component explore <moniker>
Moniker: <moniker>
Using tool URLs from component manifest: ["fuchsia-pkg://fuchsia.com/magma-debug-utils"]
$

在元件的殼層上以非互動方式執行指令

如要在元件的裝置端殼層中以非互動方式執行指令,並接收 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 標記,殼層的命名空間會與元件的命名空間相符。

我可以使用 Dash Shell 存取 Zircon 控制代碼或發出 FIDL 呼叫嗎?

指令解譯器不直接支援這項操作。

如何為 ffx 元件探索功能提出要求?

請透過 ComponentFramework > Tools Issue Tracker 元件提出所有功能要求。