Loading filesystem/filesystem.go +19 −2 Original line number Original line Diff line number Diff line Loading @@ -43,8 +43,14 @@ type filesystem struct { // Function that builds extra files under the root directory and returns the files // Function that builds extra files under the root directory and returns the files buildExtraFiles func(ctx android.ModuleContext, root android.OutputPath) android.OutputPaths 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 output android.OutputPath installDir android.InstallPath installDir android.InstallPath // For testing. Keeps the result of CopyDepsToZip() entries []string } } type symlinkDefinition struct { type symlinkDefinition struct { Loading Loading @@ -226,7 +232,7 @@ func (f *filesystem) buildRootZip(ctx android.ModuleContext) android.OutputPath func (f *filesystem) buildImageUsingBuildImage(ctx android.ModuleContext) android.OutputPath { func (f *filesystem) buildImageUsingBuildImage(ctx android.ModuleContext) android.OutputPath { depsZipFile := android.PathForModuleOut(ctx, "deps.zip").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) builder := android.NewRuleBuilder(pctx, ctx) depsBase := proptools.StringDefault(f.properties.Base_dir, ".") depsBase := proptools.StringDefault(f.properties.Base_dir, ".") Loading Loading @@ -345,7 +351,7 @@ func (f *filesystem) buildCpioImage(ctx android.ModuleContext, compressed bool) } } depsZipFile := android.PathForModuleOut(ctx, "deps.zip").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) builder := android.NewRuleBuilder(pctx, ctx) depsBase := proptools.StringDefault(f.properties.Base_dir, ".") depsBase := proptools.StringDefault(f.properties.Base_dir, ".") Loading Loading @@ -434,3 +440,14 @@ func (f *filesystem) SignedOutputPath() android.Path { } } return nil 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 } filesystem/filesystem_test.go +53 −2 Original line number Original line Diff line number Diff line Loading @@ -74,3 +74,54 @@ func TestFileSystemFillsLinkerConfigWithStubLibs(t *testing.T) { android.AssertStringDoesNotContain(t, "linker.config.pb should not have libbar", android.AssertStringDoesNotContain(t, "linker.config.pb should not have libbar", output.RuleParams.Command, "libbar.so") 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) } filesystem/system_image.go +13 −1 Original line number Original line Diff line number Diff line Loading @@ -37,6 +37,7 @@ func systemImageFactory() android.Module { module := &systemImage{} module := &systemImage{} module.AddProperties(&module.properties) module.AddProperties(&module.properties) module.filesystem.buildExtraFiles = module.buildExtraFiles module.filesystem.buildExtraFiles = module.buildExtraFiles module.filesystem.filterPackagingSpecs = module.filterPackagingSpecs initFilesystemModule(&module.filesystem) initFilesystemModule(&module.filesystem) return module return module } } Loading @@ -53,7 +54,7 @@ func (s *systemImage) buildLinkerConfigFile(ctx android.ModuleContext, root andr // we need "Module"s for packaging items // we need "Module"s for packaging items var otherModules []android.Module var otherModules []android.Module deps := s.GatherPackagingSpecs(ctx) deps := s.gatherFilteredPackagingSpecs(ctx) ctx.WalkDeps(func(child, parent android.Module) bool { ctx.WalkDeps(func(child, parent android.Module) bool { for _, ps := range child.PackagingSpecs() { for _, ps := range child.PackagingSpecs() { if _, ok := deps[ps.RelPathInPackage()]; ok { if _, ok := deps[ps.RelPathInPackage()]; ok { Loading @@ -68,3 +69,14 @@ func (s *systemImage) buildLinkerConfigFile(ctx android.ModuleContext, root andr builder.Build("conv_linker_config", "Generate linker config protobuf "+output.String()) builder.Build("conv_linker_config", "Generate linker config protobuf "+output.String()) return output 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) } } } Loading
filesystem/filesystem.go +19 −2 Original line number Original line Diff line number Diff line Loading @@ -43,8 +43,14 @@ type filesystem struct { // Function that builds extra files under the root directory and returns the files // Function that builds extra files under the root directory and returns the files buildExtraFiles func(ctx android.ModuleContext, root android.OutputPath) android.OutputPaths 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 output android.OutputPath installDir android.InstallPath installDir android.InstallPath // For testing. Keeps the result of CopyDepsToZip() entries []string } } type symlinkDefinition struct { type symlinkDefinition struct { Loading Loading @@ -226,7 +232,7 @@ func (f *filesystem) buildRootZip(ctx android.ModuleContext) android.OutputPath func (f *filesystem) buildImageUsingBuildImage(ctx android.ModuleContext) android.OutputPath { func (f *filesystem) buildImageUsingBuildImage(ctx android.ModuleContext) android.OutputPath { depsZipFile := android.PathForModuleOut(ctx, "deps.zip").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) builder := android.NewRuleBuilder(pctx, ctx) depsBase := proptools.StringDefault(f.properties.Base_dir, ".") depsBase := proptools.StringDefault(f.properties.Base_dir, ".") Loading Loading @@ -345,7 +351,7 @@ func (f *filesystem) buildCpioImage(ctx android.ModuleContext, compressed bool) } } depsZipFile := android.PathForModuleOut(ctx, "deps.zip").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) builder := android.NewRuleBuilder(pctx, ctx) depsBase := proptools.StringDefault(f.properties.Base_dir, ".") depsBase := proptools.StringDefault(f.properties.Base_dir, ".") Loading Loading @@ -434,3 +440,14 @@ func (f *filesystem) SignedOutputPath() android.Path { } } return nil 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 }
filesystem/filesystem_test.go +53 −2 Original line number Original line Diff line number Diff line Loading @@ -74,3 +74,54 @@ func TestFileSystemFillsLinkerConfigWithStubLibs(t *testing.T) { android.AssertStringDoesNotContain(t, "linker.config.pb should not have libbar", android.AssertStringDoesNotContain(t, "linker.config.pb should not have libbar", output.RuleParams.Command, "libbar.so") 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) }
filesystem/system_image.go +13 −1 Original line number Original line Diff line number Diff line Loading @@ -37,6 +37,7 @@ func systemImageFactory() android.Module { module := &systemImage{} module := &systemImage{} module.AddProperties(&module.properties) module.AddProperties(&module.properties) module.filesystem.buildExtraFiles = module.buildExtraFiles module.filesystem.buildExtraFiles = module.buildExtraFiles module.filesystem.filterPackagingSpecs = module.filterPackagingSpecs initFilesystemModule(&module.filesystem) initFilesystemModule(&module.filesystem) return module return module } } Loading @@ -53,7 +54,7 @@ func (s *systemImage) buildLinkerConfigFile(ctx android.ModuleContext, root andr // we need "Module"s for packaging items // we need "Module"s for packaging items var otherModules []android.Module var otherModules []android.Module deps := s.GatherPackagingSpecs(ctx) deps := s.gatherFilteredPackagingSpecs(ctx) ctx.WalkDeps(func(child, parent android.Module) bool { ctx.WalkDeps(func(child, parent android.Module) bool { for _, ps := range child.PackagingSpecs() { for _, ps := range child.PackagingSpecs() { if _, ok := deps[ps.RelPathInPackage()]; ok { if _, ok := deps[ps.RelPathInPackage()]; ok { Loading @@ -68,3 +69,14 @@ func (s *systemImage) buildLinkerConfigFile(ctx android.ModuleContext, root andr builder.Build("conv_linker_config", "Generate linker config protobuf "+output.String()) builder.Build("conv_linker_config", "Generate linker config protobuf "+output.String()) return output 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) } } }