From 54bf875c9725719cc92d2b83aafe3b31a5ae47d7 Mon Sep 17 00:00:00 2001 From: Jeongik Cha Date: Thu, 8 Feb 2024 10:44:37 +0900 Subject: [PATCH] Add GatherPackagingSpecsWithFilter android_system_image used GatherPackagingSpecs and then filter only system modules. But some modules were omitted in this logic because there are modules which has the same relative path, so the later one is ignored even though its partition info is what we're looking for. So add filter logic in GatherPackagingSpecs to avoid this problem Bug: 323793487 Test: build android_system_image, and then check if it contains every module we want Change-Id: Iec8ae920736d3d1920eecad71ba0f8f2fe848e6c --- android/packaging.go | 14 ++++++++++++-- filesystem/filesystem.go | 9 +++------ filesystem/system_image.go | 10 +++------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/android/packaging.go b/android/packaging.go index 8873540c5..a8fb28d30 100644 --- a/android/packaging.go +++ b/android/packaging.go @@ -85,6 +85,7 @@ type PackageModule interface { // GatherPackagingSpecs gathers PackagingSpecs of transitive dependencies. GatherPackagingSpecs(ctx ModuleContext) map[string]PackagingSpec + GatherPackagingSpecsWithFilter(ctx ModuleContext, filter func(PackagingSpec) bool) map[string]PackagingSpec // CopyDepsToZip zips the built artifacts of the dependencies into the given zip file and // returns zip entries in it. This is expected to be called in GenerateAndroidBuildActions, @@ -221,14 +222,18 @@ func (p *PackagingBase) AddDeps(ctx BottomUpMutatorContext, depTag blueprint.Dep } } -// See PackageModule.GatherPackagingSpecs -func (p *PackagingBase) GatherPackagingSpecs(ctx ModuleContext) map[string]PackagingSpec { +func (p *PackagingBase) GatherPackagingSpecsWithFilter(ctx ModuleContext, filter func(PackagingSpec) bool) map[string]PackagingSpec { m := make(map[string]PackagingSpec) ctx.VisitDirectDeps(func(child Module) { if pi, ok := ctx.OtherModuleDependencyTag(child).(PackagingItem); !ok || !pi.IsPackagingItem() { return } for _, ps := range child.TransitivePackagingSpecs() { + if filter != nil { + if !filter(ps) { + continue + } + } if _, ok := m[ps.relPathInPackage]; !ok { m[ps.relPathInPackage] = ps } @@ -237,6 +242,11 @@ func (p *PackagingBase) GatherPackagingSpecs(ctx ModuleContext) map[string]Packa return m } +// See PackageModule.GatherPackagingSpecs +func (p *PackagingBase) GatherPackagingSpecs(ctx ModuleContext) map[string]PackagingSpec { + return p.GatherPackagingSpecsWithFilter(ctx, nil) +} + // CopySpecsToDir is a helper that will add commands to the rule builder to copy the PackagingSpec // entries into the specified directory. func (p *PackagingBase) CopySpecsToDir(ctx ModuleContext, builder *RuleBuilder, specs map[string]PackagingSpec, dir WritablePath) (entries []string) { diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go index 2f6476c82..6612a6f09 100644 --- a/filesystem/filesystem.go +++ b/filesystem/filesystem.go @@ -50,8 +50,8 @@ type filesystem struct { // Function that builds extra files under the root directory and returns the files buildExtraFiles func(ctx android.ModuleContext, root android.OutputPath) android.OutputPaths - // Function that filters PackagingSpecs returned by PackagingBase.GatherPackagingSpecs() - filterPackagingSpecs func(specs map[string]android.PackagingSpec) + // Function that filters PackagingSpec in PackagingBase.GatherPackagingSpecs() + filterPackagingSpec func(spec android.PackagingSpec) bool output android.OutputPath installDir android.InstallPath @@ -493,10 +493,7 @@ func (f *filesystem) SignedOutputPath() android.Path { // Note that "apex" module installs its contents to "apex"(fake partition) as well // for symbol lookup by imitating "activated" paths. func (f *filesystem) gatherFilteredPackagingSpecs(ctx android.ModuleContext) map[string]android.PackagingSpec { - specs := f.PackagingBase.GatherPackagingSpecs(ctx) - if f.filterPackagingSpecs != nil { - f.filterPackagingSpecs(specs) - } + specs := f.PackagingBase.GatherPackagingSpecsWithFilter(ctx, f.filterPackagingSpec) return specs } diff --git a/filesystem/system_image.go b/filesystem/system_image.go index 75abf702e..34f4ffb6d 100644 --- a/filesystem/system_image.go +++ b/filesystem/system_image.go @@ -37,7 +37,7 @@ func systemImageFactory() android.Module { module := &systemImage{} module.AddProperties(&module.properties) module.filesystem.buildExtraFiles = module.buildExtraFiles - module.filesystem.filterPackagingSpecs = module.filterPackagingSpecs + module.filesystem.filterPackagingSpec = module.filterPackagingSpec initFilesystemModule(&module.filesystem) return module } @@ -73,10 +73,6 @@ func (s *systemImage) buildLinkerConfigFile(ctx android.ModuleContext, root andr // Filter the result of GatherPackagingSpecs to discard items targeting outside "system" partition. // Note that "apex" module installs its contents to "apex"(fake partition) as well // for symbol lookup by imitating "activated" paths. -func (s *systemImage) filterPackagingSpecs(specs map[string]android.PackagingSpec) { - for k, ps := range specs { - if ps.Partition() != "system" { - delete(specs, k) - } - } +func (s *systemImage) filterPackagingSpec(ps android.PackagingSpec) bool { + return ps.Partition() == "system" }