Add BUILD.md doc.
Change-Id: I42b9b30b531afc79fc01d23566ddb7cced783a92
diff --git a/BUILD.md b/BUILD.md
new file mode 100644
index 0000000..a2271c0
--- /dev/null
+++ b/BUILD.md
@@ -0,0 +1,214 @@
+# R8 Build System Architecture & Overview
+
+This document provides an overview of the build architecture.
+
+---
+
+## Build Design
+
+The build setup follows these core principles:
+
+- **Hermetic:** Builds only download against Google resources (located in
+ [`third_party/`](./third_party)).
+- **Layered Tooling:**
+ - **Python Drivers** ([`tools/gradle.py`](./tools/gradle.py),
+ [`tools/test.py`](./tools/test.py), etc.) ensure pre-builts (JDKs,
+ Gradle binaries, local Maven caches) from Google Cloud Storage (GCS)
+ before invoking Gradle.
+ - **Gradle Project** (located under [`d8_r8/`](./d8_r8)) coordinates the
+ actual build.
+- **Bootstrapping:** The official compiler jar is compiled with R8.
+- **Testing what you release:** Tests run against the official bootstrapped and
+ optimized [`r8lib.jar`](./build/libs/r8lib.jar) release artifact rather than a
+ debug build.
+
+---
+
+## The Build Process
+
+```
++---------------------------------------------------------------------------------------+
+| R8 COMPILER SUITE |
++---------------------------------------------------------------------------------------+
+
+ [main] ───────────────────────────> threading-module-blocking.jar ───────┐
+ [main] ───────────────────────────> threading-module-single-threaded.jar ┼──> deps.jar
+ [third_party], [resourceshrinker] ───────────────────────────────────────┘ │
+ │
+ [keepradius], [libanalyzer] ────────────────────────────────────────> proto.jar │
+ │ │
+ [main], [keepanno], [resourceshrinker], │ │
+ [keepradius], [libanalyzer], [assistant] ──┬──> r8-src.jar │ │
+ │ │ │
+ └──> r8-full-exclude-deps.jar │ │
+ r8lib-exclude-deps.jar <──────┘ │ │ │
+ ▲ ▼ │ │
+ │ r8.jar <─────────────┴───────┘
+ │ / \
+ │ ▼ ▼
+ [tests] ───────────────> test-references ─--> r8lib.jar processkeepruleslib.jar
+ │
+ ▼
+ r8lib.zip
+
++---------------------------------------------------------------------------------------+
+| KEEP ANNOTATIONS TOOLS |
++---------------------------------------------------------------------------------------+
+
+ [keepanno] ──┬──> keepanno-annotations.jar
+ ├──> keepanno-annotations-legacy.jar
+ ├──> keepanno-annotations-androidx.jar
+ └──> keepanno-tools.jar ──> keepanno-toolslib.jar
+
++---------------------------------------------------------------------------------------+
+| DESUGAR CONFIGURATION |
++---------------------------------------------------------------------------------------+
+
+ [library_desugar] ──> desugar_jdk_libs_configuration.zip
+```
+
+### R8 Compiler Suite
+
+- [`r8lib.zip`](./build/libs/r8lib.zip):
+ - Released: To GMaven for distribution to AGP and other build systems.
+ - What: The Maven repository archive for the compiler.
+ - How: Package [`r8lib.jar`](./build/libs/r8lib.jar) with POM and checksum
+ files in a Maven repository layout.
+- [`r8lib.jar`](./build/libs/r8lib.jar):
+ - Released: The primary production compiler JAR.
+ - What: The relocated, standalone, optimized compiler JAR.
+ - How: [`r8.jar`](./build/libs/r8.jar) is compiled and optimized with R8 with
+ respect to declared keep rules and dynamic keep rules from `test-references`.
+- [`r8.jar`](./build/libs/r8.jar):
+ - Released: The non-optimized production compiler JAR.
+ - What: The relocated, standalone compiler JAR.
+ - How: [`r8-full-exclude-deps.jar`](./build/libs/r8-full-exclude-deps.jar)
+ and [`proto.jar`](./build/libs/proto.jar) are bundled together, along with
+ dependencies in [`deps.jar`](./build/libs/deps.jar) relocated under
+ `com.android.tools.r8.*`.
+- [`r8lib-exclude-deps.jar`](./build/libs/r8lib-exclude-deps.jar):
+ - Released: Published for build systems (such as internal Google repo)
+ that manage and provide their own dependencies on the classpath.
+ - What: The optimized compiler JAR without dependencies (note the special
+ proto and threading modules (part of [`deps.jar`](./build/libs/deps.jar))
+ that are not generic dependencies).
+ - How: [`r8-full-exclude-deps.jar`](./build/libs/r8-full-exclude-deps.jar)
+ is compiled and optimized with R8 with respect to declared keep rules and
+ dynamic keep rules from `test-references`, using
+ [`deps.jar`](./build/libs/deps.jar) and
+ [`proto.jar`](./build/libs/proto.jar) as classpath.
+- `test-references`:
+ - What: Dynamically generated keep rules extracted from test references.
+ - How: Trace compiler references from the test suite to preserve compiler
+ internals accessed during testing.
+- [`r8-full-exclude-deps.jar`](./build/libs/r8-full-exclude-deps.jar):
+ - Released: Published as an unoptimized compiler JAR without third-party
+ dependencies for custom downstream packaging.
+ - What: The compiler JAR without dependencies.
+ - How: Compile classes from
+ [`main`](./d8_r8/main),
+ [`keepanno`](./d8_r8/keepanno),
+ [`resourceshrinker`](./d8_r8/resourceshrinker),
+ [`keepradius`](./d8_r8/keepradius),
+ [`libanalyzer`](./d8_r8/libanalyzer),
+ and [`assistant`](./d8_r8/assistant).
+- [`r8-src.jar`](./build/libs/r8-src.jar):
+ - Released: Published to provide source code for IDE navigation, debugging,
+ and open-source compliance.
+ - What: The compiler sources JAR.
+ - How: Package sources from
+ [`main`](./d8_r8/main),
+ [`keepanno`](./d8_r8/keepanno),
+ [`resourceshrinker`](./d8_r8/resourceshrinker),
+ [`keepradius`](./d8_r8/keepradius),
+ [`libanalyzer`](./d8_r8/libanalyzer),
+ and [`assistant`](./d8_r8/assistant).
+- [`deps.jar`](./build/libs/deps.jar):
+ - What: The JAR containing third-party dependencies, resource shrinker
+ dependencies, threading modules, and consolidated licensing.
+ - How: Runtime dependencies from [`third_party/`](./third_party),
+ resource shrinker dependencies from
+ [`resourceshrinker`](./d8_r8/resourceshrinker),
+ [`threading-module-blocking.jar`](./build/libs/threading-module-blocking.jar),
+ [`threading-module-single-threaded.jar`](./build/libs/threading-module-single-threaded.jar),
+ and the consolidated `LICENSE` file are merged together.
+- [`proto.jar`](./build/libs/proto.jar):
+ - What: The JAR containing compiled protobuf classes used for keep rule
+ radius and library analysis data models. These are only needed for optional
+ analysis features. Users without this dependency must compile the published
+ `.proto` schemas directly using their own toolchains.
+ - How: Protobuf classes from [`keepradius`](./d8_r8/keepradius) and
+ [`libanalyzer`](./d8_r8/libanalyzer) are bundled together.
+- [`threading-module-blocking.jar`](./build/libs/threading-module-blocking.jar):
+ - Released: Published as an optional runtime module providing multi-threaded
+ execution for modular classpath environments.
+ - What: The multi-threaded execution provider. It is packaged separately so
+ the concurrency model can be controlled via classpath. This is useful to
+ have a compiler without code even mentioning blocking code (for aggressive
+ code checkers).
+ - How: Package blocking provider classes from [`main`](./d8_r8/main).
+- [`threading-module-single-threaded.jar`](./build/libs/threading-module-single-threaded.jar):
+ - Released: Published as an optional runtime module providing single-threaded
+ execution for environments that prohibit blocking code.
+ - What: The single-threaded execution provider. (see
+ [`threading-module-blocking.jar`](./build/libs/threading-module-blocking.jar))
+ - How: Package single-threaded provider classes from [`main`](./d8_r8/main).
+- [`processkeepruleslib.jar`](./build/libs/processkeepruleslib.jar):
+ - Released: Published as a standalone optimized tool for parsing, evaluating,
+ and filtering ProGuard keep rules.
+ - What: The standalone, optimized tool JAR used to process and filter ProGuard
+ keep rules.
+ - How: [`r8.jar`](./build/libs/r8.jar) is compiled and optimized with R8 using
+ `src/main/keep_processkeeprules.txt`.
+
+### Keep Annotations Tools
+
+- [`keepanno-toolslib.jar`](./build/libs/keepanno-toolslib.jar):
+ - Released: Published as a standalone, optimized library for processing keep
+ annotations in build pipelines.
+ - What: The relocated, standalone, optimized keep-annotation tools JAR.
+ - How: [`keepanno-tools.jar`](./build/libs/keepanno-tools.jar) is compiled and
+ optimized with R8 with respect to keep rules, using unrelocated ASM on the
+ classpath.
+- [`keepanno-tools.jar`](./build/libs/keepanno-tools.jar):
+ - Released: Published as an unminified standalone JAR with relocated
+ dependencies for keep-annotation processing and debugging.
+ - What: The standalone JAR containing tools for processing keep annotations
+ with non-ASM dependencies relocated under
+ `com.android.tools.r8.keepanno.*`. ASM is kept external as it is used as the
+ public API interface.
+ - How: Compiled classes from [`keepanno`](./d8_r8/keepanno) and its non-ASM
+ dependencies are bundled together, with dependencies relocated under
+ `com.android.tools.r8.keepanno.*` (leaving ASM external for public API
+ integration).
+- [`keepanno-annotations.jar`](./build/libs/keepanno-annotations.jar):
+ - Released: Published as the compile-time annotations library for source
+ code declaring keep annotations in
+ `com.android.tools.r8.keepanno.annotations.*`.
+ - What: The annotation library containing keep-annotation definitions
+ (`com.android.tools.r8.keepanno.annotations.*`).
+ - How: Package compiled annotation classes from [`keepanno`](./d8_r8/keepanno).
+- [`keepanno-annotations-legacy.jar`](./build/libs/keepanno-annotations-legacy.jar):
+ - Released: Published for backward compatibility with projects using legacy
+ keep-annotation package namespaces.
+ - What: The legacy package variant of the keep-annotations library.
+ - How: Package compiled legacy annotation classes from
+ [`keepanno`](./d8_r8/keepanno).
+- [`keepanno-annotations-androidx.jar`](./build/libs/keepanno-annotations-androidx.jar):
+ - Released: Published for AndroidX projects using the
+ `androidx.annotation.keep.*` package namespace.
+ - What: The AndroidX package variant (`androidx.annotation.keep.*`) of the
+ keep-annotations library.
+ - How: Package compiled AndroidX keep-annotation classes from
+ [`keepanno`](./d8_r8/keepanno).
+
+### Desugar Configuration
+
+- [`desugar_jdk_libs_configuration.zip`](./build/libs/desugar_jdk_libs_configuration.zip):
+ - Released: Published to GMaven to configure Java standard library desugaring
+ in D8 and R8 (along with JDK 11, minimal, and NIO variants).
+ - What: The Maven repository archive containing the configuration JAR and POM.
+ - How: Package the desugar specification JSON, generated lint metadata, and
+ compiled conversion classes from
+ [`library_desugar`](./d8_r8/library_desugar) with POM and checksum files in
+ a Maven repository layout.