|  | # Introduction to Fuchsia components | 
|  |  | 
|  | <<../_v2_banner.md>> | 
|  |  | 
|  | ## Overview | 
|  |  | 
|  | This document offers a brief conceptual overview of Components and the | 
|  | Component Framework. | 
|  |  | 
|  | In Fuchsia, _[component][glossary.component]_ is the term for the common | 
|  | abstraction that defines how all software[^1] (regardless of source, | 
|  | programming language, or runtime) is described, sandboxed, and executed on a | 
|  | Fuchsia system. | 
|  |  | 
|  | [^1]: With the exception of early-boot software necessary to run components. | 
|  |  | 
|  | ### What is sandboxing? | 
|  |  | 
|  | Sandboxing is a security mechanism to isolate programs from each other at | 
|  | runtime. In Fuchsia, all software is sandboxed. When a program is initially | 
|  | created, it does not have the ability to do anything -- not even to allocate | 
|  | memory. The program relies on its creator to provide the capabilities needed | 
|  | for it to execute. This isolation property allows Fuchsia to employ the | 
|  | _principle of least privilege_: programs are provided only the minimal set | 
|  | of capabilities needed to execute. | 
|  |  | 
|  | ## Component Framework | 
|  |  | 
|  | The Component Framework (CF) consists of the core concepts, tools, APIs, | 
|  | runtime, and libraries necessary to describe and run components and to | 
|  | coordinate communication and access to resources between components. | 
|  |  | 
|  | The Component Framework includes: | 
|  |  | 
|  | -   CF concepts, including _component_, _component manifest_, | 
|  | _runner_, _realm_, _environment_, _capabilities_, and _resolver_. | 
|  | -   The [`component_manager`][doc-component-manager] process, which coordinates | 
|  | the communication and sharing of resources between components. | 
|  | -   [FIDL APIs](#fidl-apis) implemented by `component_manager`, or implemented | 
|  | by other components and used by `component_manager`, for the purposes of | 
|  | coordination. | 
|  | -   Developer tools to build, execute, and test components. | 
|  | -   Language-specific libraries for components to use to | 
|  | interact with the system. ([example](/sdk/lib/sys)) | 
|  | -   Testing tools and libraries to write unit and integration tests that | 
|  | exercise one or many components. | 
|  | ([example][doc-realm-builder]) | 
|  |  | 
|  | ## Capabilities | 
|  |  | 
|  | Since Fuchsia is a capability-based operating system, components interact with | 
|  | each other through the use of _[capabilities][glossary.capability]_. | 
|  | A capability combines access to a resource and a set of rights, providing both a | 
|  | mechanism for access control and a means by which to interact with the resource. | 
|  |  | 
|  | To support the complex composition of software present in today's products, the | 
|  | Component Framework provides distinct [capability types][doc-capabilities] built | 
|  | upon Zircon [kernel objects][glossary.kernel-object]. | 
|  | A common representation of a capability is a [channel][glossary.channel] that | 
|  | speaks a particular [FIDL][glossary.fidl] protocol. | 
|  |  | 
|  | The Component Framework assembles the _[namespace][glossary.namespace]_ for a | 
|  | component using [component declarations][glossary.component-declaration] that | 
|  | describe the capabilities the component requires to function. | 
|  | Components can discover the available capabilities in their namespace using the | 
|  | [`fuchsia.io.Directory`][fidl-directory] protocol. | 
|  |  | 
|  | At runtime, every component receives its namespace as well as a handle to the | 
|  | server end of a `Directory` channel. This `Directory` channel is called the | 
|  | the _[outgoing directory][glossary.outgoing-directory]_. Through the | 
|  | outgoing directory, the component's executable makes discoverable any | 
|  | capabilities that it provides. | 
|  |  | 
|  | The Component Framework brokers discovery from a providing component's | 
|  | outgoing directory to a consuming component's namespace through a process called | 
|  | _[capability routing][glossary.capability-routing]_. | 
|  | While most capabilities are routed to component instances, _runner_ and | 
|  | _resolver_ capabilities are routed to _[environments][glossary.environment]_. | 
|  | Environments configure the behavior of the framework for the realms to which | 
|  | they are assigned. | 
|  |  | 
|  | Note: In the Fuchsia process layer, "having a capability" means the process | 
|  | holds a handle to the kernel object capability in its handle table. In the | 
|  | Component Framework, we often use "having a capability" to mean that the | 
|  | capability is discoverable through the component's namespace at runtime. | 
|  |  | 
|  | Further reading: | 
|  |  | 
|  | * [Zircon kernel objects][doc-kernel-objects] | 
|  | * [Component Framework capabilities][doc-capabilities] | 
|  | * [Environments][doc-environments] | 
|  |  | 
|  | ## Components | 
|  |  | 
|  | _Components_ are the foundational building blocks of software running in Fuchsia. | 
|  | Each component is a composable, sandboxed module that interacts with other | 
|  | components through capabilities. | 
|  |  | 
|  | At its core, a component consists of the following: | 
|  |  | 
|  | * A [Component URL][glossary.component-url], which uniquely identifies that | 
|  | component. | 
|  | * A [Component manifest][glossary.component-manifest], which describes how to | 
|  | launch the component, as well as any capability routes. | 
|  |  | 
|  | The Component Framework relies on _component resolvers_ to retrieve components | 
|  | from their origin. Resolvers take a component URL as an input and produce a | 
|  | component manifest and (optionally) an access mechanism to the bytes of a | 
|  | software package as output. | 
|  |  | 
|  | Components that include an executable program may specify any runtime | 
|  | (such as a raw process or a virtual machine) provided to the Component Framework | 
|  | through a _[component runner][glossary.runner]_. Runners consume parts of the | 
|  | manifest and the package, and provide the component's binary with a way to | 
|  | execute. | 
|  |  | 
|  | Note: Components without an executable program may still route capabilities and | 
|  | host children, but no code will be executed for the component. | 
|  |  | 
|  | Resolvers and runners are themselves capabilities and interact directly with the | 
|  | framework to extend its functionality. Components can implement these | 
|  | capabilities to add support for new component origins and runtimes. | 
|  |  | 
|  | Note: To bootstrap the system, `component_manager` includes a built-in | 
|  | resolver, the `boot-resolver`, which resolves `fuchsia-boot://` URLs to | 
|  | manifests on the boot image, as well as a built-in runner, the ELF runner, | 
|  | which executes ELF binaries stored in signed Fuchsia packages. | 
|  |  | 
|  | Further reading: | 
|  |  | 
|  | * [Component manager][doc-component-manager] | 
|  | * [Resolver capability][doc-resolvers] | 
|  | * [Runner capability][doc-runners] | 
|  | * [Fuchsia packages][doc-packages] | 
|  |  | 
|  | ### Composition | 
|  |  | 
|  | A component together with its children are referred to as a | 
|  | _[realm][glossary.realm]_. | 
|  | The collective [parent][glossary.parent-component-instance] and | 
|  | [child][glossary.child-component-instance] relationships of all individual | 
|  | components are referred to as the | 
|  | _[component instance tree][glossary.component-instance-tree]_. | 
|  | A _[moniker][glossary.moniker]_ is a topological path that identifies a specific | 
|  | component instance within a component instance tree. You will often see | 
|  | monikers represented as POSIX-like path strings. | 
|  |  | 
|  | _[Component topology][glossary.component-topology]_ is the term for the | 
|  | component instance tree and the collective capability routes over that tree. | 
|  |  | 
|  | Further reading: | 
|  |  | 
|  | * [Component topology][doc-topology] | 
|  | * [Realms][doc-realms] | 
|  |  | 
|  | ### Lifecycle | 
|  |  | 
|  | Components move through the following lifecycle states: | 
|  |  | 
|  | * Discovered | 
|  | * Started | 
|  | * Stopped | 
|  | * Destroyed | 
|  |  | 
|  | Components are discovered either a) by virtue of being statically declared as a | 
|  | child of another component in a component manifest, or b) by being added to a | 
|  | [component collection][glossary.component-collection] at runtime. Similarly, | 
|  | components are destroyed implicitly by being removed from the list of static | 
|  | children in a component manifest, or explicitly by being removed from a | 
|  | component collection at runtime. | 
|  |  | 
|  | When a component is started or stopped, `component_manager` coordinates with | 
|  | the appropriate runner to execute or terminate the component's executable. | 
|  |  | 
|  | Further reading: | 
|  |  | 
|  | * [Component lifecycle][doc-lifecycle] | 
|  |  | 
|  | [fidl-directory]: https://fuchsia.dev/reference/fidl/fuchsia.io#Directory | 
|  | [glossary.capability]: /docs/glossary#capability | 
|  | [glossary.handle]: /docs/glossary#handle | 
|  | [glossary.channel]: /docs/glossary#channel | 
|  | [glossary.realm]: /docs/glossary#realm | 
|  | [glossary.environment]: /docs/glossary#environment | 
|  | [glossary.outgoing-directory]: /docs/glossary#outgoing-directory | 
|  | [glossary.moniker]: /docs/glossary#moniker | 
|  | [glossary.runner]: /docs/glossary#runner | 
|  | [glossary.parent-component-instance]: /docs/glossary#parent-component-instance | 
|  | [glossary.child-component-instance]: /docs/glossary#child-component-instance | 
|  | [glossary.component-collection]: /docs/glossary#component-collection | 
|  | [glossary.component-manifest]: /docs/glossary#component-manifest | 
|  | [glossary.component-url]: /docs/glossary#component-url | 
|  | [glossary.component-instance-tree]: /docs/glossary#component-instance-tree | 
|  | [glossary.component-topology]: /docs/glossary#component-topology | 
|  | [glossary.namespace]: /docs/glossary#namespace | 
|  | [glossary.component-declaration]: /docs/glossary#component-declaration | 
|  | [glossary.kernel-object]: /docs/glossary#kernel-object | 
|  | [glossary.capability-routing]: /docs/glossary#capability-routing | 
|  | [glossary.fidl]: /docs/glossary#fidl | 
|  | [doc-capabilities]: /docs/concepts/components/v2/capabilities/README.md | 
|  | [doc-kernel-objects]: /docs/reference/kernel_objects/objects.md | 
|  | [doc-storage-capability]: /docs/concepts/components/v2/capabilities/storage.md | 
|  | [doc-component-manager]: /docs/concepts/components/v2/component_manager.md | 
|  | [doc-declarations]: /docs/concepts/components/v2/component_manifests.md#component-declaration | 
|  | [doc-design-principles]: /docs/concepts/components/v2/design_principles.md | 
|  | [doc-environments]: /docs/concepts/components/v2/environments.md | 
|  | [doc-instances]: /docs/concepts/components/v2/topology.md#component-instances | 
|  | [doc-lifecycle]: /docs/concepts/components/v2/lifecycle.md | 
|  | [doc-realm-builder]: /docs/development/testing/components/realm_builder.md | 
|  | [doc-realms]: /docs/concepts/components/v2/realms.md | 
|  | [doc-runners]: /docs/concepts/components/v2/capabilities/runners.md | 
|  | [doc-resolvers]: /docs/concepts/components/v2/capabilities/resolvers.md | 
|  | [doc-topology]: /docs/concepts/components/v2/topology.md | 
|  | [doc-packages]: /docs/concepts/packages/package.md |