diff options
-rw-r--r-- | android/variable.go | 17 | ||||
-rw-r--r-- | filesystem/Android.bp | 1 | ||||
-rw-r--r-- | filesystem/filesystem.go | 19 | ||||
-rw-r--r-- | filesystem/filesystem_test.go | 2 | ||||
-rw-r--r-- | filesystem/super_image.go | 236 | ||||
-rw-r--r-- | fsgen/Android.bp | 1 | ||||
-rw-r--r-- | fsgen/filesystem_creator.go | 55 | ||||
-rw-r--r-- | fsgen/super_img.go | 91 | ||||
-rw-r--r-- | java/aar.go | 12 |
9 files changed, 409 insertions, 25 deletions
diff --git a/android/variable.go b/android/variable.go index baa26460f..19f63e33f 100644 --- a/android/variable.go +++ b/android/variable.go @@ -581,6 +581,11 @@ type PartitionQualifiedVariablesType struct { BoardAvbRollbackIndexLocation string `json:",omitempty"` } +type BoardSuperPartitionGroupProps struct { + GroupSize string `json:",omitempty"` + PartitionList []string `json:",omitempty"` +} + type ChainedAvbPartitionProps struct { Partitions []string `json:",omitempty"` Key string `json:",omitempty"` @@ -634,6 +639,18 @@ type PartitionVariables struct { InternalBootconfig []string `json:",omitempty"` InternalBootconfigFile string `json:",omitempty"` + // Super image stuff + ProductUseDynamicPartitions bool `json:",omitempty"` + ProductRetrofitDynamicPartitions bool `json:",omitempty"` + ProductBuildSuperPartition bool `json:",omitempty"` + BoardSuperPartitionSize string `json:",omitempty"` + BoardSuperPartitionMetadataDevice string `json:",omitempty"` + BoardSuperPartitionBlockDevices []string `json:",omitempty"` + BoardSuperPartitionGroups map[string]BoardSuperPartitionGroupProps `json:",omitempty"` + ProductVirtualAbOta bool `json:",omitempty"` + ProductVirtualAbOtaRetrofit bool `json:",omitempty"` + AbOtaUpdater bool `json:",omitempty"` + // Avb (android verified boot) stuff BoardAvbEnable bool `json:",omitempty"` BoardAvbAlgorithm string `json:",omitempty"` diff --git a/filesystem/Android.bp b/filesystem/Android.bp index bbb3ea7d8..127faa75f 100644 --- a/filesystem/Android.bp +++ b/filesystem/Android.bp @@ -25,6 +25,7 @@ bootstrap_go_package { "fsverity_metadata.go", "logical_partition.go", "raw_binary.go", + "super_image.go", "system_image.go", "vbmeta.go", "testing.go", diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go index b6b4cb78a..b9cb0769a 100644 --- a/filesystem/filesystem.go +++ b/filesystem/filesystem.go @@ -130,9 +130,13 @@ type FilesystemProperties struct { // checks, and will be used in the future for API surface checks. Partition_type *string - // file_contexts file to make image. Currently, only ext4 is supported. + // file_contexts file to make image. Currently, only ext4 is supported. These file contexts + // will be compiled with sefcontext_compile File_contexts *string `android:"path"` + // The selinux file contexts, after having already run them through sefcontext_compile + Precompiled_file_contexts *string `android:"path"` + // Base directory relative to root, to which deps are installed, e.g. "system". Default is "." // (root). Base_dir *string @@ -453,7 +457,7 @@ func (f *filesystem) validateVintfFragments(ctx android.ModuleContext) { } func (f *filesystem) appendToEntry(ctx android.ModuleContext, installedFile android.Path) { - partitionBaseDir := android.PathForModuleOut(ctx, "root", f.partitionName()).String() + "/" + partitionBaseDir := android.PathForModuleOut(ctx, "root", proptools.String(f.properties.Base_dir)).String() + "/" relPath, inTargetPartition := strings.CutPrefix(installedFile.String(), partitionBaseDir) if inTargetPartition { @@ -679,8 +683,15 @@ func (f *filesystem) buildPropFile(ctx android.ModuleContext) (android.Path, and addStr("avb_salt", f.salt()) } - if proptools.String(f.properties.File_contexts) != "" { + if f.properties.File_contexts != nil && f.properties.Precompiled_file_contexts != nil { + ctx.ModuleErrorf("file_contexts and precompiled_file_contexts cannot both be set") + } else if f.properties.File_contexts != nil { addPath("selinux_fc", f.buildFileContexts(ctx)) + } else if f.properties.Precompiled_file_contexts != nil { + src := android.PathForModuleSrc(ctx, *f.properties.Precompiled_file_contexts) + if src != nil { + addPath("selinux_fc", src) + } } if timestamp := proptools.String(f.properties.Fake_timestamp); timestamp != "" { addStr("timestamp", timestamp) @@ -1012,7 +1023,7 @@ func (f *filesystem) getLibsForLinkerConfig(ctx android.ModuleContext) ([]androi ctx.WalkDeps(func(child, parent android.Module) bool { for _, ps := range android.OtherModuleProviderOrDefault( ctx, child, android.InstallFilesProvider).PackagingSpecs { - if _, ok := deps[ps.RelPathInPackage()]; ok { + if _, ok := deps[ps.RelPathInPackage()]; ok && ps.Partition() == f.PartitionType() { modulesInPackageByModule[child] = true modulesInPackageByName[child.Name()] = true return true diff --git a/filesystem/filesystem_test.go b/filesystem/filesystem_test.go index 86496eb6e..0ed3870a6 100644 --- a/filesystem/filesystem_test.go +++ b/filesystem/filesystem_test.go @@ -244,7 +244,7 @@ func TestFileSystemGathersItemsOnlyInSystemPartition(t *testing.T) { `) module := result.ModuleForTests("myfilesystem", "android_common").Module().(*systemImage) - android.AssertDeepEquals(t, "entries should have foo only", []string{"components/foo"}, module.entries) + android.AssertDeepEquals(t, "entries should have foo and not bar", []string{"components/foo", "etc/linker.config.pb"}, module.entries) } func TestAvbGenVbmetaImage(t *testing.T) { diff --git a/filesystem/super_image.go b/filesystem/super_image.go new file mode 100644 index 000000000..0f8f614b4 --- /dev/null +++ b/filesystem/super_image.go @@ -0,0 +1,236 @@ +// Copyright (C) 2024 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package filesystem + +import ( + "fmt" + "path/filepath" + "strconv" + "strings" + + "android/soong/android" + "github.com/google/blueprint" + "github.com/google/blueprint/proptools" +) + +func init() { + android.RegisterModuleType("super_image", SuperImageFactory) +} + +type superImage struct { + android.ModuleBase + + properties SuperImageProperties + partitionProps SuperImagePartitionNameProperties + + installDir android.InstallPath +} + +type SuperImageProperties struct { + // the size of the super partition + Size *int64 + // the block device where metadata for dynamic partitions is stored + Metadata_device *string + // the super partition block device list + Block_devices []string + // whether A/B updater is used + Ab_update *bool + // whether dynamic partitions is enabled on devices that were launched without this support + Retrofit *bool + // whether virtual A/B seamless update is enabled + Virtual_ab *bool + // whether retrofitting virtual A/B seamless update is enabled + Virtual_ab_retrofit *bool + // whether the output is a sparse image + Sparse *bool + // information about how partitions within the super partition are grouped together + Partition_groups []PartitionGroupsInfo + // whether dynamic partitions is used + Use_dynamic_partitions *bool +} + +type PartitionGroupsInfo struct { + Name string + GroupSize string + PartitionList []string +} + +type SuperImagePartitionNameProperties struct { + // Name of the System partition filesystem module + System_partition *string + // Name of the System_ext partition filesystem module + System_ext_partition *string + // Name of the System_dlkm partition filesystem module + System_dlkm_partition *string + // Name of the System_other partition filesystem module + System_other_partition *string + // Name of the Product partition filesystem module + Product_partition *string + // Name of the Vendor partition filesystem module + Vendor_partition *string + // Name of the Vendor_dlkm partition filesystem module + Vendor_dlkm_partition *string + // Name of the Odm partition filesystem module + Odm_partition *string + // Name of the Odm_dlkm partition filesystem module + Odm_dlkm_partition *string +} + +func SuperImageFactory() android.Module { + module := &superImage{} + module.AddProperties(&module.properties, &module.partitionProps) + android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon) + return module +} + +type superImageDepTagType struct { + blueprint.BaseDependencyTag +} + +var superImageDepTag superImageDepTagType + +func (s *superImage) DepsMutator(ctx android.BottomUpMutatorContext) { + addDependencyIfDefined := func(dep *string) { + if dep != nil { + ctx.AddDependency(ctx.Module(), superImageDepTag, proptools.String(dep)) + } + } + + addDependencyIfDefined(s.partitionProps.System_partition) + addDependencyIfDefined(s.partitionProps.System_ext_partition) + addDependencyIfDefined(s.partitionProps.System_dlkm_partition) + addDependencyIfDefined(s.partitionProps.System_other_partition) + addDependencyIfDefined(s.partitionProps.Product_partition) + addDependencyIfDefined(s.partitionProps.Vendor_partition) + addDependencyIfDefined(s.partitionProps.Vendor_dlkm_partition) + addDependencyIfDefined(s.partitionProps.Odm_partition) + addDependencyIfDefined(s.partitionProps.Odm_dlkm_partition) +} + +func (s *superImage) GenerateAndroidBuildActions(ctx android.ModuleContext) { + miscInfo, deps := s.buildMiscInfo(ctx) + builder := android.NewRuleBuilder(pctx, ctx) + output := android.PathForModuleOut(ctx, s.installFileName()) + lpMake := ctx.Config().HostToolPath(ctx, "lpmake") + lpMakeDir := filepath.Dir(lpMake.String()) + deps = append(deps, lpMake) + builder.Command().Textf("PATH=%s:\\$PATH", lpMakeDir). + BuiltTool("build_super_image"). + Text("-v"). + Input(miscInfo). + Implicits(deps). + Output(output) + builder.Build("build_super_image", fmt.Sprintf("Creating super image %s", s.BaseModuleName())) + ctx.SetOutputFiles([]android.Path{output}, "") +} + +func (s *superImage) installFileName() string { + return s.BaseModuleName() + ".img" +} + +func (s *superImage) buildMiscInfo(ctx android.ModuleContext) (android.Path, android.Paths) { + var miscInfoString strings.Builder + addStr := func(name string, value string) { + miscInfoString.WriteString(name) + miscInfoString.WriteRune('=') + miscInfoString.WriteString(value) + miscInfoString.WriteRune('\n') + } + + addStr("use_dynamic_partitions", strconv.FormatBool(proptools.Bool(s.properties.Use_dynamic_partitions))) + addStr("dynamic_partition_retrofit", strconv.FormatBool(proptools.Bool(s.properties.Retrofit))) + addStr("lpmake", "lpmake") + addStr("super_metadata_device", proptools.String(s.properties.Metadata_device)) + if len(s.properties.Block_devices) > 0 { + addStr("super_block_devices", strings.Join(s.properties.Block_devices, " ")) + } + addStr("super_super_device_size", strconv.Itoa(proptools.Int(s.properties.Size))) + var groups, partitionList []string + for _, groupInfo := range s.properties.Partition_groups { + groups = append(groups, groupInfo.Name) + partitionList = append(partitionList, groupInfo.PartitionList...) + addStr("super_"+groupInfo.Name+"_group_size", groupInfo.GroupSize) + addStr("super_"+groupInfo.Name+"_partition_list", strings.Join(groupInfo.PartitionList, " ")) + } + addStr("super_partition_groups", strings.Join(groups, " ")) + addStr("dynamic_partition_list", strings.Join(partitionList, " ")) + + addStr("virtual_ab", strconv.FormatBool(proptools.Bool(s.properties.Virtual_ab))) + addStr("virtual_ab_retrofit", strconv.FormatBool(proptools.Bool(s.properties.Virtual_ab_retrofit))) + addStr("ab_update", strconv.FormatBool(proptools.Bool(s.properties.Ab_update))) + addStr("build_non_sparse_super_partition", strconv.FormatBool(!proptools.Bool(s.properties.Sparse))) + + partitionToImagePath := make(map[string]string) + nameToPartition := make(map[string]string) + var systemOtherPartitionNameNeeded string + addEntryToPartitionToName := func(p string, s *string) { + if proptools.String(s) != "" { + nameToPartition[*s] = p + } + } + + // Build partitionToImagePath, because system partition may need system_other + // partition image path + for _, p := range partitionList { + if _, ok := nameToPartition[p]; ok { + continue + } + switch p { + case "system": + addEntryToPartitionToName(p, s.partitionProps.System_partition) + systemOtherPartitionNameNeeded = proptools.String(s.partitionProps.System_other_partition) + case "system_dlkm": + addEntryToPartitionToName(p, s.partitionProps.System_dlkm_partition) + case "system_ext": + addEntryToPartitionToName(p, s.partitionProps.System_ext_partition) + case "product": + addEntryToPartitionToName(p, s.partitionProps.Product_partition) + case "vendor": + addEntryToPartitionToName(p, s.partitionProps.Vendor_partition) + case "vendor_dlkm": + addEntryToPartitionToName(p, s.partitionProps.Vendor_dlkm_partition) + case "odm": + addEntryToPartitionToName(p, s.partitionProps.Odm_partition) + case "odm_dlkm": + addEntryToPartitionToName(p, s.partitionProps.Odm_dlkm_partition) + default: + ctx.ModuleErrorf("current partition %s not a super image supported partition", p) + } + } + + var deps android.Paths + ctx.VisitDirectDeps(func(m android.Module) { + if p, ok := nameToPartition[m.Name()]; ok { + if output, ok := android.OtherModuleProvider(ctx, m, android.OutputFilesProvider); ok { + partitionToImagePath[p] = output.DefaultOutputFiles[0].String() + deps = append(deps, output.DefaultOutputFiles[0]) + } + } else if systemOtherPartitionNameNeeded != "" && m.Name() == systemOtherPartitionNameNeeded { + if output, ok := android.OtherModuleProvider(ctx, m, android.OutputFilesProvider); ok { + partitionToImagePath["system_other"] = output.DefaultOutputFiles[0].String() + // TODO: add system_other to deps after it can be generated + // deps = append(deps, output.DefaultOutputFiles[0]) + } + } + }) + + for _, p := range android.SortedKeys(partitionToImagePath) { + addStr(p+"_image", partitionToImagePath[p]) + } + + miscInfo := android.PathForModuleOut(ctx, "misc_info.txt") + android.WriteFileRule(ctx, miscInfo, miscInfoString.String()) + return miscInfo, deps +} diff --git a/fsgen/Android.bp b/fsgen/Android.bp index e8065f351..365d9540f 100644 --- a/fsgen/Android.bp +++ b/fsgen/Android.bp @@ -17,6 +17,7 @@ bootstrap_go_package { "filesystem_creator.go", "fsgen_mutators.go", "prebuilt_etc_modules_gen.go", + "super_img.go", "util.go", "vbmeta_partitions.go", ], diff --git a/fsgen/filesystem_creator.go b/fsgen/filesystem_creator.go index 6ded3aaa5..137851301 100644 --- a/fsgen/filesystem_creator.go +++ b/fsgen/filesystem_creator.go @@ -52,6 +52,7 @@ type filesystemCreatorProps struct { Boot_image string `blueprint:"mutated" android:"path_device_first"` Vendor_boot_image string `blueprint:"mutated" android:"path_device_first"` Init_boot_image string `blueprint:"mutated" android:"path_device_first"` + Super_image string `blueprint:"mutated" android:"path_device_first"` } type filesystemCreator struct { @@ -158,6 +159,11 @@ func (f *filesystemCreator) createInternalModules(ctx android.LoadHookContext) { f.properties.Vbmeta_partition_names = append(f.properties.Vbmeta_partition_names, x.partitionName) } + if buildingSuperImage(partitionVars) { + createSuperImage(ctx, finalSoongGeneratedPartitions, partitionVars) + f.properties.Super_image = ":" + generatedModuleName(ctx.Config(), "super") + } + ctx.Config().Get(fsGenStateOnceKey).(*FsGenState).soongGeneratedPartitions = finalSoongGeneratedPartitions f.createDeviceModule(ctx, finalSoongGeneratedPartitions, f.properties.Vbmeta_module_names) } @@ -322,7 +328,22 @@ func partitionSpecificFsProps(ctx android.EarlyModuleContext, fsProps *filesyste Target: proptools.StringPtr("/data/cache"), Name: proptools.StringPtr("cache"), }, + // For Treble Generic System Image (GSI), system-as-root GSI needs to work on + // both devices with and without /odm_dlkm partition. Those symlinks are for + // devices without /odm_dlkm partition. For devices with /odm_dlkm + // partition, mount odm_dlkm.img under /odm_dlkm will hide those symlinks. + // Note that /odm_dlkm/lib is omitted because odm DLKMs should be accessed + // via /odm/lib/modules directly. All of this also applies to the vendor_dlkm symlink + filesystem.SymlinkDefinition{ + Target: proptools.StringPtr("/odm/odm_dlkm/etc"), + Name: proptools.StringPtr("odm_dlkm/etc"), + }, + filesystem.SymlinkDefinition{ + Target: proptools.StringPtr("/vendor/vendor_dlkm/etc"), + Name: proptools.StringPtr("vendor_dlkm/etc"), + }, } + fsProps.Base_dir = proptools.StringPtr("system") fsProps.Dirs = proptools.NewSimpleConfigurable([]string{ // From generic_rootdirs in build/make/target/product/generic/Android.bp "acct", @@ -374,11 +395,11 @@ func partitionSpecificFsProps(ctx android.EarlyModuleContext, fsProps *filesyste fsProps.Symlinks = []filesystem.SymlinkDefinition{ filesystem.SymlinkDefinition{ Target: proptools.StringPtr("/odm"), - Name: proptools.StringPtr("vendor/odm"), + Name: proptools.StringPtr("odm"), }, filesystem.SymlinkDefinition{ Target: proptools.StringPtr("/vendor_dlkm/lib/modules"), - Name: proptools.StringPtr("vendor/lib/modules"), + Name: proptools.StringPtr("lib/modules"), }, } fsProps.Android_filesystem_deps.System = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system")) @@ -389,7 +410,7 @@ func partitionSpecificFsProps(ctx android.EarlyModuleContext, fsProps *filesyste fsProps.Symlinks = []filesystem.SymlinkDefinition{ filesystem.SymlinkDefinition{ Target: proptools.StringPtr("/odm_dlkm/lib/modules"), - Name: proptools.StringPtr("odm/lib/modules"), + Name: proptools.StringPtr("lib/modules"), }, } case "userdata": @@ -432,6 +453,7 @@ func partitionSpecificFsProps(ctx android.EarlyModuleContext, fsProps *filesyste Name: proptools.StringPtr("default.prop"), }, } + fsProps.Base_dir = proptools.StringPtr("recovery") } } @@ -771,26 +793,17 @@ func generateFsProps(ctx android.EarlyModuleContext, partitionType string) (*fil fsProps.Partition_name = proptools.StringPtr(partitionType) - if !strings.Contains(partitionType, "ramdisk") { - fsProps.Base_dir = proptools.StringPtr(partitionType) + switch partitionType { + // The partitions that support file_contexts came from here: + // https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/Makefile;l=2270;drc=ad7cfb56010cb22c3aa0e70cf71c804352553526 + case "system", "userdata", "cache", "vendor", "product", "system_ext", "odm", "vendor_dlkm", "odm_dlkm", "system_dlkm", "oem": + fsProps.Precompiled_file_contexts = proptools.StringPtr(":file_contexts_bin_gen") } fsProps.Is_auto_generated = proptools.BoolPtr(true) partitionSpecificFsProps(ctx, fsProps, partitionVars, partitionType) - // system_image properties that are not set: - // - filesystemProperties.Avb_hash_algorithm - // - filesystemProperties.File_contexts - // - filesystemProperties.Dirs - // - filesystemProperties.Symlinks - // - filesystemProperties.Fake_timestamp - // - filesystemProperties.Uuid - // - filesystemProperties.Mount_point - // - filesystemProperties.Include_make_built_files - // - filesystemProperties.Build_logtags - // - systemImageProperties.Linker_config_src - return fsProps, true } @@ -998,6 +1011,14 @@ func (f *filesystemCreator) GenerateAndroidBuildActions(ctx android.ModuleContex diffTestFiles = append(diffTestFiles, diffTestFile) ctx.Phony("soong_generated_init_boot_filesystem_test", diffTestFile) } + if f.properties.Super_image != "" { + diffTestFile := android.PathForModuleOut(ctx, "super_diff_test.txt") + soongSuperImg := android.PathForModuleSrc(ctx, f.properties.Super_image) + makeSuperImage := android.PathForArbitraryOutput(ctx, fmt.Sprintf("target/product/%s/super.img", ctx.Config().DeviceName())) + createDiffTest(ctx, diffTestFile, soongSuperImg, makeSuperImage) + diffTestFiles = append(diffTestFiles, diffTestFile) + ctx.Phony("soong_generated_super_filesystem_test", diffTestFile) + } ctx.Phony("soong_generated_filesystem_tests", diffTestFiles...) } diff --git a/fsgen/super_img.go b/fsgen/super_img.go new file mode 100644 index 000000000..8ee3bf2ee --- /dev/null +++ b/fsgen/super_img.go @@ -0,0 +1,91 @@ +// Copyright (C) 2024 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fsgen + +import ( + "strconv" + + "android/soong/android" + "android/soong/filesystem" + "github.com/google/blueprint/proptools" +) + +func buildingSuperImage(partitionVars android.PartitionVariables) bool { + return partitionVars.ProductBuildSuperPartition +} + +func createSuperImage(ctx android.LoadHookContext, partitions []string, partitionVars android.PartitionVariables) { + baseProps := &struct { + Name *string + }{ + Name: proptools.StringPtr(generatedModuleName(ctx.Config(), "super")), + } + + superImageProps := &filesystem.SuperImageProperties{ + Metadata_device: proptools.StringPtr(partitionVars.BoardSuperPartitionMetadataDevice), + Block_devices: partitionVars.BoardSuperPartitionBlockDevices, + Ab_update: proptools.BoolPtr(partitionVars.AbOtaUpdater), + Retrofit: proptools.BoolPtr(partitionVars.ProductRetrofitDynamicPartitions), + Virtual_ab: proptools.BoolPtr(partitionVars.ProductVirtualAbOta), + Virtual_ab_retrofit: proptools.BoolPtr(partitionVars.ProductVirtualAbOtaRetrofit), + Use_dynamic_partitions: proptools.BoolPtr(partitionVars.ProductUseDynamicPartitions), + } + size, _ := strconv.ParseInt(partitionVars.BoardSuperPartitionSize, 10, 64) + superImageProps.Size = proptools.Int64Ptr(size) + sparse := !partitionVars.TargetUserimagesSparseExtDisabled && !partitionVars.TargetUserimagesSparseF2fsDisabled + superImageProps.Sparse = proptools.BoolPtr(sparse) + + var partitionGroupsInfo []filesystem.PartitionGroupsInfo + for _, groupName := range android.SortedKeys(partitionVars.BoardSuperPartitionGroups) { + info := filesystem.PartitionGroupsInfo{ + Name: groupName, + GroupSize: partitionVars.BoardSuperPartitionGroups[groupName].GroupSize, + PartitionList: partitionVars.BoardSuperPartitionGroups[groupName].PartitionList, + } + partitionGroupsInfo = append(partitionGroupsInfo, info) + } + superImageProps.Partition_groups = partitionGroupsInfo + + partitionNameProps := &filesystem.SuperImagePartitionNameProperties{} + if android.InList("system", partitions) { + partitionNameProps.System_partition = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system")) + } + if android.InList("system_ext", partitions) { + partitionNameProps.System_ext_partition = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system_ext")) + } + if android.InList("system_dlkm", partitions) { + partitionNameProps.System_dlkm_partition = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system_dlkm")) + } + if android.InList("system_other", partitions) { + partitionNameProps.System_other_partition = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system_other")) + } + if android.InList("product", partitions) { + partitionNameProps.Product_partition = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "product")) + } + if android.InList("vendor", partitions) { + partitionNameProps.Vendor_partition = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "vendor")) + } + if android.InList("vendor_dlkm", partitions) { + partitionNameProps.Vendor_dlkm_partition = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "vendor_dlkm")) + } + if android.InList("odm", partitions) { + partitionNameProps.Odm_partition = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "odm")) + } + if android.InList("odm_dlkm", partitions) { + partitionNameProps.Odm_dlkm_partition = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "odm_dlkm")) + } + + ctx.CreateModule(filesystem.SuperImageFactory, baseProps, superImageProps, partitionNameProps) +} diff --git a/java/aar.go b/java/aar.go index 1e5c95a7f..b66876663 100644 --- a/java/aar.go +++ b/java/aar.go @@ -257,7 +257,7 @@ func (a *aapt) IsRROEnforced(ctx android.BaseModuleContext) bool { } func (a *aapt) aapt2Flags(ctx android.ModuleContext, sdkContext android.SdkContext, - manifestPath android.Path) (compileFlags, linkFlags []string, linkDeps android.Paths, + manifestPath android.Path, doNotIncludeAssetDirImplicitly bool) (compileFlags, linkFlags []string, linkDeps android.Paths, resDirs, overlayDirs []globbedResourceDir, rroDirs []rroDir, resZips android.Paths) { hasVersionCode := android.PrefixInList(a.aaptProperties.Aaptflags, "--version-code") @@ -274,7 +274,12 @@ func (a *aapt) aapt2Flags(ctx android.ModuleContext, sdkContext android.SdkConte Paths: a.aaptProperties.Assets, IncludeDirs: false, }) - assetDirs := android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Asset_dirs, "assets") + var assetDirs android.Paths + if doNotIncludeAssetDirImplicitly { + assetDirs = android.PathsForModuleSrc(ctx, a.aaptProperties.Asset_dirs) + } else { + assetDirs = android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Asset_dirs, "assets") + } resourceDirs := android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Resource_dirs.GetOrDefault(ctx, nil), "res") resourceZips := android.PathsForModuleSrc(ctx, a.aaptProperties.Resource_zips) @@ -494,7 +499,8 @@ func (a *aapt) buildActions(ctx android.ModuleContext, opts aaptBuildActionOptio a.mergedManifestFile = manifestPath } - compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resZips := a.aapt2Flags(ctx, opts.sdkContext, manifestPath) + // do not include assets in autogenerated RRO. + compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resZips := a.aapt2Flags(ctx, opts.sdkContext, manifestPath, opts.rroDirs != nil) a.rroDirsDepSet = depset.NewBuilder[rroDir](depset.TOPOLOGICAL). Direct(rroDirs...). |