From 85bc19380567dfee327f04162587633673e3dcf7 Mon Sep 17 00:00:00 2001 From: Jihoon Kang Date: Mon, 1 Jul 2024 17:04:46 +0000 Subject: [PATCH] Revert^4 "Implement detecting container violations." This change introduces a method to detect violating inter-container dependencies between modules. The method is run in `ModuleBase.GenerateBuildActions`, after the container info provider is set. Given that the provider of the direct dependencies would have been set at this time, the method utilizes this information to determine the violations, which are introduced in https://r.android.com/3141104. Note that this enforcement does not turn all inter-container dependencies as errors. Instead, it will only turn dependencies that matches the pre-defined violations into errors. Even if the dependency matches the violation, an error will not be thrown if the dependency satisfies any of the exception functions (e.g. the dependent module is stubs, or the two modules belong to the same apexes). Test: m nothing --no-skip-soong-tests Bug: 338660802 Change-Id: Ib9ddc0761fa46f1309b1a1a4f759d9a4e04fd70e --- android/apex.go | 12 ++++ android/container.go | 65 +++++++++++++++++++ android/module.go | 3 + apex/aconfig_test.go | 12 ++++ apex/apex_test.go | 63 ++++++++++++++++-- apex/bootclasspath_fragment_test.go | 5 ++ apex/classpath_element_test.go | 1 + apex/container_test.go | 32 +++++---- apex/platform_bootclasspath_test.go | 1 + apex/systemserver_classpath_fragment_test.go | 2 + java/base.go | 7 ++ java/core-libraries/Android.bp | 4 ++ java/dexpreopt_test.go | 13 ++++ java/sdk_library.go | 1 + java/testing.go | 8 ++- sdk/bootclasspath_fragment_sdk_test.go | 11 ++++ ...systemserverclasspath_fragment_sdk_test.go | 4 ++ 17 files changed, 225 insertions(+), 19 deletions(-) diff --git a/android/apex.go b/android/apex.go index 79ee0a8f8..b19c47795 100644 --- a/android/apex.go +++ b/android/apex.go @@ -16,6 +16,7 @@ package android import ( "fmt" + "reflect" "slices" "sort" "strconv" @@ -145,6 +146,17 @@ func (i ApexInfo) InApexModule(apexModuleName string) bool { return false } +// To satisfy the comparable interface +func (i ApexInfo) Equal(other any) bool { + otherApexInfo, ok := other.(ApexInfo) + return ok && i.ApexVariationName == otherApexInfo.ApexVariationName && + i.MinSdkVersion == otherApexInfo.MinSdkVersion && + i.Updatable == otherApexInfo.Updatable && + i.UsePlatformApis == otherApexInfo.UsePlatformApis && + reflect.DeepEqual(i.InApexVariants, otherApexInfo.InApexVariants) && + reflect.DeepEqual(i.InApexModules, otherApexInfo.InApexModules) +} + // ApexTestForInfo stores the contents of APEXes for which this module is a test - although this // module is not part of the APEX - and thus has access to APEX internals. type ApexTestForInfo struct { diff --git a/android/container.go b/android/container.go index 43dccf635..63fb362ad 100644 --- a/android/container.go +++ b/android/container.go @@ -15,8 +15,10 @@ package android import ( + "fmt" "reflect" "slices" + "strings" "github.com/google/blueprint" ) @@ -395,6 +397,40 @@ func (c *ContainersInfo) UpdatableApex() bool { var ContainersInfoProvider = blueprint.NewProvider[ContainersInfo]() +func satisfyAllowedExceptions(ctx ModuleContext, allowedExceptionLabels []exceptionHandleFuncLabel, m, dep Module) bool { + for _, label := range allowedExceptionLabels { + if exceptionHandleFunctionsTable[label](ctx, m, dep) { + return true + } + } + return false +} + +func (c *ContainersInfo) GetViolations(mctx ModuleContext, m, dep Module, depInfo ContainersInfo) []string { + var violations []string + + // Any containers that the module belongs to but the dependency does not belong to must be examined. + _, containersUniqueToModule, _ := ListSetDifference(c.belongingContainers, depInfo.belongingContainers) + + // Apex container should be examined even if both the module and the dependency belong to + // the apex container to check that the two modules belong to the same apex. + if InList(ApexContainer, c.belongingContainers) && !InList(ApexContainer, containersUniqueToModule) { + containersUniqueToModule = append(containersUniqueToModule, ApexContainer) + } + + for _, containerUniqueToModule := range containersUniqueToModule { + for _, restriction := range containerUniqueToModule.restricted { + if InList(restriction.dependency, depInfo.belongingContainers) { + if !satisfyAllowedExceptions(mctx, restriction.allowedExceptions, m, dep) { + violations = append(violations, restriction.errorMessage) + } + } + } + } + + return violations +} + func generateContainerInfo(ctx ModuleContext) ContainersInfo { var containers []*container @@ -436,3 +472,32 @@ func setContainerInfo(ctx ModuleContext) { SetProvider(ctx, ContainersInfoProvider, containersInfo) } } + +func checkContainerViolations(ctx ModuleContext) { + if _, ok := ctx.Module().(InstallableModule); ok { + containersInfo, _ := getContainerModuleInfo(ctx, ctx.Module()) + ctx.VisitDirectDepsIgnoreBlueprint(func(dep Module) { + if !dep.Enabled(ctx) { + return + } + + // Pre-existing violating dependencies are tracked in containerDependencyViolationAllowlist. + // If this dependency is allowlisted, do not check for violation. + // If not, check if this dependency matches any restricted dependency and + // satisfies any exception functions, which allows bypassing the + // restriction. If all of the exceptions are not satisfied, throw an error. + if depContainersInfo, ok := getContainerModuleInfo(ctx, dep); ok { + if allowedViolations, ok := ContainerDependencyViolationAllowlist[ctx.ModuleName()]; ok && InList(dep.Name(), allowedViolations) { + return + } else { + violations := containersInfo.GetViolations(ctx, ctx.Module(), dep, depContainersInfo) + if len(violations) > 0 { + errorMessage := fmt.Sprintf("%s cannot depend on %s. ", ctx.ModuleName(), dep.Name()) + errorMessage += strings.Join(violations, " ") + ctx.ModuleErrorf(errorMessage) + } + } + } + }) + } +} diff --git a/android/module.go b/android/module.go index 5d68a87c9..65f807915 100644 --- a/android/module.go +++ b/android/module.go @@ -1778,6 +1778,9 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) } setContainerInfo(ctx) + if ctx.Config().Getenv("DISABLE_CONTAINER_CHECK") != "true" { + checkContainerViolations(ctx) + } ctx.licenseMetadataFile = PathForModuleOut(ctx, "meta_lic") diff --git a/apex/aconfig_test.go b/apex/aconfig_test.go index 14c0b6394..bb811f58a 100644 --- a/apex/aconfig_test.go +++ b/apex/aconfig_test.go @@ -74,6 +74,8 @@ func TestValidationAcrossContainersExportedPass(t *testing.T) { apex_available: [ "myapex", ], + sdk_version: "none", + system_modules: "none", }`, }, { @@ -122,6 +124,8 @@ func TestValidationAcrossContainersExportedPass(t *testing.T) { apex_available: [ "myapex", ], + sdk_version: "none", + system_modules: "none", }`, }, { @@ -345,6 +349,8 @@ func TestValidationAcrossContainersNotExportedFail(t *testing.T) { apex_available: [ "myapex", ], + sdk_version: "none", + system_modules: "none", }`, expectedError: `.*my_java_library_foo/myapex depends on my_java_aconfig_library_foo/otherapex/production across containers`, }, @@ -392,6 +398,8 @@ func TestValidationAcrossContainersNotExportedFail(t *testing.T) { apex_available: [ "myapex", ], + sdk_version: "none", + system_modules: "none", }`, expectedError: `.*my_android_app_foo/myapex depends on my_java_aconfig_library_foo/otherapex/production across containers`, }, @@ -693,6 +701,8 @@ func TestValidationAcrossContainersNotExportedFail(t *testing.T) { apex_available: [ "myapex", ], + sdk_version: "none", + system_modules: "none", }`, expectedError: `.*my_android_app_foo/myapex depends on my_java_aconfig_library_foo/otherapex/production across containers`, }, @@ -769,6 +779,8 @@ func TestValidationNotPropagateAcrossShared(t *testing.T) { apex_available: [ "myapex", ], + sdk_version: "none", + system_modules: "none", }`, }, } diff --git a/apex/apex_test.go b/apex/apex_test.go index 8d34e9fde..83053332a 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -4929,6 +4929,7 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) { java_import { name: "libfoo", jars: ["libfoo.jar"], + sdk_version: "core_current", } java_sdk_library_import { @@ -4969,6 +4970,22 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) { t.Run("prebuilt with source preferred", func(t *testing.T) { bp := ` + apex { + name: "myapex", + key: "myapex.key", + updatable: false, + java_libs: [ + "libfoo", + "libbar", + ], + } + + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + prebuilt_apex { name: "myapex", arch: { @@ -4985,10 +5002,21 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) { java_import { name: "libfoo", jars: ["libfoo.jar"], + apex_available: [ + "myapex", + ], + compile_dex: true, + sdk_version: "core_current", } java_library { name: "libfoo", + srcs: ["foo/bar/MyClass.java"], + apex_available: [ + "myapex", + ], + compile_dex: true, + sdk_version: "core_current", } java_sdk_library_import { @@ -4996,12 +5024,21 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) { public: { jars: ["libbar.jar"], }, + apex_available: [ + "myapex", + ], + compile_dex: true, } java_sdk_library { name: "libbar", srcs: ["foo/bar/MyClass.java"], unsafe_ignore_missing_latest_api: true, + apex_available: [ + "myapex", + ], + compile_dex: true, + sdk_version: "core_current", } ` @@ -5010,11 +5047,9 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) { checkDexJarBuildPath(t, ctx, "prebuilt_libfoo") checkDexJarInstallPath(t, ctx, "prebuilt_libfoo") - ensureNoSourceVariant(t, ctx, "libfoo") checkDexJarBuildPath(t, ctx, "prebuilt_libbar") checkDexJarInstallPath(t, ctx, "prebuilt_libbar") - ensureNoSourceVariant(t, ctx, "libbar") }) t.Run("prebuilt preferred with source", func(t *testing.T) { @@ -5040,6 +5075,7 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) { java_library { name: "libfoo", + sdk_version: "core_current", } java_sdk_library_import { @@ -5166,6 +5202,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { jars: ["libfoo.jar"], apex_available: ["myapex"], permitted_packages: ["foo"], + sdk_version: "core_current", } java_sdk_library_import { @@ -5320,12 +5357,14 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { name: "libfoo", jars: ["libfoo.jar"], apex_available: ["myapex"], + sdk_version: "core_current", } java_library { name: "libfoo", srcs: ["foo/bar/MyClass.java"], apex_available: ["myapex"], + sdk_version: "core_current", } java_sdk_library_import { @@ -5417,6 +5456,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { jars: ["libfoo.jar"], apex_available: ["myapex"], permitted_packages: ["foo"], + sdk_version: "core_current", } java_library { @@ -5424,6 +5464,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { srcs: ["foo/bar/MyClass.java"], apex_available: ["myapex"], installable: true, + sdk_version: "core_current", } java_sdk_library_import { @@ -5514,6 +5555,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { name: "libfoo", jars: ["libfoo.jar"], apex_available: ["myapex"], + sdk_version: "core_current", } java_library { @@ -5522,6 +5564,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { apex_available: ["myapex"], permitted_packages: ["foo"], installable: true, + sdk_version: "core_current", } java_sdk_library_import { @@ -5540,6 +5583,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { apex_available: ["myapex"], permitted_packages: ["bar"], compile_dex: true, + sdk_version: "core_current", } ` @@ -6134,6 +6178,7 @@ func TestApexWithTestHelperApp(t *testing.T) { name: "TesterHelpAppFoo", srcs: ["foo/bar/MyClass.java"], apex_available: [ "myapex" ], + sdk_version: "test_current", } `) @@ -7736,7 +7781,7 @@ func TestSymlinksFromApexToSystem(t *testing.T) { srcs: ["foo/bar/MyClass.java"], sdk_version: "none", system_modules: "none", - libs: ["myotherjar"], + static_libs: ["myotherjar"], apex_available: [ "myapex", "myapex.updatable", @@ -8397,6 +8442,7 @@ func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) { apex_available: [ "myapex", ], + sdk_version: "current", } systemserverclasspath_fragment { @@ -9439,6 +9485,7 @@ func TestApexJavaCoverage(t *testing.T) { srcs: ["mybootclasspathlib.java"], apex_available: ["myapex"], compile_dex: true, + sdk_version: "current", } systemserverclasspath_fragment { @@ -9754,6 +9801,7 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) { unsafe_ignore_missing_latest_api: true, min_sdk_version: "31", static_libs: ["util"], + sdk_version: "core_current", } java_library { @@ -9762,6 +9810,7 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) { apex_available: ["myapex"], min_sdk_version: "31", static_libs: ["another_util"], + sdk_version: "core_current", } java_library { @@ -9769,6 +9818,7 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) { srcs: ["a.java"], min_sdk_version: "31", apex_available: ["myapex"], + sdk_version: "core_current", } `) }) @@ -9824,7 +9874,7 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) { }) t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) { - preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)). + preparer. RunTestWithBp(t, ` apex { name: "myapex", @@ -9855,6 +9905,8 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) { apex_available: ["myapex"], compile_dex: true, unsafe_ignore_missing_latest_api: true, + sdk_version: "current", + min_sdk_version: "30", } `) }) @@ -10107,6 +10159,9 @@ func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) { key: "myapex.key", bootclasspath_fragments: ["mybootclasspathfragment"], min_sdk_version: "29", + java_libs: [ + "jacocoagent", + ], } apex_key { name: "myapex.key", diff --git a/apex/bootclasspath_fragment_test.go b/apex/bootclasspath_fragment_test.go index 25131eec6..7cad337cb 100644 --- a/apex/bootclasspath_fragment_test.go +++ b/apex/bootclasspath_fragment_test.go @@ -104,6 +104,7 @@ func TestBootclasspathFragments_FragmentDependency(t *testing.T) { test: { enabled: true, }, + sdk_version: "core_current", } java_library { @@ -749,6 +750,7 @@ func TestBootclasspathFragment_HiddenAPIList(t *testing.T) { ], srcs: ["b.java"], compile_dex: true, + sdk_version: "core_current", } java_sdk_library { @@ -922,6 +924,7 @@ func TestBootclasspathFragment_AndroidNonUpdatable_FromSource(t *testing.T) { ], srcs: ["b.java"], compile_dex: true, + sdk_version: "core_current", } java_library { @@ -1093,6 +1096,7 @@ func TestBootclasspathFragment_AndroidNonUpdatable_FromText(t *testing.T) { ], srcs: ["b.java"], compile_dex: true, + sdk_version: "core_current", } java_library { @@ -1245,6 +1249,7 @@ func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *test ], srcs: ["b.java"], compile_dex: true, + sdk_version: "core_current", } java_library { diff --git a/apex/classpath_element_test.go b/apex/classpath_element_test.go index b9a91982a..9e1ac943e 100644 --- a/apex/classpath_element_test.go +++ b/apex/classpath_element_test.go @@ -92,6 +92,7 @@ func TestCreateClasspathElements(t *testing.T) { ], srcs: ["b.java"], installable: true, + sdk_version: "core_current", } java_library { diff --git a/apex/container_test.go b/apex/container_test.go index 39311741d..d28b1a649 100644 --- a/apex/container_test.go +++ b/apex/container_test.go @@ -30,7 +30,7 @@ func TestApexDepsContainers(t *testing.T) { result := android.GroupFixturePreparers( prepareForApexTest, java.PrepareForTestWithJavaSdkLibraryFiles, - java.FixtureWithLastReleaseApis("mybootclasspathlib"), + java.FixtureWithLastReleaseApis("mybootclasspathlib", "bar"), ).RunTestWithBp(t, ` apex { name: "myapex", @@ -68,16 +68,17 @@ func TestApexDepsContainers(t *testing.T) { ], compile_dex: true, static_libs: [ - "foo", + "food", "baz", ], libs: [ - "bar", + "bar.stubs", ], min_sdk_version: "30", + sdk_version: "current", } java_library { - name: "foo", + name: "food", srcs:[ "A.java", ], @@ -85,13 +86,15 @@ func TestApexDepsContainers(t *testing.T) { "myapex", ], min_sdk_version: "30", + sdk_version: "core_current", } - java_library { + java_sdk_library { name: "bar", srcs:[ "A.java", ], min_sdk_version: "30", + sdk_version: "core_current", } java_library { name: "baz", @@ -103,6 +106,7 @@ func TestApexDepsContainers(t *testing.T) { "myapex", ], min_sdk_version: "30", + sdk_version: "core_current", } `) testcases := []struct { @@ -130,7 +134,7 @@ func TestApexDepsContainers(t *testing.T) { isApexContainer: false, }, { - moduleName: "foo", + moduleName: "food", variant: "android_common_apex30", isSystemContainer: true, isApexContainer: true, @@ -162,7 +166,7 @@ func TestNonUpdatableApexDepsContainers(t *testing.T) { result := android.GroupFixturePreparers( prepareForApexTest, java.PrepareForTestWithJavaSdkLibraryFiles, - java.FixtureWithLastReleaseApis("mybootclasspathlib"), + java.FixtureWithLastReleaseApis("mybootclasspathlib", "bar"), ).RunTestWithBp(t, ` apex { name: "myapex", @@ -199,26 +203,30 @@ func TestNonUpdatableApexDepsContainers(t *testing.T) { ], compile_dex: true, static_libs: [ - "foo", + "food", ], libs: [ - "bar", + "bar.stubs", ], + sdk_version: "current", } java_library { - name: "foo", + name: "food", srcs:[ "A.java", ], apex_available: [ "myapex", ], + sdk_version: "core_current", } - java_library { + java_sdk_library { name: "bar", srcs:[ "A.java", ], + sdk_version: "none", + system_modules: "none", } `) testcases := []struct { @@ -246,7 +254,7 @@ func TestNonUpdatableApexDepsContainers(t *testing.T) { isApexContainer: false, }, { - moduleName: "foo", + moduleName: "food", variant: "android_common_apex10000", isSystemContainer: true, isApexContainer: true, diff --git a/apex/platform_bootclasspath_test.go b/apex/platform_bootclasspath_test.go index 17ade1d5c..9c2d89951 100644 --- a/apex/platform_bootclasspath_test.go +++ b/apex/platform_bootclasspath_test.go @@ -293,6 +293,7 @@ func TestPlatformBootclasspathDependencies(t *testing.T) { ], srcs: ["b.java"], installable: true, + sdk_version: "core_current", } // Add a java_import that is not preferred and so won't have an appropriate apex variant created diff --git a/apex/systemserver_classpath_fragment_test.go b/apex/systemserver_classpath_fragment_test.go index 452a43efa..fd9020b7f 100644 --- a/apex/systemserver_classpath_fragment_test.go +++ b/apex/systemserver_classpath_fragment_test.go @@ -80,6 +80,7 @@ func TestSystemserverclasspathFragmentContents(t *testing.T) { apex_available: [ "myapex", ], + sdk_version: "core_current", } systemserverclasspath_fragment { @@ -350,6 +351,7 @@ func TestSystemserverclasspathFragmentStandaloneContents(t *testing.T) { apex_available: [ "myapex", ], + sdk_version: "core_current", } systemserverclasspath_fragment { diff --git a/java/base.go b/java/base.go index 4cd60215c..e516891a3 100644 --- a/java/base.go +++ b/java/base.go @@ -593,6 +593,13 @@ func (j *Module) InstallInProduct() bool { return j.ProductSpecific() } +var _ android.StubsAvailableModule = (*Module)(nil) + +// To safisfy the StubsAvailableModule interface +func (j *Module) IsStubsModule() bool { + return proptools.Bool(j.properties.Is_stubs_module) +} + func (j *Module) CheckStableSdkVersion(ctx android.BaseModuleContext) error { sdkVersion := j.SdkVersion(ctx) if sdkVersion.Stable() { diff --git a/java/core-libraries/Android.bp b/java/core-libraries/Android.bp index cee7a192e..1cca7ad49 100644 --- a/java/core-libraries/Android.bp +++ b/java/core-libraries/Android.bp @@ -38,6 +38,7 @@ java_defaults { visibility: ["//visibility:public"], sdk_version: "none", system_modules: "none", + is_stubs_module: true, } java_library { @@ -289,6 +290,7 @@ java_defaults { sdk_version: "none", system_modules: "none", patch_module: "java.base", + is_stubs_module: true, } // Same as legacy.core.platform.api.stubs, but android annotations are @@ -307,6 +309,7 @@ java_library { "legacy.core.platform.api.stubs", ], patch_module: "java.base", + is_stubs_module: true, } java_library { @@ -339,6 +342,7 @@ java_library { "stable.core.platform.api.stubs", ], patch_module: "java.base", + is_stubs_module: true, } // Used when compiling higher-level code against *.core.platform.api.stubs. diff --git a/java/dexpreopt_test.go b/java/dexpreopt_test.go index 73e33f4fb..07d0595e6 100644 --- a/java/dexpreopt_test.go +++ b/java/dexpreopt_test.go @@ -54,6 +54,7 @@ func TestDexpreoptEnabled(t *testing.T) { name: "foo", installable: true, srcs: ["a.java"], + sdk_version: "current", }`, enabled: true, }, @@ -98,6 +99,7 @@ func TestDexpreoptEnabled(t *testing.T) { java_library { name: "foo", installable: true, + sdk_version: "current", }`, enabled: false, }, @@ -107,6 +109,7 @@ func TestDexpreoptEnabled(t *testing.T) { java_library { name: "foo", srcs: ["a.java"], + sdk_version: "current", }`, enabled: false, }, @@ -144,6 +147,7 @@ func TestDexpreoptEnabled(t *testing.T) { name: "foo", srcs: ["a.java"], compile_dex: true, + sdk_version: "current", }`, enabled: false, }, @@ -164,6 +168,7 @@ func TestDexpreoptEnabled(t *testing.T) { installable: true, srcs: ["a.java"], apex_available: ["com.android.apex1"], + sdk_version: "current", }`, apexVariant: true, enabled: false, @@ -176,6 +181,7 @@ func TestDexpreoptEnabled(t *testing.T) { installable: true, srcs: ["a.java"], apex_available: ["com.android.apex1"], + sdk_version: "current", }`, moduleName: "service-foo", apexVariant: true, @@ -189,6 +195,7 @@ func TestDexpreoptEnabled(t *testing.T) { installable: true, srcs: ["a.java"], apex_available: ["com.android.apex1"], + sdk_version: "current", }`, moduleName: "prebuilt_service-foo", apexVariant: true, @@ -202,6 +209,7 @@ func TestDexpreoptEnabled(t *testing.T) { installable: true, srcs: ["a.java"], apex_available: ["com.android.apex1"], + sdk_version: "current", }`, moduleName: "service-foo", apexVariant: false, @@ -311,6 +319,7 @@ func TestDexpreoptBuiltInstalledForApex(t *testing.T) { installable: true, srcs: ["a.java"], apex_available: ["com.android.apex1"], + sdk_version: "current", }`) ctx := result.TestContext module := ctx.ModuleForTests("service-foo", "android_common_apex1000") @@ -342,6 +351,7 @@ func TestDexpreoptBuiltInstalledForApex(t *testing.T) { name: "foo", installable: true, srcs: ["a.java"], + sdk_version: "current", }`) ctx = result.TestContext module = ctx.ModuleForTests("foo", "android_common") @@ -398,6 +408,7 @@ func TestAndroidMkEntriesForApex(t *testing.T) { installable: true, srcs: ["a.java"], apex_available: ["com.android.apex1"], + sdk_version: "current", }`) ctx := result.TestContext module := ctx.ModuleForTests("service-foo", "android_common_apex1000") @@ -429,6 +440,7 @@ func TestAndroidMkEntriesForApex(t *testing.T) { name: "foo", installable: true, srcs: ["a.java"], + sdk_version: "current", }`) ctx = result.TestContext module = ctx.ModuleForTests("foo", "android_common") @@ -454,6 +466,7 @@ func TestGenerateProfileEvenIfDexpreoptIsDisabled(t *testing.T) { profile: "art-profile", }, srcs: ["a.java"], + sdk_version: "current", }`) ctx := result.TestContext diff --git a/java/sdk_library.go b/java/sdk_library.go index 25317c50d..a7a254af8 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -2099,6 +2099,7 @@ func (module *SdkLibrary) topLevelStubsLibraryProps(mctx android.DefaultableHook props.Dist.Dir = proptools.StringPtr(module.apiDistPath(apiScope)) props.Dist.Tag = proptools.StringPtr(".jar") } + props.Is_stubs_module = proptools.BoolPtr(true) return props } diff --git a/java/testing.go b/java/testing.go index 0e85022ce..03dcee667 100644 --- a/java/testing.go +++ b/java/testing.go @@ -184,6 +184,10 @@ var PrepareForTestWithJacocoInstrumentation = android.GroupFixturePreparers( host_supported: true, srcs: ["Test.java"], sdk_version: "current", + apex_available: [ + "//apex_available:anyapex", + "//apex_available:platform", + ], } `)), ) @@ -408,7 +412,6 @@ func gatherRequiredDepsForTest() string { "core.current.stubs", "legacy.core.platform.api.stubs", "stable.core.platform.api.stubs", - "android_stubs_current_exportable", "android_system_stubs_current_exportable", "android_test_stubs_current_exportable", @@ -416,13 +419,11 @@ func gatherRequiredDepsForTest() string { "android_system_server_stubs_current_exportable", "core.current.stubs.exportable", "legacy.core.platform.api.stubs.exportable", - "kotlin-stdlib", "kotlin-stdlib-jdk7", "kotlin-stdlib-jdk8", "kotlin-annotations", "stub-annotations", - "aconfig-annotations-lib", "unsupportedappusage", } @@ -435,6 +436,7 @@ func gatherRequiredDepsForTest() string { sdk_version: "none", system_modules: "stable-core-platform-api-stubs-system-modules", compile_dex: true, + is_stubs_module: true, } `, extra) } diff --git a/sdk/bootclasspath_fragment_sdk_test.go b/sdk/bootclasspath_fragment_sdk_test.go index 7ee548f34..8b994eb64 100644 --- a/sdk/bootclasspath_fragment_sdk_test.go +++ b/sdk/bootclasspath_fragment_sdk_test.go @@ -338,6 +338,7 @@ func testSnapshotWithBootClasspathFragment_Contents(t *testing.T, sdk string, co shared_library: false, public: {enabled: true}, min_sdk_version: "2", + sdk_version: "current", } java_sdk_library { @@ -348,6 +349,7 @@ func testSnapshotWithBootClasspathFragment_Contents(t *testing.T, sdk string, co public: {enabled: true}, min_sdk_version: "2", permitted_packages: ["myothersdklibrary"], + sdk_version: "current", } java_sdk_library { @@ -357,6 +359,7 @@ func testSnapshotWithBootClasspathFragment_Contents(t *testing.T, sdk string, co compile_dex: true, public: {enabled: true}, min_sdk_version: "2", + sdk_version: "current", } `), ).RunTest(t) @@ -624,6 +627,7 @@ func TestSnapshotWithBootClasspathFragment_Fragments(t *testing.T) { min_sdk_version: "2", permitted_packages: ["myothersdklibrary"], compile_dex: true, + sdk_version: "current", } `), @@ -655,6 +659,7 @@ func TestSnapshotWithBootClasspathFragment_Fragments(t *testing.T) { shared_library: false, public: {enabled: true}, min_sdk_version: "2", + sdk_version: "current", } `), ).RunTest(t) @@ -877,6 +882,7 @@ func TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) { public: {enabled: true}, permitted_packages: ["mysdklibrary"], min_sdk_version: "current", + sdk_version: "current", } java_sdk_library { @@ -895,6 +901,7 @@ func TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) { package_prefixes: ["newlibrary.all.mine"], single_packages: ["newlibrary.mine"], }, + sdk_version: "current", } `), ).RunTest(t) @@ -1080,6 +1087,7 @@ func testSnapshotWithBootClasspathFragment_MinSdkVersion(t *testing.T, targetBui shared_library: false, public: {enabled: true}, min_sdk_version: "S", + sdk_version: "current", } java_sdk_library { @@ -1090,6 +1098,7 @@ func testSnapshotWithBootClasspathFragment_MinSdkVersion(t *testing.T, targetBui public: {enabled: true}, min_sdk_version: "Tiramisu", permitted_packages: ["mynewsdklibrary"], + sdk_version: "current", } `), ).RunTest(t) @@ -1287,6 +1296,7 @@ func TestSnapshotWithEmptyBootClasspathFragment(t *testing.T) { shared_library: false, public: {enabled: true}, min_sdk_version: "Tiramisu", + sdk_version: "current", } java_sdk_library { name: "mynewsdklibrary", @@ -1296,6 +1306,7 @@ func TestSnapshotWithEmptyBootClasspathFragment(t *testing.T) { public: {enabled: true}, min_sdk_version: "Tiramisu", permitted_packages: ["mynewsdklibrary"], + sdk_version: "current", } `), ).RunTest(t) diff --git a/sdk/systemserverclasspath_fragment_sdk_test.go b/sdk/systemserverclasspath_fragment_sdk_test.go index c1c4ed699..fd6c4e7b8 100644 --- a/sdk/systemserverclasspath_fragment_sdk_test.go +++ b/sdk/systemserverclasspath_fragment_sdk_test.go @@ -80,6 +80,7 @@ func testSnapshotWithSystemServerClasspathFragment(t *testing.T, sdk string, tar dex_preopt: { profile: "art-profile", }, + sdk_version: "current", } `), ).RunTest(t) @@ -110,12 +111,14 @@ func TestSnapshotWithPartialSystemServerClasspathFragment(t *testing.T) { apex_available: ["myapex"], srcs: ["Test.java"], min_sdk_version: "33", // Tiramisu + sdk_version: "current", } java_sdk_library { name: "mysdklibrary-future", apex_available: ["myapex"], srcs: ["Test.java"], min_sdk_version: "34", // UpsideDownCake + sdk_version: "current", } sdk { name: "mysdk", @@ -199,6 +202,7 @@ func TestSnapshotWithEmptySystemServerClasspathFragment(t *testing.T) { apex_available: ["myapex"], srcs: ["Test.java"], min_sdk_version: "34", // UpsideDownCake + sdk_version: "current", } sdk { name: "mysdk",