diff options
author | 2024-11-05 17:21:37 +0900 | |
---|---|---|
committer | 2024-11-12 17:02:10 +0900 | |
commit | 3c0a042d2056f35ffa7859c72d0aea1c9592e449 (patch) | |
tree | 4023a5bfa28def3935fbfa60a9d8c61113eed934 | |
parent | 25777477593f60273be433e44ee9e49897bdab23 (diff) |
Add GSI support for android_system_image
GSI's system.img includes system_ext and product artifacts. This patches
android_system_image module so it can include such artifacts when
building GSI.
Bug: 370351758
Test: m android_gsi
Change-Id: Id29678b1101e787e88dbedae38cdbf6d82d1cb95
-rw-r--r-- | Android.bp | 5 | ||||
-rw-r--r-- | android/packaging.go | 17 | ||||
-rw-r--r-- | compliance/Android.bp | 1 | ||||
-rw-r--r-- | filesystem/filesystem.go | 18 | ||||
-rw-r--r-- | filesystem/system_image.go | 14 |
5 files changed, 43 insertions, 12 deletions
diff --git a/Android.bp b/Android.bp index 42b7d83f7..976362278 100644 --- a/Android.bp +++ b/Android.bp @@ -175,6 +175,7 @@ build_prop { // Currently, only microdroid, Ravenwood, and cf system image can refer to system-build.prop visibility: [ "//build/make/target/product/generic", + "//build/make/target/product/gsi", "//packages/modules/Virtualization/build/microdroid", "//frameworks/base/ravenwood", ], @@ -186,7 +187,7 @@ build_prop { system_ext_specific: true, product_config: ":product_config", relative_install_path: "etc", // system_ext/etc/build.prop - visibility: ["//visibility:private"], + visibility: ["//build/make/target/product/gsi"], } build_prop { @@ -195,7 +196,7 @@ build_prop { product_specific: true, product_config: ":product_config", relative_install_path: "etc", // product/etc/build.prop - visibility: ["//visibility:private"], + visibility: ["//build/make/target/product/gsi"], } build_prop { diff --git a/android/packaging.go b/android/packaging.go index 98c85fa0c..635922cfa 100644 --- a/android/packaging.go +++ b/android/packaging.go @@ -165,6 +165,10 @@ func (p *PackagingSpec) Partition() string { return p.partition } +func (p *PackagingSpec) SetPartition(partition string) { + p.partition = partition +} + func (p *PackagingSpec) SkipInstall() bool { return p.skipInstall } @@ -186,6 +190,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 + GatherPackagingSpecsWithFilterAndModifier(ctx ModuleContext, filter func(PackagingSpec) bool, modifier func(*PackagingSpec)) 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, @@ -444,7 +449,8 @@ func (p *PackagingBase) AddDeps(ctx BottomUpMutatorContext, depTag blueprint.Dep } } -func (p *PackagingBase) GatherPackagingSpecsWithFilter(ctx ModuleContext, filter func(PackagingSpec) bool) map[string]PackagingSpec { +// See PackageModule.GatherPackagingSpecs +func (p *PackagingBase) GatherPackagingSpecsWithFilterAndModifier(ctx ModuleContext, filter func(PackagingSpec) bool, modifier func(*PackagingSpec)) map[string]PackagingSpec { // packaging specs gathered from the dep that are not high priorities. var regularPriorities []PackagingSpec @@ -491,6 +497,10 @@ func (p *PackagingBase) GatherPackagingSpecsWithFilter(ctx ModuleContext, filter } } + if modifier != nil { + modifier(&ps) + } + if _, ok := depTag.(highPriorityDepTag); ok { highPriorities = append(highPriorities, ps) } else { @@ -552,6 +562,11 @@ func (p *PackagingBase) GatherPackagingSpecsWithFilter(ctx ModuleContext, filter } // See PackageModule.GatherPackagingSpecs +func (p *PackagingBase) GatherPackagingSpecsWithFilter(ctx ModuleContext, filter func(PackagingSpec) bool) map[string]PackagingSpec { + return p.GatherPackagingSpecsWithFilterAndModifier(ctx, filter, nil) +} + +// See PackageModule.GatherPackagingSpecs func (p *PackagingBase) GatherPackagingSpecs(ctx ModuleContext) map[string]PackagingSpec { return p.GatherPackagingSpecsWithFilter(ctx, nil) } diff --git a/compliance/Android.bp b/compliance/Android.bp index 72c2f27c1..6662970d8 100644 --- a/compliance/Android.bp +++ b/compliance/Android.bp @@ -35,5 +35,6 @@ notice_xml { partition_name: "system", visibility: [ "//build/make/target/product/generic", + "//build/make/target/product/gsi", ], } diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go index 78e24e296..29e5ec378 100644 --- a/filesystem/filesystem.go +++ b/filesystem/filesystem.go @@ -67,6 +67,10 @@ type filesystemBuilder interface { BuildLinkerConfigFile(ctx android.ModuleContext, builder *android.RuleBuilder, rebasedDir android.OutputPath) // Function that filters PackagingSpec in PackagingBase.GatherPackagingSpecs() FilterPackagingSpec(spec android.PackagingSpec) bool + // Function that modifies PackagingSpec in PackagingBase.GatherPackagingSpecs() to customize. + // For example, GSI system.img contains system_ext and product artifacts and their + // relPathInPackage need to be rebased to system/system_ext and system/system_product. + ModifyPackagingSpec(spec *android.PackagingSpec) } var _ filesystemBuilder = (*filesystem)(nil) @@ -302,6 +306,10 @@ func (f *filesystem) FilterPackagingSpec(ps android.PackagingSpec) bool { return true } +func (f *filesystem) ModifyPackagingSpec(ps *android.PackagingSpec) { + // do nothing by default +} + var pctx = android.NewPackageContext("android/soong/filesystem") func (f *filesystem) GenerateAndroidBuildActions(ctx android.ModuleContext) { @@ -792,7 +800,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.GatherPackagingSpecsWithFilter(ctx, f.filesystemBuilder.FilterPackagingSpec) + specs := f.PackagingBase.GatherPackagingSpecsWithFilterAndModifier(ctx, f.filesystemBuilder.FilterPackagingSpec, f.filesystemBuilder.ModifyPackagingSpec) return specs } @@ -818,13 +826,7 @@ type filesystemDefaults struct { android.ModuleBase android.DefaultsModuleBase - properties filesystemDefaultsProperties -} - -type filesystemDefaultsProperties struct { - // Identifies which partition this is for //visibility:any_system_image (and others) visibility - // checks, and will be used in the future for API surface checks. - Partition_type *string + properties FilesystemProperties } // android_filesystem_defaults is a default module for android_filesystem and android_system_image diff --git a/filesystem/system_image.go b/filesystem/system_image.go index 672458c53..4d176ae45 100644 --- a/filesystem/system_image.go +++ b/filesystem/system_image.go @@ -18,6 +18,9 @@ import ( "android/soong/android" "android/soong/linkerconfig" + "path/filepath" + "strings" + "github.com/google/blueprint/proptools" ) @@ -58,5 +61,14 @@ func (s *systemImage) BuildLinkerConfigFile(ctx android.ModuleContext, builder * // for symbol lookup by imitating "activated" paths. func (s *systemImage) FilterPackagingSpec(ps android.PackagingSpec) bool { return !ps.SkipInstall() && - (ps.Partition() == "system" || ps.Partition() == "root") + (ps.Partition() == "system" || ps.Partition() == "root" || + strings.HasPrefix(ps.Partition(), "system/")) +} + +func (s *systemImage) ModifyPackagingSpec(ps *android.PackagingSpec) { + if strings.HasPrefix(ps.Partition(), "system/") { + subPartition := strings.TrimPrefix(ps.Partition(), "system/") + ps.SetPartition("system") + ps.SetRelPathInPackage(filepath.Join(subPartition, ps.RelPathInPackage())) + } } |