Merge "android_system_image only packages "system" items"

This commit is contained in:
Treehugger Robot 2022-03-30 02:58:58 +00:00 committed by Gerrit Code Review
commit 0cfe1f43f7
3 changed files with 85 additions and 5 deletions

View file

@ -43,8 +43,14 @@ 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)
output android.OutputPath
installDir android.InstallPath
// For testing. Keeps the result of CopyDepsToZip()
entries []string
}
type symlinkDefinition struct {
@ -226,7 +232,7 @@ func (f *filesystem) buildRootZip(ctx android.ModuleContext) android.OutputPath
func (f *filesystem) buildImageUsingBuildImage(ctx android.ModuleContext) android.OutputPath {
depsZipFile := android.PathForModuleOut(ctx, "deps.zip").OutputPath
f.CopyDepsToZip(ctx, f.GatherPackagingSpecs(ctx), depsZipFile)
f.entries = f.CopyDepsToZip(ctx, f.gatherFilteredPackagingSpecs(ctx), depsZipFile)
builder := android.NewRuleBuilder(pctx, ctx)
depsBase := proptools.StringDefault(f.properties.Base_dir, ".")
@ -345,7 +351,7 @@ func (f *filesystem) buildCpioImage(ctx android.ModuleContext, compressed bool)
}
depsZipFile := android.PathForModuleOut(ctx, "deps.zip").OutputPath
f.CopyDepsToZip(ctx, f.GatherPackagingSpecs(ctx), depsZipFile)
f.entries = f.CopyDepsToZip(ctx, f.gatherFilteredPackagingSpecs(ctx), depsZipFile)
builder := android.NewRuleBuilder(pctx, ctx)
depsBase := proptools.StringDefault(f.properties.Base_dir, ".")
@ -434,3 +440,14 @@ func (f *filesystem) SignedOutputPath() android.Path {
}
return nil
}
// 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 (f *filesystem) gatherFilteredPackagingSpecs(ctx android.ModuleContext) map[string]android.PackagingSpec {
specs := f.PackagingBase.GatherPackagingSpecs(ctx)
if f.filterPackagingSpecs != nil {
f.filterPackagingSpecs(specs)
}
return specs
}

View file

@ -74,3 +74,54 @@ func TestFileSystemFillsLinkerConfigWithStubLibs(t *testing.T) {
android.AssertStringDoesNotContain(t, "linker.config.pb should not have libbar",
output.RuleParams.Command, "libbar.so")
}
func registerComponent(ctx android.RegistrationContext) {
ctx.RegisterModuleType("component", componentFactory)
}
func componentFactory() android.Module {
m := &component{}
m.AddProperties(&m.properties)
android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon)
return m
}
type component struct {
android.ModuleBase
properties struct {
Install_copy_in_data []string
}
}
func (c *component) GenerateAndroidBuildActions(ctx android.ModuleContext) {
output := android.PathForModuleOut(ctx, c.Name())
dir := android.PathForModuleInstall(ctx, "components")
ctx.InstallFile(dir, c.Name(), output)
dataDir := android.PathForModuleInPartitionInstall(ctx, "data", "components")
for _, d := range c.properties.Install_copy_in_data {
ctx.InstallFile(dataDir, d, output)
}
}
func TestFileSystemGathersItemsOnlyInSystemPartition(t *testing.T) {
f := android.GroupFixturePreparers(fixture, android.FixtureRegisterWithContext(registerComponent))
result := f.RunTestWithBp(t, `
android_system_image {
name: "myfilesystem",
multilib: {
common: {
deps: ["foo"],
},
},
linker_config_src: "linker.config.json",
}
component {
name: "foo",
install_copy_in_data: ["bar"],
}
`)
module := result.ModuleForTests("myfilesystem", "android_common").Module().(*systemImage)
android.AssertDeepEquals(t, "entries should have foo only", []string{"components/foo"}, module.entries)
}

View file

@ -37,6 +37,7 @@ func systemImageFactory() android.Module {
module := &systemImage{}
module.AddProperties(&module.properties)
module.filesystem.buildExtraFiles = module.buildExtraFiles
module.filesystem.filterPackagingSpecs = module.filterPackagingSpecs
initFilesystemModule(&module.filesystem)
return module
}
@ -53,7 +54,7 @@ func (s *systemImage) buildLinkerConfigFile(ctx android.ModuleContext, root andr
// we need "Module"s for packaging items
var otherModules []android.Module
deps := s.GatherPackagingSpecs(ctx)
deps := s.gatherFilteredPackagingSpecs(ctx)
ctx.WalkDeps(func(child, parent android.Module) bool {
for _, ps := range child.PackagingSpecs() {
if _, ok := deps[ps.RelPathInPackage()]; ok {
@ -68,3 +69,14 @@ func (s *systemImage) buildLinkerConfigFile(ctx android.ModuleContext, root andr
builder.Build("conv_linker_config", "Generate linker config protobuf "+output.String())
return output
}
// 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)
}
}
}