summaryrefslogtreecommitdiff
path: root/chromium/components/component_updater/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/component_updater/README.md')
-rw-r--r--chromium/components/component_updater/README.md80
1 files changed, 80 insertions, 0 deletions
diff --git a/chromium/components/component_updater/README.md b/chromium/components/component_updater/README.md
new file mode 100644
index 00000000000..53ce47c7399
--- /dev/null
+++ b/chromium/components/component_updater/README.md
@@ -0,0 +1,80 @@
+# Component Updater
+
+## Overview
+The Component Updater is a piece of Chrome responsible for updating other pieces
+of Chrome. It runs in the browser process and communicates with a set of servers
+using the [Omaha](https://github.com/google/omaha) protocol to find the latest
+versions of components, download them, and register them with the rest of
+Chrome.
+
+The primary benefit of components is that they can be updated without an update
+to Chrome itself, which allows them to have faster (or desynchronized) release
+cadences, lower bandwidth consumption, and avoids bloat in the (already sizable)
+Chrome installer. The primary drawback is that they require Chrome to tolerate
+their absence in a sane way.
+
+In the normal configuration, the component updater registers all components
+during (or close to) browser start-up, and then begins checking for updates six
+minutes later, with substantial pauses between successive update application.
+
+## Terminology
+For the purposes of this document:
+
+ * A `component` is any element of Chrome's core functionality that is sometimes
+ delivered by the component updater separately from the browser itself,
+ usually as a dynamically-linked library or data file.
+ * A `crx file` is any file in the
+ [CRX package format](https://developer.chrome.com/extensions/crx).
+
+## Adding New Components
+This document covers the work that must be done on the client side. Additional
+work is necessary to integrate with the Omaha servers, and is covered in
+[Google-internal documentation](http://go/newchromecomponent).
+
+This assumes you've already done the hard work of splitting your functionality
+out into a dynamically-linked library or data file.
+
+### Create a CRX Package Signing Key & Manifest (Non-Google)
+All components are delivered as CRX files (signed ZIP archives). You need to
+create a signing key. If you are a Googler, follow the instructions at
+http://go/newchromecomponents for maximum key security. Otherwise, you can
+create an RSA key pair using `openssl` or a similar tool.
+
+You will additionally need to create a manifest.json file. If nothing else, the
+manifest file must specify the component's version and name. If you plan to
+release the component using Google infrastructure, this file can be generated
+for you automatically.
+
+### Writing an Installer
+The "installer" is a piece of Chrome code that the component updater will run to
+install or update the component. Installers live at
+`src/chrome/browser/component_updater`.
+
+You will need the SHA256 hash of the public key generated in the previous step,
+as well as the CRX ID, which consists of the first half (128 bits) of that hash,
+rendered as hexadecimal using the characters `a-p` (rather than `0-9a-f`).
+
+New components should use
+[`default_component_installer`](default_component_installer.h)
+if possible, as this provides you with transparent differential updates, version
+management, and more. You must provide a `ComponentInstallerTraits` object to
+a new `DefaultComponentInstaller`.
+[file\_type\_policies\_component\_installer.cc](../../chrome/browser/component_updater/file_type_policies_component_installer.cc)
+is a good example to work from.
+
+Components need to be registered with the component updater. This is done in
+[RegisterComponentsForUpdate](https://cs.chromium.org/chromium/src/chrome/browser/chrome_browser_main.cc).
+
+### Bundle with the Chrome Installer (Optional)
+If you need the guarantee that some implementation of your component is always
+available, you must bundle a component implementation with the browser itself.
+If you are using `DefaultComponentInstaller`, you simply need to make sure that
+your component implementation (and a corresponding manifest.json file) are
+written to DIR\_COMPONENTS as part of the build. The manifest.json file must
+state the version of this component implementation, and the files must be
+bitwise identical to the contents of any update CRX with that version for that
+platform, as the system will attempt to apply differential updates over these
+files.
+
+### Implement On-Demand or Just-In-Time Updates (Optional)
+Contact the component\_updater OWNERS.