diff --git a/java/java.go b/java/java.go index 25b6349bf..6eeb95dc6 100644 --- a/java/java.go +++ b/java/java.go @@ -764,6 +764,9 @@ type librarySdkMemberProperties struct { // The list of permitted packages that need to be passed to the prebuilts as they are used to // create the updatable-bcp-packages.txt file. PermittedPackages []string + + // The value of the min_sdk_version property, translated into a number where possible. + MinSdkVersion *string `supported_build_releases:"Tiramisu+"` } func (p *librarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) { @@ -774,6 +777,13 @@ func (p *librarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberCo p.AidlIncludeDirs = j.AidlIncludeDirs() p.PermittedPackages = j.PermittedPackagesForUpdatableBootJars() + + // If the min_sdk_version was set then add the canonical representation of the API level to the + // snapshot. + if j.deviceProperties.Min_sdk_version != nil { + canonical := android.ReplaceFinalizedCodenames(ctx.SdkModuleContext().Config(), j.minSdkVersion.ApiLevel.String()) + p.MinSdkVersion = proptools.StringPtr(canonical) + } } func (p *librarySdkMemberProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) { @@ -792,6 +802,10 @@ func (p *librarySdkMemberProperties) AddToPropertySet(ctx android.SdkMemberConte propertySet.AddProperty("jars", []string{snapshotRelativeJavaLibPath}) } + if p.MinSdkVersion != nil { + propertySet.AddProperty("min_sdk_version", *p.MinSdkVersion) + } + if len(p.PermittedPackages) > 0 { propertySet.AddProperty("permitted_packages", p.PermittedPackages) } diff --git a/sdk/bootclasspath_fragment_sdk_test.go b/sdk/bootclasspath_fragment_sdk_test.go index 1b64130ce..92ecd5e63 100644 --- a/sdk/bootclasspath_fragment_sdk_test.go +++ b/sdk/bootclasspath_fragment_sdk_test.go @@ -358,6 +358,7 @@ java_import { visibility: ["//visibility:public"], apex_available: ["myapex"], jars: ["java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar"], + min_sdk_version: "2", permitted_packages: ["mybootlib"], } @@ -877,6 +878,7 @@ java_import { visibility: ["//visibility:public"], apex_available: ["myapex"], jars: ["java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar"], + min_sdk_version: "1", permitted_packages: ["mybootlib"], } diff --git a/sdk/java_sdk_test.go b/sdk/java_sdk_test.go index 51903ce39..2ade146b7 100644 --- a/sdk/java_sdk_test.go +++ b/sdk/java_sdk_test.go @@ -352,6 +352,73 @@ java_import { }) } +func TestSnapshotWithJavaLibrary_MinSdkVersion(t *testing.T) { + runTest := func(t *testing.T, targetBuildRelease, minSdkVersion, expectedMinSdkVersion string) { + result := android.GroupFixturePreparers( + prepareForSdkTestWithJava, + android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { + variables.Platform_version_active_codenames = []string{"S", "Tiramisu", "Unfinalized"} + }), + android.FixtureMergeEnv(map[string]string{ + "SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE": targetBuildRelease, + }), + ).RunTestWithBp(t, fmt.Sprintf(` + sdk { + name: "mysdk", + java_header_libs: ["mylib"], + } + + java_library { + name: "mylib", + srcs: ["Test.java"], + system_modules: "none", + sdk_version: "none", + compile_dex: true, + min_sdk_version: "%s", + } + `, minSdkVersion)) + + expectedMinSdkVersionLine := "" + if expectedMinSdkVersion != "" { + expectedMinSdkVersionLine = fmt.Sprintf(" min_sdk_version: %q,\n", expectedMinSdkVersion) + } + + CheckSnapshot(t, result, "mysdk", "", + checkAndroidBpContents(fmt.Sprintf(` +// This is auto-generated. DO NOT EDIT. + +java_import { + name: "mylib", + prefer: false, + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java/mylib.jar"], +%s} +`, expectedMinSdkVersionLine)), + ) + } + + t.Run("min_sdk_version=S in S", func(t *testing.T) { + // min_sdk_version was not added to java_import until Tiramisu. + runTest(t, "S", "S", "") + }) + + t.Run("min_sdk_version=S in Tiramisu", func(t *testing.T) { + // The canonical form of S is 31. + runTest(t, "Tiramisu", "S", "31") + }) + + t.Run("min_sdk_version=24 in Tiramisu", func(t *testing.T) { + // A numerical min_sdk_version is already in canonical form. + runTest(t, "Tiramisu", "24", "24") + }) + + t.Run("min_sdk_version=Unfinalized in latest", func(t *testing.T) { + // An unfinalized min_sdk_version has no numeric value yet. + runTest(t, "", "Unfinalized", "Unfinalized") + }) +} + func TestSnapshotWithJavaSystemserverLibrary(t *testing.T) { result := android.GroupFixturePreparers( prepareForSdkTestWithJava, diff --git a/sdk/systemserverclasspath_fragment_sdk_test.go b/sdk/systemserverclasspath_fragment_sdk_test.go index 1ac405d7d..2a17cdc3a 100644 --- a/sdk/systemserverclasspath_fragment_sdk_test.go +++ b/sdk/systemserverclasspath_fragment_sdk_test.go @@ -120,6 +120,7 @@ java_import { visibility: ["//visibility:public"], apex_available: ["myapex"], jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"], + min_sdk_version: "2", permitted_packages: ["mylib"], } @@ -181,6 +182,7 @@ java_import { visibility: ["//visibility:public"], apex_available: ["myapex"], jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"], + min_sdk_version: "2", permitted_packages: ["mylib"], }