Component Runners

Component runners extend the component framework through an environment to provide a runtime for launching new component instances.

Component manager launches components by sending a request containing ComponentStartInfo to the appropriate runner using the fuchsia.component.runner.ComponentRunner protocol. The ComponentStartInfo contains details about the component‘s executable and its namespace. The runner manages the component’s execution within the supported runtime.

After starting the component, component manager uses the fuchsia.component.runner.ComponentController protocol provided in the Start request to send execution actions to the runner, such as stopping the component. The runner chooses how to interpret these commands as appropriate to the component runtime.

Providing runner capabilities

To provide a runner capability, a component must declare a runner capability, whose path designates a FIDL protocol implementing fuchsia.component.runner.ComponentRunner served from the component's outgoing directory.

{
    capabilities: [
        {
            runner: "web",
            path: "/svc/fuchsia.component.runner.ComponentRunner",
        },
    ],
}

Component manager sends ComponentRunner/Start requests to this protocol. Each request includes a ComponentController channel which the runner should serve to handle lifecycle events for the component.

Routing runner capabilities

Components route runner capabilities by exposing them to their parent and offering them to their children.

For more details on how the framework routes component capabilities, see capability routing.

Exposing

Exposing a runner capability gives the component's parent access to that capability:

{
    expose: [
        {
            runner: "web",
            from: "self",
        },
    ],
}

You may optionally specify:

Offering

Offering a runner capability gives a child component access to that capability:

{
    offer: [
        {
            runner: "web",
            from: "self",
            to: [ "#child-a" ],
        },
    ],
}

You may optionally specify:

Registering a component runner

Component runners are made available to components through their environment. To register a new runner within an environment, add a new entry to the runners section of the environments declaration:

environments: [
    {
        name: "my-environ",
        extends: "realm",
        runners: [
            {
                runner: "web",
                from: "parent",
            },
        ],
    },
]

You may optionally specify:

For more details on how to apply environments to components, see the environments documentation.

Selecting a runner

A component specifies the appropriate runner for execution using the program section of its manifest. The program section designates the runner as well as any runner-specific options. The runner must be registered in the component's environment.

For example, a component which runs as a web page might have a program like the following:

program: {
    runner: "web",
    mode: "incognito",
},

When the component manager attempts to launch this component, it will send a request to the provider of the web runner to start it.

Renaming runners

You may expose, offer, or register the runner capability under a different name using the as parameter:

{
    expose: [
        {
            runner: "web",
            from: "#chromium",
            as: "web-chromium",
        },
    ],
}

Framework runners

Component framework provides the following built-in component runners:

  • ELF runner: Runs binaries compiled to the ELF file format.
{
    program: {
        runner: "elf",
        binary: "bin/example",
    },
}