blob: 166adc7485c78a4de6084bc2310052f85b32dfd7 [file] [log] [blame] [view]
# Chrome Foundation Services
[TOC]
## Overview
This directory contains Chrome Foundation Services. If you think of Chrome as a
"portable OS," Chrome Foundation Services can be thought of as that OS'
foundational "system services" layer.
Roughly each subdirectory here corresponds to a service that:
* is a client of `//services/service_manager` with its own unique Identity.
* could logically run a standalone process for security/performance isolation
benefits depending on the constraints of the host OS.
## Service Directory Structure
Individual services are structured like so:
```
//services/foo/ <-- Implementation code, may have subdirs.
/public/
/cpp/ <-- C++ client libraries (optional)
/interfaces/ <-- Mojom interfaces
```
## Dependencies
Code within `//services` may only depend on each other via each other's
`/public/` directories, *i.e.* implementation code may not be shared directly.
Service code should also take care to tightly limit the dependencies on static
libraries from outside of `//services`. Dependencies to large platform
layers like `//content`, `//chrome` or `//third_party/WebKit` must be avoided.
## Physical Packaging
Note that while it may be possible to build a discrete physical package (DSO)
for each service, products consuming these services may package them
differently, e.g. by combining them into a single package.
## Additional Documentation
[High-level Design Doc](https://docs.google.com/document/d/15I7sQyQo6zsqXVNAlVd520tdGaS8FCicZHrN0yRu-oU)
[Servicification Homepage](https://sites.google.com/a/chromium.org/dev/servicification)
[Servicification Strategies](docs/servicification.md)
## Relationship To Other Top-Level Directories
Services can be thought of as integrators of library code from across the
Chromium repository, most commonly `//base` and `//mojo` (obviously) but for
each service also `//components`, `//ui`, *etc.* in accordance with the
functionality they provide.
Not everything in `//components` is automatically a service in its own right.
Think of `//components` as sort of like a `//lib`. Individual `//components` can
define, implement and use Mojom interfaces, but only `//services` have unique
identities with the Service Manager and so only `//services` make it possible
for Mojom interfaces to be acquired.
## Adding a new service
See the [Service Manager documentation](/services/service_manager) for more
details regarding how to define a service and expose or consume interfaces to
and from other services.
Please start a thread on [services-dev@chromium.org](https://groups.google.com/a/chromium.org/forum/#!forum/services-dev)
if you want to introduce a new service.
If you are servicifying existing Chromium code: Please first read the
[servicification strategies documentation](docs/servicification.md), which
contains information that will hopefully make your task easier.