Bring java support closer to current version of make

Make the javac arguments match what is used by make, and export them
back to make.  A future change will switch make to use the the
exported ones.

This makes a dx.jar compiled with soong have identical class files
as one compiled with make.

Test: manual
Change-Id: Ia5196f1f42bc564e99de22e32e72fd2930e9fbae
diff --git a/java/builder.go b/java/builder.go
index 2e41a60..017f64f 100644
--- a/java/builder.go
+++ b/java/builder.go
@@ -19,13 +19,11 @@
 // functions.
 
 import (
-	"path/filepath"
 	"strings"
 
 	"android/soong/android"
 
 	"github.com/google/blueprint"
-	_ "github.com/google/blueprint/bootstrap"
 )
 
 var (
@@ -39,36 +37,37 @@
 	// read from directly using @<listfile>)
 	javac = pctx.AndroidGomaStaticRule("javac",
 		blueprint.RuleParams{
-			Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
-				`${JavacWrapper}$javacCmd ` +
-				`-encoding UTF-8 $javacFlags $bootClasspath $classpath ` +
-				`-extdirs "" -d $outDir @$out.rsp || ( rm -rf "$outDir"; exit 41 ) && ` +
+			Command: `rm -rf "$outDir" "$annoDir" && mkdir -p "$outDir" "$annoDir" && ` +
+				`${config.JavacWrapper}${config.JavacCmd} ${config.CommonJdkFlags} ` +
+				`$javacFlags $bootClasspath $classpath ` +
+				`-source $javaVersion -target $javaVersion ` +
+				`-d $outDir -s $annoDir @$out.rsp || ( rm -rf "$outDir"; exit 41 ) && ` +
 				`find $outDir -name "*.class" > $out`,
 			Rspfile:        "$out.rsp",
 			RspfileContent: "$in",
 		},
-		"javacCmd", "javacFlags", "bootClasspath", "classpath", "outDir")
+		"javacFlags", "bootClasspath", "classpath", "outDir", "annoDir", "javaVersion")
 
 	jar = pctx.AndroidStaticRule("jar",
 		blueprint.RuleParams{
-			Command:     `$jarCmd -o $out $jarArgs`,
-			CommandDeps: []string{"$jarCmd"},
+			Command:     `${config.SoongZipCmd} -o $out -d $jarArgs`,
+			CommandDeps: []string{"${config.SoongZipCmd}"},
 		},
 		"jarCmd", "jarArgs")
 
 	dx = pctx.AndroidStaticRule("dx",
 		blueprint.RuleParams{
 			Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
-				`$dxCmd --dex --output=$outDir $dxFlags $in || ( rm -rf "$outDir"; exit 41 ) && ` +
-				`find "$outDir" -name "classes*.dex" > $out`,
-			CommandDeps: []string{"$dxCmd"},
+				`${config.DxCmd} --dex --output=$outDir $dxFlags $in || ( rm -rf "$outDir"; exit 41 ) && ` +
+				`find "$outDir" -name "classes*.dex" | sort > $out`,
+			CommandDeps: []string{"${config.DxCmd}"},
 		},
 		"outDir", "dxFlags")
 
 	jarjar = pctx.AndroidStaticRule("jarjar",
 		blueprint.RuleParams{
-			Command:     "java -jar $jarjarCmd process $rulesFile $in $out",
-			CommandDeps: []string{"$jarjarCmd", "$rulesFile"},
+			Command:     "${config.JavaCmd} -jar ${config.JarjarCmd} process $rulesFile $in $out",
+			CommandDeps: []string{"${config.JavaCmd}", "${config.JarjarCmd}", "$rulesFile"},
 		},
 		"rulesFile")
 
@@ -83,19 +82,7 @@
 )
 
 func init() {
-	pctx.Import("github.com/google/blueprint/bootstrap")
-	pctx.StaticVariable("commonJdkFlags", "-source 1.7 -target 1.7 -Xmaxerrs 9999999")
-	pctx.StaticVariable("javacCmd", "javac -J-Xmx1024M $commonJdkFlags")
-	pctx.StaticVariable("jarCmd", filepath.Join("${bootstrap.ToolDir}", "soong_zip"))
-	pctx.HostBinToolVariable("dxCmd", "dx")
-	pctx.HostJavaToolVariable("jarjarCmd", "jarjar.jar")
-
-	pctx.VariableFunc("JavacWrapper", func(config interface{}) (string, error) {
-		if override := config.(android.Config).Getenv("JAVAC_WRAPPER"); override != "" {
-			return override + " ", nil
-		}
-		return "", nil
-	})
+	pctx.Import("android/soong/java/config")
 }
 
 type javaBuilderFlags struct {
@@ -104,6 +91,7 @@
 	bootClasspath string
 	classpath     string
 	aidlFlags     string
+	javaVersion   string
 }
 
 type jarSpec struct {
@@ -118,6 +106,7 @@
 	flags javaBuilderFlags, deps android.Paths) jarSpec {
 
 	classDir := android.PathForModuleOut(ctx, "classes")
+	annoDir := android.PathForModuleOut(ctx, "anno")
 	classFileList := android.PathForModuleOut(ctx, "classes.list")
 
 	javacFlags := flags.javacFlags + android.JoinWithPrefix(srcFileLists.Strings(), "@")
@@ -135,6 +124,8 @@
 			"bootClasspath": flags.bootClasspath,
 			"classpath":     flags.classpath,
 			"outDir":        classDir.String(),
+			"annoDir":       annoDir.String(),
+			"javaVersion":   flags.javaVersion,
 		},
 	})
 
