| # Component manifests |
| |
| Caution: This document describes manifests for |
| [components v1](/docs/glossary.md#components-v1). The old architecture |
| (components v1) implemented by `appmgr` is still in use, but will be |
| removed once the transition to the new architecture is complete. |
| |
| A component manifest (.cmx) is a JSON file with the file extension `.cmx`. |
| Component manifests are often located in a package’s `meta/` directory. The |
| manifest contains information that declares how to run the component and what |
| resources it receives. In particular, the component manifest describes how |
| the component is sandboxed. |
| |
| Here's a simple example of a cmx for an ELF binary component: |
| |
| ``` |
| { |
| "program": { |
| "binary": "bin/example_app", |
| "args": [ "--example", "args" ] |
| }, |
| "sandbox": { |
| "system": [ "data/sysmgr" ], |
| "services": [ "fuchsia.sys.Launcher", "fuchsia.netstack.Netstack" ] |
| } |
| } |
| ``` |
| |
| And one for a flutter/dart component: |
| |
| ``` |
| { |
| "program": { |
| "data": "data/simple_flutter" |
| }, |
| "runner": "flutter_jit_runner" |
| } |
| ``` |
| |
| ## program |
| |
| The `program` property describes the resources to execute the component. |
| |
| If [`runner`](#runner) is absent, the `program` property is a JSON object with |
| the following schema: |
| |
| ``` |
| { |
| "type": "object", |
| "properties": { |
| "binary": { |
| "type": "string" |
| }, |
| "args": { |
| "type": "array", |
| "items": { |
| "type": "string" |
| }, |
| }, |
| "env_vars": { |
| "type": "array", |
| "items": { |
| "type": "string" |
| }, |
| }, |
| } |
| } |
| ``` |
| |
| The `binary` property describes where in the package namespace to find the |
| binary to run the component, and the optional `args` property contains the |
| string arguments to be provided to the process. The optional `env_vars` |
| property specifies environment variables to provide to the binary where |
| each element in the array uses the format `"VAR=VALUE"`, for example |
| `"RUST_BACKTRACE=1"`. |
| |
| If [`runner`](#runner) is present, `program` is a freeform string-string JSON |
| object interpreted as args to pass to the runner. |
| |
| For instance, for a flutter/dart component, its format is: |
| |
| ``` |
| { |
| "type": "object", |
| "properties": { |
| "data": { |
| "type": "string" |
| } |
| } |
| } |
| ``` |
| |
| Where `data` should describe the location of the flutter/dart binaries. By |
| default, it is under `data/<component-name>`. |
| |
| ## runner |
| |
| `runner` is an optional property that names another component (or a package |
| that contains one) to which execution is to be delegated. The target component |
| must expose the [`Runner`][runner] service. |
| |
| If `runner` is present, [`program`](#program) is a freeform string-string JSON |
| object interpreted as args to pass to the runner. |
| |
| If `runner` is absent, it is assumed that `program.binary` is an ELF binary or |
| shell script. |
| |
| The `runner` property is a JSON string. |
| |
| ## facets |
| |
| `facets` is an optional property that contains free-form JSON about the |
| component. Facets can be consumed by things on the system to acquire additional |
| metadata about a component. |
| |
| The schema for `facets` is: |
| |
| ``` |
| { |
| "type": "object" |
| } |
| ``` |
| |
| As an example of a facet, the `fuchsia.test` field is used to convey what |
| additional services should be |
| [injected into testing environments][test-components]. |
| |
| ## sandbox |
| |
| The `sandbox` property controls the environment in which the component |
| executes. Specifically, the property controls which directories the component |
| can access during execution. |
| |
| The `sandbox` property is a JSON object with the following schema: |
| |
| ``` |
| { |
| "type": "object", |
| "properties": { |
| "dev": { |
| "type": "array", |
| "items": { |
| "type": "string" |
| } |
| }, |
| "services": { |
| "type": "array", |
| "items": { |
| "type": "string" |
| } |
| }, |
| "system": { |
| "type": "array", |
| "items": { |
| "type": "string" |
| } |
| }, |
| "pkgfs": { |
| "type": "array", |
| "items": { |
| "type": "string" |
| } |
| }, |
| "features": { |
| "type": "array", |
| "items": { |
| "type": "string" |
| } |
| } |
| } |
| } |
| ``` |
| |
| The `dev` array contains a list of well-known device directories that are |
| provided to the component. For example, if the string `class/input` appears in |
| the `dev` array, then `/dev/class/input` will appear in the namespaces of components |
| loaded from the package. To allow access to a `misc` device, add the string `misc` |
| to the `dev` array. Allowing access to individual `misc` devices is not possible. |
| |
| The `system` array contains a list of well-known paths within the system package |
| that are provided to the component. For example, if the string `bin` appears |
| in the `system` array, then `/system/bin` will appear in the namespaces of |
| components loaded from the package. |
| |
| The `pkgfs` array contains a list of well-known paths within the pkgfs tree |
| that are provided to the component. For example, if the string `versions` |
| appears in the `pkgfs` array, then `/pkgfs/versions` will appear in the |
| namespaces of components loaded from the package, providing access to all |
| packages fully cached on the system. |
| |
| The `services` array defines a list of services from `/svc` that the |
| component may access. A typical component will require a number services from |
| `/svc` in order to play some useful role in the system. For example, if |
| `"services" = [ "fuchsia.sys.Launcher", "fuchsia.netstack.Netstack" ]`, the |
| component will have the ability to launch other components and access network |
| services. A component may declare any list of services in its `services`, |
| but it will only be able to access services present in its |
| [environment](/docs/glossary.md#environment). This property should be defined by |
| all new components, and soon a migration will take place to convert all |
| components to define `services`. |
| |
| The `features` array contains a list of well-known features that the package |
| wishes to use. Including a feature in this list is a request for the environment |
| in which the contents of the package execute to be given the resources required |
| to use that feature. |
| |
| The set of currently known features are as follows: |
| |
| - `config-data`, which will provide any configuration data available to the |
| package this component is in that was provided in the [config-data](/docs/development/components/config_data.md) |
| package on the system. |
| |
| - `introspection`, which requests access to introspect the system. The |
| introspection namespace will be located at `/info_experimental`. |
| |
| - `isolated-persistent-storage`, which requests access to persistent storage for |
| the device, located in `/data` in the package's namespace. This storage is |
| isolated from the storage provided to other components. |
| |
| - `isolated-cache-storage`, which requests access to persistent storage for the |
| device, located in `/cache` in the package's namespace. This storage is |
| isolated from the storage provided to other components. Unlike |
| `isolated-persistent-storage`, items placed in the storage provided by this |
| feature will be deleted by the system to reclaim space when disk usage is |
| nearing capacity. |
| |
| - `isolated-temp`, which requests that a temp directory be installed into the |
| component's namespace at `/tmp`. This is isolated from the system temp and |
| the temp directories of other component instances. This directory is backed by |
| an in-memory filesystem, and is thus cleared on device reboots. |
| |
| - `root-ssl-certificates`, which requests access to the root SSL certificates |
| for the device. These certificates are provided in the `/config/ssl` directory |
| in the package's namespace. |
| |
| - `hub`, which requests access to the [Hub directory](/docs/concepts/framework/hub.md) |
| scoped to the component instance's realm. |
| |
| - `deprecated-shell`, which requests access to the resources appropriate for an |
| interactive command line. Typically, shells are granted access to all the |
| resources available in the current environment. The `deprecated-shell` feature |
| also implies the `root-ssl-certificates` and `hub` features. |
| As the name suggests, this feature is to be removed. Current uses of this |
| feature are explicitly allowlisted, and new uses are discouraged. |
| |
| - `shell-commands`, which requests access to the currently available shell |
| binaries (note: not "installed", but "available"). Binaries are mapped into |
| `/bin` in the requesters namespace. Running these commands may require the |
| `fuchsia.process.Resolver` and `fuchsia.process.Launcher` services also |
| be requested. |
| |
| - `vulkan`, which requests access to the resources required to use the Vulkan |
| graphics interface. This adds layer configuration data in the `/config/vulkan` |
| directory in the package's namespace. |
| |
| - `deprecated-ambient-replace-as-executable`, which provides legacy support for |
| using the invalid handle with replace_as_executable. |
| |
| - `factory-data`, which requests access to the read-only factory partition for |
| the device and places it at `/factory` in the component's namespace. |
| |
| - `durable-data`, which requests access to the read-write durable partition for |
| the device and places it at `/durable` in the component's namespace. This |
| partition is for storing persistent data that will survive a factory reset, |
| and is only to be used for specific, approved use cases. |
| |
| See [sandboxing.md](/docs/concepts/framework/sandboxing.md) for more information about sandboxing. |
| |
| [runner]: /sdk/fidl/fuchsia.sys/runner.fidl |
| [test-components]: /docs/concepts/testing/tests_as_components.md |