撰寫 "Hello World" 課程

工作階段是一般元件,session_manager可在 啟動。也就是說,建立工作階段元件時 可能與建立其他元件一樣重要本文件探討如何建立 會在啟動時啟動,並顯示「Hello World!」的範例工作階段傳送至系統 。

建立目錄結構

元件需要特定的目錄結構。fx 工具提供了 可為您建立這個結構的產生器該函式會使用 以及要做為引數的語言舉例來說 元件稱為 hello-world-session,以 Rust 編寫。

執行下列指令,建立這個範例的目錄結構:

fx create component --path hello-world-session --lang rust

這個指令會建立下列目錄結構以及 元件:

hello-world-session
  |- meta
  |   |- hello-world-session.cml
  |
  |- src
  |   |- main.rs
  |
  |- BUILD.gn

建立元件資訊清單

元件資訊清單檔案 (hello-world-session.cml) 會宣告元件 到 Fuchsia 的體驗。在這個範例中,預設的資訊清單就已足夠,但 立即探索 hello-world-session.cml 提供的下列程式碼:

  1. 如有需要,檔案一開始會納入其他 cml 檔案。

    include: [
        "inspect/client.shard.cml",
        "syslog/client.shard.cml",
    ],
    
    

    這個 include 鍵可讓工作階段元件使用 fuchsia.logger.LogSink 能力,以便在系統記錄中列印。

  2. 接下來是 program 區塊。

    // Information about the program to run.
    program: {
        // Use the built-in ELF runner to run native binaries.
        runner: "elf",
    
        // The binary to run for this component.
        binary: "bin/hello-world-session",
    },
    
    

    program 區塊會告知 component_manager, 工作階段元件runner 鍵會告知 component_manager 應該使用 ELF 執行器執行元件二進位檔。

  3. 最後,元件資訊清單會說明 元件可以是 useofferexpose

    // Capabilities used by this component.
    use: [
        // List your component's dependencies here, ex:
        // { protocol: "fuchsia.net.name.Lookup" }
    ],
    expose: [
        // session_manager uses this protocol to start the session.
        {
            protocol: "fuchsia.component.Binder",
            from: "framework",
        },
    ],
    
    

在 Rust 中編寫工作階段

您現在可以為工作階段元件編寫實作內容。內部 產生的 src/main.rs 檔案有許多非必要程式碼 在本例中

src/main.rs 的內容替換為以下程式碼:

use anyhow::Error;

/// Creates a simple session that just prints "Hello World" to the syslog.
#[fuchsia::main(logging = true)]
async fn main() -> Result<(), Error> {
    tracing::info!("Hello World!");

    Ok(())
}

這個程式碼會初始化系統記錄,然後顯示「Hello World!」。 tracing::info! 是一個巨集,會輸出層級 info 的記錄檔。 errorwarn 也有類似的巨集。

寫入 BUILD.gn

最後要修改的檔案是 BUILD.gn。這會指示編譯器 工作階段元件

Rust 二進位檔

下一節將說明實際的 Rust 二進位檔。會告知編譯器 二進位檔的名稱,應包括單元測試和依附元件 以及其來源的所在位置本例中,預設是 但依附元件就足夠:

rustc_binary("bin") {
  edition = "2021"
  output_name = "hello-world-session"

  # Generates a GN target for unit-tests with the label `bin_test`, and
  # a binary named `hello_world_session_bin_test`.
  with_unit_tests = true

  deps = [
    "//src/lib/fuchsia",
    "//third_party/rust_crates:anyhow",
    "//third_party/rust_crates:tracing",
  ]

  sources = [ "src/main.rs" ]
}

fuchsia_component()fuchsia_package() 範本讓 Fuchsia 更進一步 包括呼叫的元件、取得資訊清單的位置 以及套件和元件有哪些依附元件

fuchsia_component("component") {
  component_name = "hello-world-session"
  manifest = "meta/hello-world-session.cml"
  deps = [ ":bin" ]
}

fuchsia_package("hello-world-session") {
  deps = [ ":component" ]
}

識別工作階段網址

session_manager 必須知道要在啟動時啟動哪個工作階段元件, ,只要提供工作階段的元件網址即可。

元件網址須符合下列格式:

fuchsia-pkg://fuchsia.com/package_name#meta/component_name.cm

請注意,路徑會指向 .cm 檔案。.cm 個檔案是編譯版本 執行 fx build 時產生的 .cml 個檔案。在這個例子中 元件網址如下:

fuchsia-pkg://fuchsia.com/hello-world-session#meta/hello-world-session.cm

建構課程

如要建構工作階段 fx set,必須先用於設定版本, 包含 session_manager、工作階段元件和工作階段設定 導入基本套件。方法是使用 --with-base 旗標。工作階段 您還必須使用 --args 旗標來設定網址。

fx set core.x64 \
    --with-base //src/session/bin/session_manager \
    --with-base //path/to/your/session \
    --args=product_config.session_url = "fuchsia-pkg://fuchsia.com/<var>package_name</var>#meta/<var>component_name</var>.cm"

如要使用 //src/session/examples 目錄中的範例專案, fx set 指令如下:

fx set core.x64 \
    --with-base //src/session/bin/session_manager \
    --with-base //src/session/examples/hello-world-session \
    --args=product_config.session_url = "fuchsia-pkg://fuchsia.com/hello-world-session#meta/hello-world-session.cm"

完成後並建構 session_manager 後,應用程式就會自動啟動 工作階段時畫面上應該會顯示「Hello」(您好)訊息。

$ ffx log --filter hello
[session_manager] INFO: Launching session: fuchsia-pkg://fuchsia.com/hello-world-session#meta/hello-world-session.cm
[hello_world_session] INFO: Hello World!