Preopt: Pass -Xbootclasspath: arg to dex2oat.

Test: Pixel 2 XL boots.
Bug: 119868597
Change-Id: Ibbff11d13a6d67034e783de2f7d8c930251bd899
diff --git a/dexpreopt/config.go b/dexpreopt/config.go
index c24caac..13a14f4 100644
--- a/dexpreopt/config.go
+++ b/dexpreopt/config.go
@@ -32,7 +32,10 @@
 
 	DisableGenerateProfile bool // don't generate profiles
 
-	BootJars         []string // jars that form the boot image
+	PreoptBootClassPathDexFiles     []string // file paths of boot class path files
+	PreoptBootClassPathDexLocations []string // virtual locations of boot class path files
+
+	BootJars         []string // modules for jars that form the boot class path
 	SystemServerJars []string // jars that form the system server
 	SystemServerApps []string // apps that are loaded into system server
 	SpeedApps        []string // apps that should be speed optimized
diff --git a/dexpreopt/dexpreopt.go b/dexpreopt/dexpreopt.go
index 3b21106..4ad039f 100644
--- a/dexpreopt/dexpreopt.go
+++ b/dexpreopt/dexpreopt.go
@@ -192,6 +192,9 @@
 			pathtools.ReplaceExtension(filepath.Base(path), "odex"))
 	}
 
+	bcp := strings.Join(global.PreoptBootClassPathDexFiles, ":")
+	bcp_locations := strings.Join(global.PreoptBootClassPathDexLocations, ":")
+
 	odexPath := toOdexPath(filepath.Join(filepath.Dir(module.BuildPath), base))
 	odexInstallPath := toOdexPath(module.DexLocation)
 	if odexOnSystemOther(module, global) {
@@ -310,6 +313,9 @@
 		FlagWithOutput("--write-invocation-to=", invocationPath).ImplicitOutput(invocationPath).
 		Flag("--runtime-arg").FlagWithArg("-Xms", global.Dex2oatXms).
 		Flag("--runtime-arg").FlagWithArg("-Xmx", global.Dex2oatXmx).
+		Flag("--runtime-arg").FlagWithArg("-Xbootclasspath:", bcp).
+		Implicits(global.PreoptBootClassPathDexFiles).
+		Flag("--runtime-arg").FlagWithArg("-Xbootclasspath-locations:", bcp_locations).
 		Flag("${class_loader_context_arg}").
 		Flag("${stored_class_loader_context_arg}").
 		FlagWithArg("--boot-image=", bootImageLocation).Implicit(bootImagePath).
diff --git a/dexpreopt/script.go b/dexpreopt/script.go
index fd4cf82..9d4329c 100644
--- a/dexpreopt/script.go
+++ b/dexpreopt/script.go
@@ -147,6 +147,11 @@
 	return c
 }
 
+func (c *Command) Implicits(paths []string) *Command {
+	c.inputs = append(c.inputs, paths...)
+	return c
+}
+
 func (c *Command) Output(path string) *Command {
 	c.outputs = append(c.outputs, path)
 	return c.Text(path)