Allow codename.fingerprint format for minSdkVersion

Use codename.fingerprint format for minSdkVersion if it is unset
in the manifest and
UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT=true.

Using a utility function in sdk.go to check whether to apply
api.fingerprint.

BUG: 130541924
Change-Id: I748a25c419033bf54b63171d334644fcd0ecc78f
diff --git a/apex/builder.go b/apex/builder.go
index 9122188..290c1ea 100644
--- a/apex/builder.go
+++ b/apex/builder.go
@@ -376,15 +376,17 @@
 		}
 
 		targetSdkVersion := ctx.Config().DefaultAppTargetSdk()
-		if targetSdkVersion == ctx.Config().PlatformSdkCodename() &&
-			ctx.Config().UnbundledBuild() &&
-			!ctx.Config().UnbundledBuildUsePrebuiltSdks() &&
-			ctx.Config().IsEnvTrue("UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT") {
-			apiFingerprint := java.ApiFingerprintPath(ctx)
-			targetSdkVersion += fmt.Sprintf(".$$(cat %s)", apiFingerprint.String())
-			implicitInputs = append(implicitInputs, apiFingerprint)
+		minSdkVersion := ctx.Config().DefaultAppTargetSdk()
+		if java.UseApiFingerprint(ctx, targetSdkVersion) {
+			targetSdkVersion += fmt.Sprintf(".$$(cat %s)", java.ApiFingerprintPath(ctx).String())
+			implicitInputs = append(implicitInputs, java.ApiFingerprintPath(ctx))
+		}
+		if java.UseApiFingerprint(ctx, minSdkVersion) {
+			minSdkVersion += fmt.Sprintf(".$$(cat %s)", java.ApiFingerprintPath(ctx).String())
+			implicitInputs = append(implicitInputs, java.ApiFingerprintPath(ctx))
 		}
 		optFlags = append(optFlags, "--target_sdk_version "+targetSdkVersion)
+		optFlags = append(optFlags, "--min_sdk_version "+minSdkVersion)
 
 		noticeFile := a.buildNoticeFile(ctx, a.Name()+suffix)
 		if noticeFile.Valid() {
diff --git a/java/android_manifest.go b/java/android_manifest.go
index 021883e..dc7a3fc 100644
--- a/java/android_manifest.go
+++ b/java/android_manifest.go
@@ -93,13 +93,11 @@
 
 	var deps android.Paths
 	targetSdkVersion := sdkVersionOrDefault(ctx, sdkContext.targetSdkVersion())
-	if targetSdkVersion == ctx.Config().PlatformSdkCodename() &&
-		ctx.Config().UnbundledBuild() &&
-		!ctx.Config().UnbundledBuildUsePrebuiltSdks() &&
-		ctx.Config().IsEnvTrue("UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT") {
-		apiFingerprint := ApiFingerprintPath(ctx)
-		targetSdkVersion += fmt.Sprintf(".$$(cat %s)", apiFingerprint.String())
-		deps = append(deps, apiFingerprint)
+	minSdkVersion := sdkVersionOrDefault(ctx, sdkContext.minSdkVersion())
+	if (UseApiFingerprint(ctx, sdkContext.targetSdkVersion()) ||
+		UseApiFingerprint(ctx, sdkContext.minSdkVersion())) {
+			apiFingerprint := ApiFingerprintPath(ctx)
+			deps = append(deps, apiFingerprint)
 	}
 
 	fixedManifest := android.PathForModuleOut(ctx, "manifest_fixer", "AndroidManifest.xml")
@@ -110,7 +108,7 @@
 		Implicits:   deps,
 		Output:      fixedManifest,
 		Args: map[string]string{
-			"minSdkVersion":    sdkVersionOrDefault(ctx, sdkContext.minSdkVersion()),
+			"minSdkVersion":    minSdkVersion,
 			"targetSdkVersion": targetSdkVersion,
 			"args":             strings.Join(args, " "),
 		},
diff --git a/java/sdk.go b/java/sdk.go
index 66eb284..73b7dcf 100644
--- a/java/sdk.go
+++ b/java/sdk.go
@@ -47,13 +47,29 @@
 	targetSdkVersion() string
 }
 
+func UseApiFingerprint(ctx android.BaseModuleContext, v string) bool {
+	if v == ctx.Config().PlatformSdkCodename() &&
+		ctx.Config().UnbundledBuild() &&
+		!ctx.Config().UnbundledBuildUsePrebuiltSdks() &&
+		ctx.Config().IsEnvTrue("UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT") {
+		return true
+	}
+	return false
+}
+
 func sdkVersionOrDefault(ctx android.BaseModuleContext, v string) string {
+	var sdkVersion string
 	switch v {
 	case "", "none", "current", "test_current", "system_current", "core_current", "core_platform":
-		return ctx.Config().DefaultAppTargetSdk()
+		sdkVersion = ctx.Config().DefaultAppTargetSdk()
 	default:
-		return v
+		sdkVersion = v
 	}
+	if UseApiFingerprint(ctx, sdkVersion) {
+		apiFingerprint := ApiFingerprintPath(ctx)
+		sdkVersion += fmt.Sprintf(".$$(cat %s)", apiFingerprint.String())
+	}
+	return sdkVersion
 }
 
 // Returns a sdk version as a number.  For modules targeting an unreleased SDK (meaning it does not yet have a number)