Overriding placeholder version in updatable apks

Test: presubmit, checked the app version after build locally
Bug: 231691162
Change-Id: Icd242432540ea424235b226a45aac839dbc995be
diff --git a/java/aar.go b/java/aar.go
index dadfc6a..e13ccb3 100644
--- a/java/aar.go
+++ b/java/aar.go
@@ -105,6 +105,7 @@
 	noticeFile              android.OptionalPath
 	assetPackage            android.OptionalPath
 	isLibrary               bool
+	defaultManifestVersion  string
 	useEmbeddedNativeLibs   bool
 	useEmbeddedDex          bool
 	usesNonSdkApis          bool
@@ -281,14 +282,15 @@
 	manifestSrcPath := android.PathForModuleSrc(ctx, manifestFile)
 
 	manifestPath := ManifestFixer(ctx, manifestSrcPath, ManifestFixerParams{
-		SdkContext:            sdkContext,
-		ClassLoaderContexts:   classLoaderContexts,
-		IsLibrary:             a.isLibrary,
-		UseEmbeddedNativeLibs: a.useEmbeddedNativeLibs,
-		UsesNonSdkApis:        a.usesNonSdkApis,
-		UseEmbeddedDex:        a.useEmbeddedDex,
-		HasNoCode:             a.hasNoCode,
-		LoggingParent:         a.LoggingParent,
+		SdkContext:             sdkContext,
+		ClassLoaderContexts:    classLoaderContexts,
+		IsLibrary:              a.isLibrary,
+		DefaultManifestVersion: a.defaultManifestVersion,
+		UseEmbeddedNativeLibs:  a.useEmbeddedNativeLibs,
+		UsesNonSdkApis:         a.usesNonSdkApis,
+		UseEmbeddedDex:         a.useEmbeddedDex,
+		HasNoCode:              a.hasNoCode,
+		LoggingParent:          a.LoggingParent,
 	})
 
 	// Add additional manifest files to transitive manifests.
diff --git a/java/android_manifest.go b/java/android_manifest.go
index c61823d..83cb171 100644
--- a/java/android_manifest.go
+++ b/java/android_manifest.go
@@ -56,15 +56,16 @@
 }
 
 type ManifestFixerParams struct {
-	SdkContext            android.SdkContext
-	ClassLoaderContexts   dexpreopt.ClassLoaderContextMap
-	IsLibrary             bool
-	UseEmbeddedNativeLibs bool
-	UsesNonSdkApis        bool
-	UseEmbeddedDex        bool
-	HasNoCode             bool
-	TestOnly              bool
-	LoggingParent         string
+	SdkContext             android.SdkContext
+	ClassLoaderContexts    dexpreopt.ClassLoaderContextMap
+	IsLibrary              bool
+	DefaultManifestVersion string
+	UseEmbeddedNativeLibs  bool
+	UsesNonSdkApis         bool
+	UseEmbeddedDex         bool
+	HasNoCode              bool
+	TestOnly               bool
+	LoggingParent          string
 }
 
 // Uses manifest_fixer.py to inject minSdkVersion, etc. into an AndroidManifest.xml
@@ -153,6 +154,9 @@
 		args = append(args, "--replaceMaxSdkVersionPlaceholder ", strconv.Itoa(replaceMaxSdkVersionPlaceholder.FinalOrFutureInt()))
 		args = append(args, "--raise-min-sdk-version")
 	}
+	if params.DefaultManifestVersion != "" {
+		args = append(args, "--override-placeholder-version", params.DefaultManifestVersion)
+	}
 
 	fixedManifest := android.PathForModuleOut(ctx, "manifest_fixer", "AndroidManifest.xml")
 	argsMapper["args"] = strings.Join(args, " ")
diff --git a/java/app.go b/java/app.go
index 23a9816..24f269c 100755
--- a/java/app.go
+++ b/java/app.go
@@ -417,6 +417,9 @@
 
 	a.aapt.splitNames = a.appProperties.Package_splits
 	a.aapt.LoggingParent = String(a.overridableAppProperties.Logging_parent)
+	if a.Updatable() {
+		a.aapt.defaultManifestVersion = android.DefaultUpdatableModuleVersion
+	}
 	a.aapt.buildActions(ctx, android.SdkContext(a), a.classLoaderContexts,
 		a.usesLibraryProperties.Exclude_uses_libs, aaptLinkFlags...)