Add D8 support

Bug: 67754178
Test: m -j32 checkbuild && USE_D8=true m -j32 checkbuild

Change-Id: If63afc10ceb5e753bbb7f195bb8a895eaef10775
diff --git a/android/package_ctx.go b/android/package_ctx.go
index 6743fb3..f781dd4 100644
--- a/android/package_ctx.go
+++ b/android/package_ctx.go
@@ -117,15 +117,23 @@
 // package-scoped variable's initialization.
 func (p AndroidPackageContext) HostBinToolVariable(name, path string) blueprint.Variable {
 	return p.VariableFunc(name, func(config interface{}) (string, error) {
-		ctx := &configErrorWrapper{p, config.(Config), []error{}}
-		p := PathForOutput(ctx, "host", ctx.config.PrebuiltOS(), "bin", path)
-		if len(ctx.errors) > 0 {
-			return "", ctx.errors[0]
+		po, err := p.HostBinToolPath(config, path)
+		if err != nil {
+			return "", err
 		}
-		return p.String(), nil
+		return po.String(), nil
 	})
 }
 
+func (p AndroidPackageContext) HostBinToolPath(config interface{}, path string) (Path, error) {
+	ctx := &configErrorWrapper{p, config.(Config), []error{}}
+	pa := PathForOutput(ctx, "host", ctx.config.PrebuiltOS(), "bin", path)
+	if len(ctx.errors) > 0 {
+		return nil, ctx.errors[0]
+	}
+	return pa, nil
+}
+
 // HostJavaToolVariable returns a Variable whose value is the path to a host
 // tool in the frameworks directory for host targets. It may only be called
 // during a Go package's initialization - either from the init() function or as
diff --git a/java/config/config.go b/java/config/config.go
index eb71ddb..f4abd37 100644
--- a/java/config/config.go
+++ b/java/config/config.go
@@ -77,7 +77,22 @@
 	pctx.SourcePathVariable("JarArgsCmd", "build/soong/scripts/jar-args.sh")
 	pctx.HostBinToolVariable("SoongZipCmd", "soong_zip")
 	pctx.HostBinToolVariable("MergeZipsCmd", "merge_zips")
-	pctx.HostBinToolVariable("DxCmd", "dx")
+	pctx.VariableFunc("DxCmd", func(config interface{}) (string, error) {
+		dexer := "dx"
+		if config.(android.Config).Getenv("USE_D8") == "true" {
+			dexer = "d8"
+		}
+		if config.(android.Config).UnbundledBuild() {
+			return "prebuilts/build-tools/common/bin/" + dexer, nil
+		} else {
+			path, err := pctx.HostBinToolPath(config, dexer)
+			if err != nil {
+				return "", err
+			}
+			return path.String(), nil
+		}
+	})
+
 	pctx.HostJavaToolVariable("JarjarCmd", "jarjar.jar")
 	pctx.HostJavaToolVariable("DesugarJar", "desugar.jar")
 
diff --git a/java/config/makevars.go b/java/config/makevars.go
index 6b49592..2735242 100644
--- a/java/config/makevars.go
+++ b/java/config/makevars.go
@@ -43,6 +43,8 @@
 	ctx.Strict("JAR_ARGS", "${JarArgsCmd}")
 	ctx.Strict("JAVADOC", "${JavadocCmd}")
 	ctx.Strict("COMMON_JDK_FLAGS", "${CommonJdkFlags}")
+	ctx.Strict("DX", "${DxCmd}")
+	ctx.Strict("DX_COMMAND", "${DxCmd} -JXms16M -JXmx2048M")
 
 	if ctx.Config().IsEnvTrue("RUN_ERROR_PRONE") {
 		ctx.Strict("TARGET_JAVAC", "${ErrorProneCmd}")