diff --git a/java/config/config.go b/java/config/config.go
index 848d09d..44651cb 100644
--- a/java/config/config.go
+++ b/java/config/config.go
@@ -14,10 +14,53 @@
 
 package config
 
-import "android/soong/android"
+import (
+	"path/filepath"
+	"strings"
+
+	_ "github.com/google/blueprint/bootstrap"
+
+	"android/soong/android"
+)
 
 var (
+	pctx = android.NewPackageContext("android/soong/java/config")
+
 	DefaultLibraries = []string{"core-oj", "core-libart", "ext", "framework", "okhttp"}
 )
 
-var pctx = android.NewPackageContext("android/soong/java/config")
+func init() {
+	pctx.Import("github.com/google/blueprint/bootstrap")
+
+	pctx.StaticVariable("CommonJdkFlags", strings.Join([]string{
+		`-J-Xmx2048M`,
+		`-Xmaxerrs 9999999`,
+		`-encoding UTF-8`,
+		`-sourcepath ""`,
+		`-g`,
+	}, " "))
+
+	pctx.StaticVariable("DefaultJavaVersion", "1.8")
+
+	pctx.VariableConfigMethod("hostPrebuiltTag", android.Config.PrebuiltOS)
+
+	pctx.SourcePathVariableWithEnvOverride("JavaHome",
+		"prebuilts/jdk/jdk8/${hostPrebuiltTag}", "OVERRIDE_ANDROID_JAVA_HOME")
+	pctx.SourcePathVariable("JavaToolchain", "${JavaHome}/bin")
+	pctx.SourcePathVariableWithEnvOverride("JavacCmd",
+		"${JavaToolchain}/javac", "ALTERNATE_JAVAC")
+	pctx.SourcePathVariable("JavaCmd", "${JavaToolchain}/java")
+	pctx.SourcePathVariable("JarCmd", "${JavaToolchain}/jar")
+	pctx.SourcePathVariable("JavadocCmd", "${JavaToolchain}/javadoc")
+
+	pctx.StaticVariable("SoongZipCmd", filepath.Join("${bootstrap.ToolDir}", "soong_zip"))
+	pctx.HostBinToolVariable("DxCmd", "dx")
+	pctx.HostJavaToolVariable("JarjarCmd", "jarjar.jar")
+
+	pctx.VariableFunc("JavacWrapper", func(config interface{}) (string, error) {
+		if override := config.(android.Config).Getenv("JAVAC_WRAPPER"); override != "" {
+			return override + " ", nil
+		}
+		return "", nil
+	})
+}
diff --git a/java/config/makevars.go b/java/config/makevars.go
index 6702454..ec0d939 100644
--- a/java/config/makevars.go
+++ b/java/config/makevars.go
@@ -26,4 +26,14 @@
 
 func makeVarsProvider(ctx android.MakeVarsContext) {
 	ctx.Strict("TARGET_DEFAULT_JAVA_LIBRARIES", strings.Join(DefaultLibraries, " "))
+
+	ctx.Strict("DEFAULT_JAVA_LANGUAGE_VERSION", "${DefaultJavaVersion}")
+
+	ctx.Strict("ANDROID_JAVA_HOME", "${JavaHome}")
+	ctx.Strict("ANDROID_JAVA_TOOLCHAIN", "${JavaToolchain}")
+	ctx.Strict("JAVA", "${JavaCmd}")
+	ctx.Strict("JAVAC", "${JavacCmd}")
+	ctx.Strict("JAR", "${JarCmd}")
+	ctx.Strict("JAVADOC", "${JavadocCmd}")
+	ctx.Strict("COMMON_JDK_FLAGS", "${CommonJdkFlags}")
 }
diff --git a/java/java.go b/java/java.go
index 37d959b..4c614e5 100644
--- a/java/java.go
+++ b/java/java.go
@@ -92,6 +92,9 @@
 
 	// if not blank, run jarjar using the specified rules file
 	Jarjar_rules *string
+
+	// If not blank, set the java version passed to javac as -source and -target
+	Java_version *string
 }
 
 type CompilerDeviceProperties struct {
@@ -285,6 +288,13 @@
 	var flags javaBuilderFlags
 
 	javacFlags := j.properties.Javacflags
+
+	if j.properties.Java_version != nil {
+		flags.javaVersion = *j.properties.Java_version
+	} else {
+		flags.javaVersion = "${config.DefaultJavaVersion}"
+	}
+
 	if len(javacFlags) > 0 {
 		ctx.Variable(pctx, "javacFlags", strings.Join(javacFlags, " "))
 		flags.javacFlags = "$javacFlags"