Add core-oj to bootclasspath

Also clear the bootclasspath for device builds so javac doesn't
fall back to the default rt.jar bootclasspath.

Test: java_test.go
Change-Id: Ia21f55c7d45db560e2f44be81b2f46587d9026f2
diff --git a/java/java.go b/java/java.go
index 9888b38..d18656c 100644
--- a/java/java.go
+++ b/java/java.go
@@ -178,11 +178,14 @@
 		if ctx.Device() {
 			switch j.deviceProperties.Sdk_version {
 			case "":
-				ctx.AddDependency(ctx.Module(), bootClasspathTag, "core-libart")
+				ctx.AddDependency(ctx.Module(), bootClasspathTag, "core-oj", "core-libart")
+				ctx.AddDependency(ctx.Module(), libTag, config.DefaultLibraries...)
 			case "current":
 				// TODO: !TARGET_BUILD_APPS
 				// TODO: export preprocessed framework.aidl from android_stubs_current
 				ctx.AddDependency(ctx.Module(), bootClasspathTag, "android_stubs_current")
+			case "test_current":
+				ctx.AddDependency(ctx.Module(), bootClasspathTag, "android_test_stubs_current")
 			case "system_current":
 				ctx.AddDependency(ctx.Module(), bootClasspathTag, "android_system_stubs_current")
 			default:
@@ -190,13 +193,9 @@
 			}
 		} else {
 			if j.deviceProperties.Dex {
-				ctx.AddDependency(ctx.Module(), bootClasspathTag, "core-libart")
+				ctx.AddDependency(ctx.Module(), bootClasspathTag, "core-oj", "core-libart")
 			}
 		}
-
-		if ctx.Device() && j.deviceProperties.Sdk_version == "" {
-			ctx.AddDependency(ctx.Module(), libTag, config.DefaultLibraries...)
-		}
 	}
 	ctx.AddDependency(ctx.Module(), libTag, j.properties.Libs...)
 	ctx.AddDependency(ctx.Module(), staticLibTag, j.properties.Static_libs...)
@@ -259,6 +258,7 @@
 			}
 		case sdkDependencyTag:
 			sdkDep := module.(sdkDependency)
+			bootClasspath = append(bootClasspath, sdkDep.ClasspathFiles()...)
 			if sdkDep.AidlPreprocessed().Valid() {
 				if aidlPreprocess.Valid() {
 					ctx.ModuleErrorf("multiple dependencies with preprocessed aidls:\n %q\n %q",
@@ -311,6 +311,9 @@
 	if len(bootClasspath) > 0 {
 		flags.bootClasspath = "-bootclasspath " + strings.Join(bootClasspath.Strings(), ":")
 		deps = append(deps, bootClasspath...)
+	} else if ctx.Device() {
+		// Explicitly clear the bootclasspath for device builds
+		flags.bootClasspath = `-bootclasspath ""`
 	}
 
 	if len(classpath) > 0 {
diff --git a/java/java_test.go b/java/java_test.go
index eb116c9..d73ae0b 100644
--- a/java/java_test.go
+++ b/java/java_test.go
@@ -20,6 +20,7 @@
 	"io/ioutil"
 	"os"
 	"path/filepath"
+	"reflect"
 	"strings"
 	"testing"
 )
@@ -62,7 +63,7 @@
 	ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
 	ctx.Register()
 
-	extraModules := []string{"core-libart", "frameworks", "sdk_v14"}
+	extraModules := []string{"core-oj", "core-libart", "frameworks", "sdk_v14"}
 
 	for _, extra := range extraModules {
 		bp += fmt.Sprintf(`
@@ -173,10 +174,11 @@
 		bootclasspathLib
 	)
 
-	check := func(module, dep string, depType depType) {
-		if dep != "" {
-			dep = filepath.Join(buildDir, ".intermediates", dep, "classes-full-debug.jar")
+	check := func(module string, depType depType, deps ...string) {
+		for i := range deps {
+			deps[i] = filepath.Join(buildDir, ".intermediates", deps[i], "classes-full-debug.jar")
 		}
+		dep := strings.Join(deps, ":")
 
 		javac := ctx.ModuleForTests(module, "").Rule("javac")
 
@@ -192,12 +194,18 @@
 			}
 		}
 
-		if len(javac.Implicits) != 1 || javac.Implicits[0].String() != dep {
-			t.Errorf("module %q implicits != [%q]", dep)
+		if !reflect.DeepEqual(javac.Implicits.Strings(), deps) {
+			t.Errorf("module %q implicits %q != %q", module, javac.Implicits.Strings(), deps)
 		}
 	}
 
-	check("foo1", "core-libart", bootclasspathLib)
+	check("foo1", bootclasspathLib, "core-oj", "core-libart")
+	check("foo2", bootclasspathLib, "core-oj", "core-libart")
+	// TODO(ccross): these need the arch mutator to run to work correctly
+	//check("foo3", bootclasspathLib, "sdk_v14")
+	//check("foo4", bootclasspathLib, "android_stubs_current")
+	//check("foo5", bootclasspathLib, "android_system_stubs_current")
+	//check("foo6", bootclasspathLib, "android_test_stubs_current")
 }
 
 func TestPrebuilts(t *testing.T) {