From a3a05460b478ed59c527dec1c8b2efa61ce9c53c Mon Sep 17 00:00:00 2001 From: Jihoon Kang Date: Fri, 5 Apr 2024 00:36:44 +0000 Subject: [PATCH] Revert^2 "Remove compilation actions from java sdk library" This change modifies the build actions of java_sdk_library module type so that it does not perform any compilation actions (i.e. does not create the top level java_sdk_library jar file). Instead, it delegates the build actions the top level jar file was performing to the dynamically created ".impl"-suffixed java library module. The build actions that are delegated to the impl library module include hiddenapi processing, dexing, and dexpreopt. This change relands https://r.android.com/3035972. Implementation changes from the original change: - "all_apex_contributions" is added as a dependecy to the implementation library modules where the parent sdk_library module has a prebuilt equivalent. This allows the source apex variant to be hidden from make when the prebuilt is active. Test: patch in internal main, lunch barbet-ap2a-userdebug && m nothing Test: m nothing --no-skip-soong-tests Bug: 332785297 Change-Id: I017938e5567aef82e428e7ceb557d9c9090e0257 --- android/apex_contributions.go | 6 +- android/base_module_context.go | 2 +- android/prebuilt.go | 6 +- android/testing.go | 2 +- apex/apex.go | 8 +- apex/apex_test.go | 4 +- java/androidmk_test.go | 4 +- java/base.go | 6 +- java/code_metadata_test.go | 1 + java/dexpreopt.go | 6 +- java/hiddenapi_singleton.go | 4 + java/hiddenapi_singleton_test.go | 16 +--- java/java.go | 53 +++++++++--- java/platform_bootclasspath_test.go | 2 +- java/sdk_library.go | 108 +++++++++++++++++++------ java/sdk_library_test.go | 20 ++--- sdk/bootclasspath_fragment_sdk_test.go | 8 +- 17 files changed, 177 insertions(+), 79 deletions(-) diff --git a/android/apex_contributions.go b/android/apex_contributions.go index dd09fbf44..03e32d6fa 100644 --- a/android/apex_contributions.go +++ b/android/apex_contributions.go @@ -103,12 +103,12 @@ type apexContributionsDepTag struct { } var ( - acDepTag = apexContributionsDepTag{} + AcDepTag = apexContributionsDepTag{} ) // Creates a dep to each selected apex_contributions func (a *allApexContributions) DepsMutator(ctx BottomUpMutatorContext) { - ctx.AddDependency(ctx.Module(), acDepTag, ctx.Config().AllApexContributions()...) + ctx.AddDependency(ctx.Module(), AcDepTag, ctx.Config().AllApexContributions()...) } // Set PrebuiltSelectionInfoProvider in post deps phase @@ -142,7 +142,7 @@ func (a *allApexContributions) SetPrebuiltSelectionInfoProvider(ctx BaseModuleCo // (e.g. shiba and shiba_fullmte) // Eventually these product variants will have their own release config maps. if !proptools.Bool(ctx.Config().BuildIgnoreApexContributionContents()) { - ctx.VisitDirectDepsWithTag(acDepTag, func(child Module) { + ctx.VisitDirectDepsWithTag(AcDepTag, func(child Module) { if m, ok := child.(*apexContributions); ok { addContentsToProvider(&p, m) } else { diff --git a/android/base_module_context.go b/android/base_module_context.go index c5fe58578..2dc1fd7c6 100644 --- a/android/base_module_context.go +++ b/android/base_module_context.go @@ -536,7 +536,7 @@ func IsMetaDependencyTag(tag blueprint.DependencyTag) bool { return true } else if tag == licensesTag { return true - } else if tag == acDepTag { + } else if tag == AcDepTag { return true } return false diff --git a/android/prebuilt.go b/android/prebuilt.go index 91ba05b6b..794ddcc2f 100644 --- a/android/prebuilt.go +++ b/android/prebuilt.go @@ -437,7 +437,7 @@ func PrebuiltSourceDepsMutator(ctx BottomUpMutatorContext) { // TODO: When all branches contain this singleton module, make this strict // TODO: Add this dependency only for mainline prebuilts and not every prebuilt module if ctx.OtherModuleExists("all_apex_contributions") { - ctx.AddDependency(m, acDepTag, "all_apex_contributions") + ctx.AddDependency(m, AcDepTag, "all_apex_contributions") } } @@ -474,7 +474,7 @@ func PrebuiltSelectModuleMutator(ctx BottomUpMutatorContext) { } // Propagate the provider received from `all_apex_contributions` // to the source module - ctx.VisitDirectDepsWithTag(acDepTag, func(am Module) { + ctx.VisitDirectDepsWithTag(AcDepTag, func(am Module) { psi, _ := OtherModuleProvider(ctx, am, PrebuiltSelectionInfoProvider) SetProvider(ctx, PrebuiltSelectionInfoProvider, psi) }) @@ -580,7 +580,7 @@ func PrebuiltPostDepsMutator(ctx BottomUpMutatorContext) { bmn, _ := m.(baseModuleName) name := bmn.BaseModuleName() psi := PrebuiltSelectionInfoMap{} - ctx.VisitDirectDepsWithTag(acDepTag, func(am Module) { + ctx.VisitDirectDepsWithTag(AcDepTag, func(am Module) { psi, _ = OtherModuleProvider(ctx, am, PrebuiltSelectionInfoProvider) }) diff --git a/android/testing.go b/android/testing.go index 7b4411e2f..a67624a3f 100644 --- a/android/testing.go +++ b/android/testing.go @@ -1122,7 +1122,7 @@ func AndroidMkEntriesForTest(t *testing.T, ctx *TestContext, mod blueprint.Modul entriesList := p.AndroidMkEntries() aconfigUpdateAndroidMkEntries(ctx, mod.(Module), &entriesList) - for i, _ := range entriesList { + for i := range entriesList { entriesList[i].fillInEntries(ctx, mod) } return entriesList diff --git a/apex/apex.go b/apex/apex.go index cb8449c5a..2e7fbf6ac 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -1672,7 +1672,13 @@ func apexFileForJavaModuleWithFile(ctx android.BaseModuleContext, module javaMod af.jacocoReportClassesFile = module.JacocoReportClassesFile() af.lintDepSets = module.LintDepSets() af.customStem = module.Stem() + ".jar" - if dexpreopter, ok := module.(java.DexpreopterInterface); ok { + // TODO: b/338641779 - Remove special casing of sdkLibrary once bcpf and sscpf depends + // on the implementation library + if sdkLib, ok := module.(*java.SdkLibrary); ok { + for _, install := range sdkLib.BuiltInstalledForApex() { + af.requiredModuleNames = append(af.requiredModuleNames, install.FullModuleName()) + } + } else if dexpreopter, ok := module.(java.DexpreopterInterface); ok { for _, install := range dexpreopter.DexpreoptBuiltInstalledForApex() { af.requiredModuleNames = append(af.requiredModuleNames, install.FullModuleName()) } diff --git a/apex/apex_test.go b/apex/apex_test.go index 2441b023b..0825ab974 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -7167,7 +7167,7 @@ func TestJavaSDKLibrary_WithinApex(t *testing.T) { // The bar library should depend on the implementation jar. barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac") - if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) { + if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) { t.Errorf("expected %q, found %#q", expected, actual) } } @@ -7308,7 +7308,7 @@ func TestJavaSDKLibrary_ImportPreferred(t *testing.T) { // The bar library should depend on the implementation jar. barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac") - if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) { + if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) { t.Errorf("expected %q, found %#q", expected, actual) } } diff --git a/java/androidmk_test.go b/java/androidmk_test.go index 1232cd1ee..2978a40aa 100644 --- a/java/androidmk_test.go +++ b/java/androidmk_test.go @@ -161,8 +161,8 @@ func TestJavaSdkLibrary_RequireXmlPermissionFile(t *testing.T) { moduleName string expected []string }{ - {"foo-shared_library", []string{"foo-shared_library.xml"}}, - {"foo-no_shared_library", nil}, + {"foo-shared_library", []string{"foo-shared_library.impl", "foo-shared_library.xml"}}, + {"foo-no_shared_library", []string{"foo-no_shared_library.impl"}}, } for _, tc := range testCases { mod := result.ModuleForTests(tc.moduleName, "android_common").Module() diff --git a/java/base.go b/java/base.go index 938ac5e82..06c18ca43 100644 --- a/java/base.go +++ b/java/base.go @@ -1682,7 +1682,11 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath j.dexJarFile = makeDexJarPathFromPath(dexOutputFile) // Dexpreopting - j.dexpreopt(ctx, android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName()), dexOutputFile) + libName := android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName()) + if j.SdkLibraryName() != nil && strings.HasSuffix(ctx.ModuleName(), ".impl") { + libName = strings.TrimSuffix(libName, ".impl") + } + j.dexpreopt(ctx, libName, dexOutputFile) outputFile = dexOutputFile } else { diff --git a/java/code_metadata_test.go b/java/code_metadata_test.go index 0ef348afe..99b1f5226 100644 --- a/java/code_metadata_test.go +++ b/java/code_metadata_test.go @@ -7,6 +7,7 @@ import ( "android/soong/android" soongTesting "android/soong/testing" "android/soong/testing/code_metadata_internal_proto" + "google.golang.org/protobuf/proto" ) diff --git a/java/dexpreopt.go b/java/dexpreopt.go index 25e95db14..1acac1b40 100644 --- a/java/dexpreopt.go +++ b/java/dexpreopt.go @@ -196,8 +196,10 @@ func disableSourceApexVariant(ctx android.BaseModuleContext) bool { } apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) psi := android.PrebuiltSelectionInfoMap{} - ctx.VisitDirectDepsWithTag(android.PrebuiltDepTag, func(am android.Module) { - psi, _ = android.OtherModuleProvider(ctx, am, android.PrebuiltSelectionInfoProvider) + ctx.VisitDirectDeps(func(am android.Module) { + if prebuiltSelectionInfo, ok := android.OtherModuleProvider(ctx, am, android.PrebuiltSelectionInfoProvider); ok { + psi = prebuiltSelectionInfo + } }) // Find the apex variant for this module _, apexVariantsWithoutTestApexes, _ := android.ListSetDifference(apexInfo.InApexVariants, apexInfo.TestApexes) diff --git a/java/hiddenapi_singleton.go b/java/hiddenapi_singleton.go index 8cb78cd54..7d21b7a61 100644 --- a/java/hiddenapi_singleton.go +++ b/java/hiddenapi_singleton.go @@ -150,6 +150,10 @@ func isModuleInConfiguredList(ctx android.BaseModuleContext, module android.Modu // Strip a prebuilt_ prefix so that this can match a prebuilt module that has not been renamed. name = android.RemoveOptionalPrebuiltPrefix(name) + // Strip the ".impl" suffix, so that the implementation library of the java_sdk_library is + // treated identical to the top level java_sdk_library. + name = strings.TrimSuffix(name, ".impl") + // Ignore any module that is not listed in the boot image configuration. index := configuredBootJars.IndexOfJar(name) if index == -1 { diff --git a/java/hiddenapi_singleton_test.go b/java/hiddenapi_singleton_test.go index c1fee2184..330013ee4 100644 --- a/java/hiddenapi_singleton_test.go +++ b/java/hiddenapi_singleton_test.go @@ -303,7 +303,7 @@ func TestHiddenAPIEncoding_JavaSdkLibrary(t *testing.T) { `) checkDexEncoded := func(t *testing.T, name, unencodedDexJar, encodedDexJar string) { - moduleForTests := result.ModuleForTests(name, "android_common") + moduleForTests := result.ModuleForTests(name+".impl", "android_common") encodeDexRule := moduleForTests.Rule("hiddenAPIEncodeDex") actualUnencodedDexJar := encodeDexRule.Input @@ -319,18 +319,8 @@ func TestHiddenAPIEncoding_JavaSdkLibrary(t *testing.T) { // The java_library embedded with the java_sdk_library must be dex encoded. t.Run("foo", func(t *testing.T) { - expectedUnencodedDexJar := "out/soong/.intermediates/foo/android_common/aligned/foo.jar" - expectedEncodedDexJar := "out/soong/.intermediates/foo/android_common/hiddenapi/foo.jar" + expectedUnencodedDexJar := "out/soong/.intermediates/foo.impl/android_common/aligned/foo.jar" + expectedEncodedDexJar := "out/soong/.intermediates/foo.impl/android_common/hiddenapi/foo.jar" checkDexEncoded(t, "foo", expectedUnencodedDexJar, expectedEncodedDexJar) }) - - // The dex jar of the child implementation java_library of the java_sdk_library is not currently - // dex encoded. - t.Run("foo.impl", func(t *testing.T) { - fooImpl := result.ModuleForTests("foo.impl", "android_common") - encodeDexRule := fooImpl.MaybeRule("hiddenAPIEncodeDex") - if encodeDexRule.Rule != nil { - t.Errorf("foo.impl is not expected to be encoded") - } - }) } diff --git a/java/java.go b/java/java.go index 2834c5f0c..54d2aa6e0 100644 --- a/java/java.go +++ b/java/java.go @@ -670,6 +670,10 @@ type Library struct { var _ android.ApexModule = (*Library)(nil) +func (j *Library) CheckDepsMinSdkVersion(ctx android.ModuleContext) { + CheckMinSdkVersion(ctx, j) +} + // Provides access to the list of permitted packages from apex boot jars. type PermittedPackagesForUpdatableBootJars interface { PermittedPackagesForUpdatableBootJars() []string @@ -898,6 +902,12 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) { j.minSdkVersion = j.MinSdkVersion(ctx) j.maxSdkVersion = j.MaxSdkVersion(ctx) + // Check min_sdk_version of the transitive dependencies if this module is created from + // java_sdk_library. + if j.deviceProperties.Min_sdk_version != nil && j.SdkLibraryName() != nil { + j.CheckDepsMinSdkVersion(ctx) + } + // SdkLibrary.GenerateAndroidBuildActions(ctx) sets the stubsLinkType to Unknown. // If the stubsLinkType has already been set to Unknown, the stubsLinkType should // not be overridden. @@ -928,8 +938,12 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) { j.checkSdkVersions(ctx) j.checkHeadersOnly(ctx) if ctx.Device() { + libName := j.Name() + if j.SdkLibraryName() != nil && strings.HasSuffix(libName, ".impl") { + libName = proptools.String(j.SdkLibraryName()) + } j.dexpreopter.installPath = j.dexpreopter.getInstallPath( - ctx, j.Name(), android.PathForModuleInstall(ctx, "framework", j.Stem()+".jar")) + ctx, libName, android.PathForModuleInstall(ctx, "framework", j.Stem()+".jar")) j.dexpreopter.isSDKLibrary = j.deviceProperties.IsSDKLibrary setUncompressDex(ctx, &j.dexpreopter, &j.dexer) j.dexpreopter.uncompressedDex = *j.dexProperties.Uncompress_dex @@ -940,8 +954,24 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) { } j.compile(ctx, nil, nil, nil) - exclusivelyForApex := !apexInfo.IsForPlatform() - if (Bool(j.properties.Installable) || ctx.Host()) && !exclusivelyForApex { + // If this module is an impl library created from java_sdk_library, + // install the files under the java_sdk_library module outdir instead of this module outdir. + if j.SdkLibraryName() != nil && strings.HasSuffix(j.Name(), ".impl") { + j.setInstallRules(ctx, proptools.String(j.SdkLibraryName())) + } else { + j.setInstallRules(ctx, ctx.ModuleName()) + } + + android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{ + TestOnly: Bool(j.sourceProperties.Test_only), + TopLevelTarget: j.sourceProperties.Top_level_test_target, + }) +} + +func (j *Library) setInstallRules(ctx android.ModuleContext, installModuleName string) { + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) + + if (Bool(j.properties.Installable) || ctx.Host()) && apexInfo.IsForPlatform() { var extraInstallDeps android.InstallPaths if j.InstallMixin != nil { extraInstallDeps = j.InstallMixin(ctx, j.outputFile) @@ -958,22 +988,27 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) { if !ctx.Host() { archDir = ctx.DeviceConfig().DeviceArch() } - installDir = android.PathForModuleInstall(ctx, ctx.ModuleName(), archDir) + installDir = android.PathForModuleInstall(ctx, installModuleName, archDir) } else { installDir = android.PathForModuleInstall(ctx, "framework") } j.installFile = ctx.InstallFile(installDir, j.Stem()+".jar", j.outputFile, extraInstallDeps...) } - - android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{ - TestOnly: Bool(j.sourceProperties.Test_only), - TopLevelTarget: j.sourceProperties.Top_level_test_target, - }) } func (j *Library) DepsMutator(ctx android.BottomUpMutatorContext) { j.usesLibrary.deps(ctx, false) j.deps(ctx) + + if j.SdkLibraryName() != nil && strings.HasSuffix(j.Name(), ".impl") { + if dexpreopt.IsDex2oatNeeded(ctx) { + dexpreopt.RegisterToolDeps(ctx) + } + prebuiltSdkLibExists := ctx.OtherModuleExists(android.PrebuiltNameFromSource(proptools.String(j.SdkLibraryName()))) + if prebuiltSdkLibExists && ctx.OtherModuleExists("all_apex_contributions") { + ctx.AddDependency(ctx.Module(), android.AcDepTag, "all_apex_contributions") + } + } } const ( diff --git a/java/platform_bootclasspath_test.go b/java/platform_bootclasspath_test.go index 37ff6395c..0d2acaea0 100644 --- a/java/platform_bootclasspath_test.go +++ b/java/platform_bootclasspath_test.go @@ -353,7 +353,7 @@ func TestPlatformBootclasspath_HiddenAPIMonolithicFiles(t *testing.T) { // All the intermediate rules use the same inputs. expectedIntermediateInputs := ` - out/soong/.intermediates/bar/android_common/javac/bar.jar + out/soong/.intermediates/bar.impl/android_common/javac/bar.jar out/soong/.intermediates/foo-hiddenapi-annotations/android_common/javac/foo-hiddenapi-annotations.jar out/soong/.intermediates/foo/android_common/javac/foo.jar ` diff --git a/java/sdk_library.go b/java/sdk_library.go index 56b1d399d..bc3e7e912 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -953,6 +953,10 @@ type commonToSdkLibraryAndImport struct { // Path to the header jars of the implementation library // This is non-empty only when api_only is false. implLibraryHeaderJars android.Paths + + // The reference to the implementation library created by the source module. + // Is nil if the source module does not exist. + implLibraryModule *Library } func (c *commonToSdkLibraryAndImport) initCommon(module commonSdkLibraryAndImportModule) { @@ -999,6 +1003,10 @@ func (c *commonToSdkLibraryAndImport) generateCommonBuildActions(ctx android.Mod c.doctagPaths = android.PathsForModuleSrc(ctx, c.commonSdkLibraryProperties.Doctag_files) } +func (c *commonToSdkLibraryAndImport) getImplLibraryModule() *Library { + return c.implLibraryModule +} + // Module name of the runtime implementation library func (c *commonToSdkLibraryAndImport) implLibraryModuleName() string { return c.module.RootLibraryName() + ".impl" @@ -1375,6 +1383,8 @@ type SdkLibraryDependency interface { // sharedLibrary returns true if this can be used as a shared library. sharedLibrary() bool + + getImplLibraryModule() *Library } type SdkLibrary struct { @@ -1386,6 +1396,8 @@ type SdkLibrary struct { scopeToProperties map[*apiScope]*ApiScopeProperties commonToSdkLibraryAndImport + + builtInstalledForApex []dexpreopterInstall } var _ SdkLibraryDependency = (*SdkLibrary)(nil) @@ -1394,6 +1406,20 @@ func (module *SdkLibrary) generateTestAndSystemScopesByDefault() bool { return module.sdkLibraryProperties.Generate_system_and_test_apis } +func (module *SdkLibrary) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath { + if module.implLibraryModule != nil { + return module.implLibraryModule.DexJarBuildPath(ctx) + } + return makeUnsetDexJarPath() +} + +func (module *SdkLibrary) DexJarInstallPath() android.Path { + if module.implLibraryModule != nil { + return module.implLibraryModule.DexJarInstallPath() + } + return nil +} + func (module *SdkLibrary) getGeneratedApiScopes(ctx android.EarlyModuleContext) apiScopes { // Check to see if any scopes have been explicitly enabled. If any have then all // must be. @@ -1445,6 +1471,10 @@ func (module *SdkLibrary) getGeneratedApiScopes(ctx android.EarlyModuleContext) var _ android.ModuleWithMinSdkVersionCheck = (*SdkLibrary)(nil) func (module *SdkLibrary) CheckMinSdkVersion(ctx android.ModuleContext) { + CheckMinSdkVersion(ctx, &module.Library) +} + +func CheckMinSdkVersion(ctx android.ModuleContext, module *Library) { android.CheckMinSdkVersion(ctx, module.MinSdkVersion(ctx), func(c android.ModuleContext, do android.PayloadDepsCallback) { ctx.WalkDeps(func(child android.Module, parent android.Module) bool { isExternal := !module.depIsInSameApex(ctx, child) @@ -1541,10 +1571,6 @@ func (module *SdkLibrary) DepsMutator(ctx android.BottomUpMutatorContext) { m += "Please see the documentation of the prebuilt_apis module type (and a usage example in prebuilts/sdk) for a convenient way to generate these." ctx.ModuleErrorf(m) } - if module.requiresRuntimeImplementationLibrary() { - // Only add the deps for the library if it is actually going to be built. - module.Library.deps(ctx) - } } func (module *SdkLibrary) OutputFiles(tag string) (android.Paths, error) { @@ -1553,7 +1579,7 @@ func (module *SdkLibrary) OutputFiles(tag string) (android.Paths, error) { return paths, err } if module.requiresRuntimeImplementationLibrary() { - return module.Library.OutputFiles(tag) + return module.implLibraryModule.OutputFiles(tag) } if tag == "" { return nil, nil @@ -1568,18 +1594,12 @@ func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) // TODO (b/331665856): Implement a principled solution for this. module.HideFromMake() } - if proptools.String(module.deviceProperties.Min_sdk_version) != "" { - module.CheckMinSdkVersion(ctx) - } module.generateCommonBuildActions(ctx) - // Only build an implementation library if required. - if module.requiresRuntimeImplementationLibrary() { - // stubsLinkType must be set before calling Library.GenerateAndroidBuildActions - module.Library.stubsLinkType = Unknown - module.Library.GenerateAndroidBuildActions(ctx) - } + module.stem = proptools.StringDefault(module.overridableProperties.Stem, ctx.ModuleName()) + + module.provideHiddenAPIPropertyInfo(ctx) // Collate the components exported by this module. All scope specific modules are exported but // the impl and xml component modules are not. @@ -1606,10 +1626,40 @@ func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) if tag == implLibraryTag { if dep, ok := android.OtherModuleProvider(ctx, to, JavaInfoProvider); ok { module.implLibraryHeaderJars = append(module.implLibraryHeaderJars, dep.HeaderJars...) + module.implLibraryModule = to.(*Library) + android.SetProvider(ctx, JavaInfoProvider, dep) } } }) + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) + if !apexInfo.IsForPlatform() { + module.hideApexVariantFromMake = true + } + + if module.implLibraryModule != nil { + if ctx.Device() { + module.classesJarPaths = android.Paths{module.implLibraryModule.implementationJarFile} + module.bootDexJarPath = module.implLibraryModule.bootDexJarPath + module.uncompressDexState = module.implLibraryModule.uncompressDexState + module.active = module.implLibraryModule.active + } + + module.outputFile = module.implLibraryModule.outputFile + module.dexJarFile = makeDexJarPathFromPath(module.implLibraryModule.dexJarFile.Path()) + module.headerJarFile = module.implLibraryModule.headerJarFile + module.implementationAndResourcesJar = module.implLibraryModule.implementationAndResourcesJar + module.builtInstalledForApex = module.implLibraryModule.builtInstalledForApex + module.dexpreopter.configPath = module.implLibraryModule.dexpreopter.configPath + module.dexpreopter.outputProfilePathOnHost = module.implLibraryModule.dexpreopter.outputProfilePathOnHost + + if !module.Host() { + module.hostdexInstallFile = module.implLibraryModule.hostdexInstallFile + } + + android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: module.implLibraryModule.uniqueSrcFiles.Strings()}) + } + // Make the set of components exported by this module available for use elsewhere. exportedComponentInfo := android.ExportedComponentsInfo{Components: android.SortedKeys(exportedComponents)} android.SetProvider(ctx, android.ExportedComponentsInfoProvider, exportedComponentInfo) @@ -1635,13 +1685,18 @@ func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) android.SetProvider(ctx, android.AdditionalSdkInfoProvider, android.AdditionalSdkInfo{additionalSdkInfo}) } +func (module *SdkLibrary) BuiltInstalledForApex() []dexpreopterInstall { + return module.builtInstalledForApex +} + func (module *SdkLibrary) AndroidMkEntries() []android.AndroidMkEntries { if !module.requiresRuntimeImplementationLibrary() { return nil } entriesList := module.Library.AndroidMkEntries() + entries := &entriesList[0] + entries.Required = append(entries.Required, module.implLibraryModuleName()) if module.sharedLibrary() { - entries := &entriesList[0] entries.Required = append(entries.Required, module.xmlPermissionsModuleName()) } return entriesList @@ -1762,20 +1817,21 @@ func (module *SdkLibrary) createImplLibrary(mctx android.DefaultableHookContext) Libs []string Static_libs []string Apex_available []string + Stem *string }{ Name: proptools.StringPtr(module.implLibraryModuleName()), Visibility: visibility, // Set the instrument property to ensure it is instrumented when instrumentation is required. Instrument: true, - // Set the impl_only libs. Note that the module's "Libs" get appended as well, via the - // addition of &module.properties below. - Libs: module.sdkLibraryProperties.Impl_only_libs, - // Set the impl_only static libs. Note that the module's "static_libs" get appended as well, via the - // addition of &module.properties below. - Static_libs: module.sdkLibraryProperties.Impl_only_static_libs, + + Libs: append(module.properties.Libs, module.sdkLibraryProperties.Impl_only_libs...), + + Static_libs: append(module.properties.Static_libs, module.sdkLibraryProperties.Impl_only_static_libs...), // Pass the apex_available settings down so that the impl library can be statically // embedded within a library that is added to an APEX. Needed for updatable-media. Apex_available: module.ApexAvailable(), + + Stem: proptools.StringPtr(module.Name()), } properties := []interface{}{ @@ -2166,6 +2222,9 @@ func (module *SdkLibrary) DepIsInSameApex(mctx android.BaseModuleContext, dep an if depTag == xmlPermissionsFileTag { return true } + if dep.Name() == module.implLibraryModuleName() { + return true + } return module.Library.DepIsInSameApex(mctx, dep) } @@ -2591,10 +2650,6 @@ type SdkLibraryImport struct { commonToSdkLibraryAndImport - // The reference to the implementation library created by the source module. - // Is nil if the source module does not exist. - implLibraryModule *Library - // The reference to the xml permissions module created by the source module. // Is nil if the source module does not exist. xmlPermissionsFileModule *sdkLibraryXml @@ -3558,7 +3613,8 @@ func (s *sdkLibrarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMembe s.Min_device_sdk = sdk.commonSdkLibraryProperties.Min_device_sdk s.Max_device_sdk = sdk.commonSdkLibraryProperties.Max_device_sdk - if sdk.dexpreopter.dexpreoptProperties.Dex_preopt_result.Profile_guided { + implLibrary := sdk.getImplLibraryModule() + if implLibrary != nil && implLibrary.dexpreopter.dexpreoptProperties.Dex_preopt_result.Profile_guided { s.DexPreoptProfileGuided = proptools.BoolPtr(true) } } diff --git a/java/sdk_library_test.go b/java/sdk_library_test.go index 5fac2556d..1c94a8a8f 100644 --- a/java/sdk_library_test.go +++ b/java/sdk_library_test.go @@ -186,13 +186,13 @@ func TestJavaSdkLibrary(t *testing.T) { // test if quuz have created the api_contribution module result.ModuleForTests(apiScopePublic.stubsSourceModuleName("quuz")+".api.contribution", "") - fooDexJar := result.ModuleForTests("foo", "android_common").Rule("d8") - // tests if kotlinc generated files are NOT excluded from output of foo. - android.AssertStringDoesNotContain(t, "foo dex", fooDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module") + fooImplDexJar := result.ModuleForTests("foo.impl", "android_common").Rule("d8") + // tests if kotlinc generated files are NOT excluded from output of foo.impl. + android.AssertStringDoesNotContain(t, "foo.impl dex", fooImplDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module") - barDexJar := result.ModuleForTests("bar", "android_common").Rule("d8") - // tests if kotlinc generated files are excluded from output of bar. - android.AssertStringDoesContain(t, "bar dex", barDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module") + barImplDexJar := result.ModuleForTests("bar.impl", "android_common").Rule("d8") + // tests if kotlinc generated files are excluded from output of bar.impl. + android.AssertStringDoesContain(t, "bar.impl dex", barImplDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module") } func TestJavaSdkLibrary_UpdatableLibrary(t *testing.T) { @@ -1469,11 +1469,11 @@ func TestSdkLibrary_CheckMinSdkVersion(t *testing.T) { preparer.RunTestWithBp(t, ` java_sdk_library { name: "sdklib", - srcs: ["a.java"], - static_libs: ["util"], - min_sdk_version: "30", + srcs: ["a.java"], + static_libs: ["util"], + min_sdk_version: "30", unsafe_ignore_missing_latest_api: true, - } + } java_library { name: "util", diff --git a/sdk/bootclasspath_fragment_sdk_test.go b/sdk/bootclasspath_fragment_sdk_test.go index 8d3bbfa1b..6e2512262 100644 --- a/sdk/bootclasspath_fragment_sdk_test.go +++ b/sdk/bootclasspath_fragment_sdk_test.go @@ -1095,7 +1095,7 @@ func testSnapshotWithBootClasspathFragment_MinSdkVersion(t *testing.T, targetBui bcpf := result.ModuleForTests("mybootclasspathfragment", "android_common") rule := bcpf.Output("out/soong/.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi" + suffix + "/stub-flags.csv") - android.AssertPathsRelativeToTopEquals(t, "stub flags inputs", expectedStubFlagsInputs, rule.Implicits) + android.AssertPathsRelativeToTopEquals(t, "stub flags inputs", android.SortedUniqueStrings(expectedStubFlagsInputs), android.SortedUniquePaths(rule.Implicits)) CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(expectedSdkSnapshot), @@ -1153,7 +1153,7 @@ java_sdk_library_import { // of the snapshot. expectedStubFlagsInputs := []string{ "out/soong/.intermediates/mysdklibrary.stubs.exportable/android_common/dex/mysdklibrary.stubs.exportable.jar", - "out/soong/.intermediates/mysdklibrary/android_common/aligned/mysdklibrary.jar", + "out/soong/.intermediates/mysdklibrary.impl/android_common/aligned/mysdklibrary.jar", } testSnapshotWithBootClasspathFragment_MinSdkVersion(t, "S", @@ -1234,9 +1234,9 @@ java_sdk_library_import { // they are both part of the snapshot. expectedStubFlagsInputs := []string{ "out/soong/.intermediates/mynewsdklibrary.stubs.exportable/android_common/dex/mynewsdklibrary.stubs.exportable.jar", - "out/soong/.intermediates/mynewsdklibrary/android_common/aligned/mynewsdklibrary.jar", + "out/soong/.intermediates/mynewsdklibrary.impl/android_common/aligned/mynewsdklibrary.jar", "out/soong/.intermediates/mysdklibrary.stubs.exportable/android_common/dex/mysdklibrary.stubs.exportable.jar", - "out/soong/.intermediates/mysdklibrary/android_common/aligned/mysdklibrary.jar", + "out/soong/.intermediates/mysdklibrary.impl/android_common/aligned/mysdklibrary.jar", } testSnapshotWithBootClasspathFragment_MinSdkVersion(t, "Tiramisu",