Add filename property to prebuilt_apex

* Makes it more inline with prebuilt_etc;
* For shim apexes, prebuilt_apex modules have pattern of
  com.android.apex.cts.shim.v1_prebuilt, but I would prefer
  pre-installed shim to be: /system/apex/com.android.apex.cts.shim.apex

Bug: 128677967
Bug: 127789981
Test: m
Change-Id: I34e3e078733420b5cf777fd6e3ce4d8c5796b19b
diff --git a/apex/apex.go b/apex/apex.go
index 2332acc..ed4ec1a 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -1294,8 +1294,9 @@
 
 	properties PrebuiltProperties
 
-	inputApex  android.Path
-	installDir android.OutputPath
+	inputApex       android.Path
+	installDir      android.OutputPath
+	installFilename string
 }
 
 type PrebuiltProperties struct {
@@ -1319,6 +1320,9 @@
 	}
 
 	Installable *bool
+	// Optional name for the installed apex. If unspecified, name of the
+	// module is used as the file name
+	Filename *string
 }
 
 func (p *Prebuilt) installable() bool {
@@ -1357,8 +1361,12 @@
 	// TODO(jungjw): Check the key validity.
 	p.inputApex = p.Prebuilt().SingleSourcePath(ctx)
 	p.installDir = android.PathForModuleInstall(ctx, "apex")
+	p.installFilename = proptools.StringDefault(p.properties.Filename, ctx.ModuleName()+imageApexSuffix)
+	if !strings.HasSuffix(p.installFilename, imageApexSuffix) {
+		ctx.ModuleErrorf("filename should end in %s for prebuilt_apex", imageApexSuffix)
+	}
 	if p.installable() {
-		ctx.InstallFile(p.installDir, ctx.ModuleName()+imageApexSuffix, p.inputApex)
+		ctx.InstallFile(p.installDir, p.installFilename, p.inputApex)
 	}
 }
 
@@ -1378,7 +1386,7 @@
 		Extra: []android.AndroidMkExtraFunc{
 			func(w io.Writer, outputFile android.Path) {
 				fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", filepath.Join("$(OUT_DIR)", p.installDir.RelPathString()))
-				fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", p.BaseModuleName()+imageApexSuffix)
+				fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", p.installFilename)
 				fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE :=", !p.installable())
 			},
 		},