diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go index 0cf084186..0cbc1c377 100644 --- a/java/bootclasspath_fragment.go +++ b/java/bootclasspath_fragment.go @@ -532,27 +532,18 @@ func (b *BootclasspathFragmentModule) configuredJars(ctx android.ModuleContext) global := dexpreopt.GetGlobalConfig(ctx) - // Convert content names to their appropriate stems, in case a test library is overriding an actual boot jar - var stems []string - for _, name := range b.properties.Contents { - dep := ctx.GetDirectDepWithTag(name, bootclasspathFragmentContentDepTag) - if m, ok := dep.(ModuleWithStem); ok { - stems = append(stems, m.Stem()) - } else { - ctx.PropertyErrorf("contents", "%v is not a ModuleWithStem", name) - } - } + possibleUpdatableModules := gatherPossibleUpdatableModuleNamesAndStems(ctx, b.properties.Contents, bootclasspathFragmentContentDepTag) // Only create configs for updatable boot jars. Non-updatable boot jars must be part of the // platform_bootclasspath's classpath proto config to guarantee that they come before any // updatable jars at runtime. - jars := global.UpdatableBootJars.Filter(stems) + jars := global.UpdatableBootJars.Filter(possibleUpdatableModules) // TODO(satayev): for apex_test we want to include all contents unconditionally to classpaths // config. However, any test specific jars would not be present in UpdatableBootJars. Instead, // we should check if we are creating a config for apex_test via ApexInfo and amend the values. // This is an exception to support end-to-end test for SdkExtensions, until such support exists. - if android.InList("test_framework-sdkextensions", stems) { + if android.InList("test_framework-sdkextensions", possibleUpdatableModules) { jars = jars.Append("com.android.sdkext", "test_framework-sdkextensions") } return jars diff --git a/java/classpath_fragment.go b/java/classpath_fragment.go index f7a200ad3..12bb71174 100644 --- a/java/classpath_fragment.go +++ b/java/classpath_fragment.go @@ -91,6 +91,29 @@ type classpathJar struct { maxSdkVersion int32 } +// gatherPossibleUpdatableModuleNamesAndStems returns a set of module and stem names from the +// supplied contents that may be in the updatable boot jars. +// +// The module names are included because sometimes the stem is set to just change the name of +// the installed file and it expects the configuration to still use the actual module name. +// +// The stem names are included because sometimes the stem is set to change the effective name of the +// module that is used in the configuration as well,e .g. when a test library is overriding an +// actual boot jar +func gatherPossibleUpdatableModuleNamesAndStems(ctx android.ModuleContext, contents []string, tag blueprint.DependencyTag) []string { + set := map[string]struct{}{} + for _, name := range contents { + dep := ctx.GetDirectDepWithTag(name, tag) + set[name] = struct{}{} + if m, ok := dep.(ModuleWithStem); ok { + set[m.Stem()] = struct{}{} + } else { + ctx.PropertyErrorf("contents", "%v is not a ModuleWithStem", name) + } + } + return android.SortedStringKeys(set) +} + // Converts android.ConfiguredJarList into a list of classpathJars for each given classpathType. func configuredJarListToClasspathJars(ctx android.ModuleContext, configuredJars android.ConfiguredJarList, classpaths ...classpathType) []classpathJar { paths := configuredJars.DevicePaths(ctx.Config(), android.Android) diff --git a/java/systemserver_classpath_fragment.go b/java/systemserver_classpath_fragment.go index ffcd07917..067c86aeb 100644 --- a/java/systemserver_classpath_fragment.go +++ b/java/systemserver_classpath_fragment.go @@ -106,21 +106,12 @@ func (s *SystemServerClasspathModule) GenerateAndroidBuildActions(ctx android.Mo func (s *SystemServerClasspathModule) configuredJars(ctx android.ModuleContext) android.ConfiguredJarList { global := dexpreopt.GetGlobalConfig(ctx) - // Convert content names to their appropriate stems, in case a test library is overriding an actual boot jar - var stems []string - for _, name := range s.properties.Contents { - dep := ctx.GetDirectDepWithTag(name, systemServerClasspathFragmentContentDepTag) - if m, ok := dep.(ModuleWithStem); ok { - stems = append(stems, m.Stem()) - } else { - ctx.PropertyErrorf("contents", "%v is not a ModuleWithStem", name) - } - } + possibleUpdatableModules := gatherPossibleUpdatableModuleNamesAndStems(ctx, s.properties.Contents, systemServerClasspathFragmentContentDepTag) // Only create configs for updatable boot jars. Non-updatable system server jars must be part of the // platform_systemserverclasspath's classpath proto config to guarantee that they come before any // updatable jars at runtime. - return global.UpdatableSystemServerJars.Filter(stems) + return global.UpdatableSystemServerJars.Filter(possibleUpdatableModules) } type systemServerClasspathFragmentContentDependencyTag struct {