Merge changes from topic "soong_prebuilts_misc_common"

* changes:
  Fix finding src directory for aidl
  Support multiple outputs in genrules with depfile: true
  Support installable prebuilt jars
diff --git a/genrule/genrule.go b/genrule/genrule.go
index 4a734da..e470353 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -260,13 +260,13 @@
 
 	// recall that Sprintf replaces percent sign expressions, whereas dollar signs expressions remain as written,
 	// to be replaced later by ninja_strings.go
-	sandboxCommand := fmt.Sprintf("$sboxCmd --sandbox-path %s --output-root %s -c %q $out", sandboxPath, buildDir, rawCommand)
+	sandboxCommand := fmt.Sprintf("$sboxCmd --sandbox-path %s --output-root %s -c %q $allouts", sandboxPath, buildDir, rawCommand)
 
 	ruleParams := blueprint.RuleParams{
 		Command:     sandboxCommand,
 		CommandDeps: []string{"$sboxCmd"},
 	}
-	var args []string
+	args := []string{"allouts"}
 	if g.properties.Depfile {
 		ruleParams.Deps = blueprint.DepsGCC
 		args = append(args, "depfile")
@@ -281,16 +281,24 @@
 
 func (g *Module) generateSourceFile(ctx android.ModuleContext, task generateTask) {
 	desc := "generate"
+	if len(task.out) == 0 {
+		ctx.ModuleErrorf("must have at least one output file")
+		return
+	}
 	if len(task.out) == 1 {
 		desc += " " + task.out[0].Base()
 	}
 
 	params := android.ModuleBuildParams{
-		Rule:        g.rule,
-		Description: "generate",
-		Outputs:     task.out,
-		Inputs:      task.in,
-		Implicits:   g.deps,
+		Rule:            g.rule,
+		Description:     "generate",
+		Output:          task.out[0],
+		ImplicitOutputs: task.out[1:],
+		Inputs:          task.in,
+		Implicits:       g.deps,
+		Args: map[string]string{
+			"allouts": strings.Join(task.out.Strings(), " "),
+		},
 	}
 	if g.properties.Depfile {
 		depfile := android.GenPathWithExt(ctx, "", task.out[0], task.out[0].Ext()+".d")
diff --git a/java/androidmk.go b/java/androidmk.go
index c61b7e5..d3aadef 100644
--- a/java/androidmk.go
+++ b/java/androidmk.go
@@ -74,7 +74,7 @@
 		Include:    "$(BUILD_SYSTEM)/soong_java_prebuilt.mk",
 		Extra: []android.AndroidMkExtraFunc{
 			func(w io.Writer, outputFile android.Path) {
-				fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true")
+				fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := ", !proptools.Bool(prebuilt.properties.Installable))
 				fmt.Fprintln(w, "LOCAL_SOONG_HEADER_JAR :=", prebuilt.combinedClasspathFile.String())
 				fmt.Fprintln(w, "LOCAL_SDK_VERSION :=", prebuilt.properties.Sdk_version)
 			},
diff --git a/java/java.go b/java/java.go
index 497b285..8941b4d 100644
--- a/java/java.go
+++ b/java/java.go
@@ -374,7 +374,7 @@
 	flags = append(flags, android.JoinWithPrefix(j.exportAidlIncludeDirs.Strings(), "-I"))
 	flags = append(flags, android.JoinWithPrefix(localAidlIncludes.Strings(), "-I"))
 	flags = append(flags, "-I"+android.PathForModuleSrc(ctx).String())
-	if src := android.ExistentPathForSource(ctx, "", "src"); src.Valid() {
+	if src := android.ExistentPathForSource(ctx, "", ctx.ModuleDir(), "src"); src.Valid() {
 		flags = append(flags, "-I"+src.String())
 	}
 
@@ -920,6 +920,8 @@
 	Jars []string
 
 	Sdk_version string
+
+	Installable *bool
 }
 
 type Import struct {
diff --git a/java/java_test.go b/java/java_test.go
index 451f58e..8ac4b3b 100644
--- a/java/java_test.go
+++ b/java/java_test.go
@@ -613,13 +613,13 @@
 	javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
 	genrule := ctx.ModuleForTests("gen", "").Rule("generator")
 
-	if len(genrule.Outputs) != 1 || filepath.Base(genrule.Outputs[0].String()) != "gen.java" {
-		t.Fatalf(`gen output file %v is not [".../gen.java"]`, genrule.Outputs.Strings())
+	if filepath.Base(genrule.Output.String()) != "gen.java" {
+		t.Fatalf(`gen output file %v is not ".../gen.java"`, genrule.Output.String())
 	}
 
 	if len(javac.Inputs) != 3 ||
 		javac.Inputs[0].String() != "a.java" ||
-		javac.Inputs[1].String() != genrule.Outputs[0].String() ||
+		javac.Inputs[1].String() != genrule.Output.String() ||
 		javac.Inputs[2].String() != "b.java" {
 		t.Errorf(`foo inputs %v != ["a.java", ".../gen.java", "b.java"]`, javac.Inputs)
 	}