Add android.test.base to class loader context for API version < 30.

Test: lunch aosp_cf_x86_phone-userdebug && m
Change-Id: Id2ece4b2a6317998e1dd177e853848cc3956f39f
diff --git a/dexpreopt/dexpreopt.go b/dexpreopt/dexpreopt.go
index 15d2ed2..de696da 100644
--- a/dexpreopt/dexpreopt.go
+++ b/dexpreopt/dexpreopt.go
@@ -241,6 +241,10 @@
 	var conditionalClassLoaderContextHost29 android.Paths
 	var conditionalClassLoaderContextTarget29 []string
 
+	// Extra paths that will be appended to the class loader if the APK manifest has targetSdkVersion < 30
+	var conditionalClassLoaderContextHost30 android.Paths
+	var conditionalClassLoaderContextTarget30 []string
+
 	// A flag indicating if the '&' class loader context is used.
 	unknownClassLoaderContext := false
 
@@ -280,6 +284,17 @@
 			pathForLibrary(module, hidlBase))
 		conditionalClassLoaderContextTarget29 = append(conditionalClassLoaderContextTarget29,
 			filepath.Join("/system/framework", hidlBase+".jar"))
+
+		// android.test.base contains classes that were in the default classpath until API 30.
+		// If the targetSdkVersion in the manifest or APK is < 30 then implicitly add it to the
+		// classpath for dexpreopt.
+		const testBase = "android.test.base"
+		if !contains(usesLibs, testBase) {
+			conditionalClassLoaderContextHost30 = append(conditionalClassLoaderContextHost30,
+				pathForLibrary(module, testBase))
+			conditionalClassLoaderContextTarget30 = append(conditionalClassLoaderContextTarget30,
+				filepath.Join("/system/framework", testBase+".jar"))
+		}
 	} else if jarIndex := android.IndexList(module.Name, systemServerJars); jarIndex >= 0 {
 		// System server jars should be dexpreopted together: class loader context of each jar
 		// should include all preceding jars on the system server classpath.
@@ -345,6 +360,11 @@
 			Implicits(conditionalClassLoaderContextHost29)
 		rule.Command().Textf(`conditional_target_libs_29="%s"`,
 			strings.Join(conditionalClassLoaderContextTarget29, " "))
+		rule.Command().Textf(`conditional_host_libs_30="%s"`,
+			strings.Join(conditionalClassLoaderContextHost30.Strings(), " ")).
+			Implicits(conditionalClassLoaderContextHost30)
+		rule.Command().Textf(`conditional_target_libs_30="%s"`,
+			strings.Join(conditionalClassLoaderContextTarget30, " "))
 		rule.Command().Text("source").Tool(globalSoong.ConstructContext).Input(module.DexPath)
 	}
 
diff --git a/java/app.go b/java/app.go
index 6aa8cd6..a45ab6f 100755
--- a/java/app.go
+++ b/java/app.go
@@ -1863,6 +1863,7 @@
 				"org.apache.http.legacy",
 				"android.hidl.base-V1.0-java",
 				"android.hidl.manager-V1.0-java")
+			ctx.AddVariationDependencies(nil, usesLibTag, optionalUsesLibs...)
 		}
 	}
 }
diff --git a/java/testing.go b/java/testing.go
index 1967148..faf4d32 100644
--- a/java/testing.go
+++ b/java/testing.go
@@ -230,6 +230,22 @@
 			system_modules: "core-platform-api-stubs-system-modules",
 			installable: true,
 		}
+
+		java_library {
+			name: "android.test.base",
+			srcs: ["a.java"],
+			sdk_version: "none",
+			system_modules: "core-platform-api-stubs-system-modules",
+			installable: true,
+		}
+  
+		java_library {
+			name: "android.test.mock",
+			srcs: ["a.java"],
+			sdk_version: "none",
+			system_modules: "core-platform-api-stubs-system-modules",
+			installable: true,
+		}
 	`
 
 	systemModules := []string{