summaryrefslogtreecommitdiff
path: root/filesystem
diff options
context:
space:
mode:
Diffstat (limited to 'filesystem')
-rw-r--r--filesystem/android_device.go262
-rw-r--r--filesystem/bootimg.go62
-rw-r--r--filesystem/filesystem.go163
-rw-r--r--filesystem/filesystem_test.go23
-rw-r--r--filesystem/super_image.go66
5 files changed, 466 insertions, 110 deletions
diff --git a/filesystem/android_device.go b/filesystem/android_device.go
index 005dc3439..3f6348dbf 100644
--- a/filesystem/android_device.go
+++ b/filesystem/android_device.go
@@ -19,6 +19,7 @@ import (
"fmt"
"path/filepath"
"slices"
+ "sort"
"strings"
"sync/atomic"
@@ -106,11 +107,15 @@ type androidDevice struct {
allImagesZip android.Path
- proguardDictZip android.Path
- proguardDictMapping android.Path
- proguardUsageZip android.Path
- kernelConfig android.Path
- kernelVersion android.Path
+ proguardDictZip android.Path
+ proguardDictMapping android.Path
+ proguardUsageZip android.Path
+ kernelConfig android.Path
+ kernelVersion android.Path
+ miscInfo android.Path
+ rootDirForFsConfig string
+ rootDirForFsConfigTimestamp android.Path
+ apkCertsInfo android.Path
}
func AndroidDeviceFactory() android.Module {
@@ -185,7 +190,9 @@ func (a *androidDevice) GenerateAndroidBuildActions(ctx android.ModuleContext) {
allInstalledModules := a.allInstalledModules(ctx)
- a.kernelConfig, a.kernelVersion = a.extractKernelVersionAndConfigs(ctx)
+ a.apkCertsInfo = a.buildApkCertsInfo(ctx, allInstalledModules)
+ a.kernelVersion, a.kernelConfig = a.extractKernelVersionAndConfigs(ctx)
+ a.miscInfo = a.addMiscInfo(ctx)
a.buildTargetFilesZip(ctx, allInstalledModules)
a.buildProguardZips(ctx, allInstalledModules)
@@ -274,6 +281,39 @@ func (a *androidDevice) GenerateAndroidBuildActions(ctx android.ModuleContext) {
a.setVbmetaPhonyTargets(ctx)
a.distFiles(ctx)
+
+ android.SetProvider(ctx, android.AndroidDeviceInfoProvider, android.AndroidDeviceInfo{
+ Main_device: android.Bool(a.deviceProps.Main_device),
+ })
+
+ if proptools.String(a.partitionProps.Super_partition_name) != "" {
+ buildComplianceMetadata(ctx, superPartitionDepTag, filesystemDepTag)
+ } else {
+ buildComplianceMetadata(ctx, filesystemDepTag)
+ }
+}
+
+func buildComplianceMetadata(ctx android.ModuleContext, tags ...blueprint.DependencyTag) {
+ // Collect metadata from deps
+ filesContained := make([]string, 0)
+ prebuiltFilesCopied := make([]string, 0)
+ for _, tag := range tags {
+ ctx.VisitDirectDepsProxyWithTag(tag, func(m android.ModuleProxy) {
+ if complianceMetadataInfo, ok := android.OtherModuleProvider(ctx, m, android.ComplianceMetadataProvider); ok {
+ filesContained = append(filesContained, complianceMetadataInfo.GetFilesContained()...)
+ prebuiltFilesCopied = append(prebuiltFilesCopied, complianceMetadataInfo.GetPrebuiltFilesCopied()...)
+ }
+ })
+ }
+ // Merge to module's ComplianceMetadataInfo
+ complianceMetadataInfo := ctx.ComplianceMetadataInfo()
+ filesContained = append(filesContained, complianceMetadataInfo.GetFilesContained()...)
+ sort.Strings(filesContained)
+ complianceMetadataInfo.SetFilesContained(filesContained)
+
+ prebuiltFilesCopied = append(prebuiltFilesCopied, complianceMetadataInfo.GetPrebuiltFilesCopied()...)
+ sort.Strings(prebuiltFilesCopied)
+ complianceMetadataInfo.SetPrebuiltFilesCopied(prebuiltFilesCopied)
}
// Returns a list of modules that are installed, which are collected from the dependency
@@ -313,18 +353,32 @@ func insertBeforeExtension(file, insertion string) string {
return strings.TrimSuffix(file, ext) + insertion + ext
}
+func (a *androidDevice) distInstalledFiles(ctx android.ModuleContext) {
+ distInstalledFilesJsonAndTxt := func(installedFiles InstalledFilesStruct) {
+ if installedFiles.Json != nil {
+ ctx.DistForGoal("droidcore-unbundled", installedFiles.Json)
+ }
+ if installedFiles.Txt != nil {
+ ctx.DistForGoal("droidcore-unbundled", installedFiles.Txt)
+ }
+ }
+
+ fsInfoMap := a.getFsInfos(ctx)
+ for _, partition := range android.SortedKeys(fsInfoMap) {
+ // installed-files-*{.txt | .json} is not disted for userdata partition
+ if partition == "userdata" {
+ continue
+ }
+ fsInfo := fsInfoMap[partition]
+ for _, installedFiles := range fsInfo.InstalledFilesDepSet.ToList() {
+ distInstalledFilesJsonAndTxt(installedFiles)
+ }
+ }
+}
+
func (a *androidDevice) distFiles(ctx android.ModuleContext) {
if !ctx.Config().KatiEnabled() && proptools.Bool(a.deviceProps.Main_device) {
- fsInfoMap := a.getFsInfos(ctx)
- for _, partition := range android.SortedKeys(fsInfoMap) {
- fsInfo := fsInfoMap[partition]
- if fsInfo.InstalledFiles.Json != nil {
- ctx.DistForGoal("droidcore-unbundled", fsInfo.InstalledFiles.Json)
- }
- if fsInfo.InstalledFiles.Txt != nil {
- ctx.DistForGoal("droidcore-unbundled", fsInfo.InstalledFiles.Txt)
- }
- }
+ a.distInstalledFiles(ctx)
namePrefix := ""
if ctx.Config().HasDeviceProduct() {
@@ -333,6 +387,10 @@ func (a *androidDevice) distFiles(ctx android.ModuleContext) {
ctx.DistForGoalWithFilename("droidcore-unbundled", a.proguardDictZip, namePrefix+insertBeforeExtension(a.proguardDictZip.Base(), "-FILE_NAME_TAG_PLACEHOLDER"))
ctx.DistForGoalWithFilename("droidcore-unbundled", a.proguardDictMapping, namePrefix+insertBeforeExtension(a.proguardDictMapping.Base(), "-FILE_NAME_TAG_PLACEHOLDER"))
ctx.DistForGoalWithFilename("droidcore-unbundled", a.proguardUsageZip, namePrefix+insertBeforeExtension(a.proguardUsageZip.Base(), "-FILE_NAME_TAG_PLACEHOLDER"))
+
+ if a.deviceProps.Android_info != nil {
+ ctx.DistForGoal("droidcore-unbundled", android.PathForModuleSrc(ctx, *a.deviceProps.Android_info))
+ }
}
}
@@ -470,6 +528,17 @@ func (a *androidDevice) buildTargetFilesZip(ctx android.ModuleContext, allInstal
if toCopy.destSubdir == "SYSTEM" {
// Create the ROOT partition in target_files.zip
builder.Command().Textf("rsync --links --exclude=system/* %s/ -r %s/ROOT", toCopy.fsInfo.RootDir, targetFilesDir.String())
+ // Add a duplicate rule to assemble the ROOT/ directory in separate intermediates.
+ // The output timestamp will be an input to a separate fs_config call.
+ a.rootDirForFsConfig = android.PathForModuleOut(ctx, "root_dir_for_fs_config").String()
+ rootDirBuilder := android.NewRuleBuilder(pctx, ctx)
+ rootDirForFsConfigTimestamp := android.PathForModuleOut(ctx, "root_dir_for_fs_config.timestamp")
+ rootDirBuilder.Command().Textf("rsync --links --exclude=system/* %s/ -r %s", toCopy.fsInfo.RootDir, a.rootDirForFsConfig).
+ Implicit(toCopy.fsInfo.Output).
+ Text("&& touch").
+ Output(rootDirForFsConfigTimestamp)
+ rootDirBuilder.Build("assemble_root_dir_for_fs_config", "Assemble ROOT/ for fs_config")
+ a.rootDirForFsConfigTimestamp = rootDirForFsConfigTimestamp
}
}
// Copy cmdline, kernel etc. files of boot images
@@ -554,6 +623,10 @@ func (a *androidDevice) copyImagesToTargetZip(ctx android.ModuleContext, builder
builder.Command().Textf("cp ").Input(info.SubImageInfo[partition].MapFile).Textf(" %s/IMAGES/", targetFilesDir.String())
}
}
+ // super_empty.img
+ if info.SuperEmptyImage != nil {
+ builder.Command().Textf("cp ").Input(info.SuperEmptyImage).Textf(" %s/IMAGES/", targetFilesDir.String())
+ }
} else {
ctx.ModuleErrorf("Super partition %s does set SuperImageProvider\n", superPartition.Name())
}
@@ -608,11 +681,17 @@ func (a *androidDevice) copyMetadataToTargetZip(ctx android.ModuleContext, build
}
if partition == "system" {
// Create root_filesystem_config from the assembled ROOT/ intermediates directory
- a.generateFilesystemConfigForTargetFiles(ctx, builder, targetFilesDir.String(), targetFilesDir.String()+"/ROOT", "root_filesystem_config.txt")
+ a.generateFilesystemConfigForTargetFiles(ctx, builder, a.rootDirForFsConfigTimestamp, targetFilesDir.String(), a.rootDirForFsConfig, "root_filesystem_config.txt")
}
if partition == "vendor_ramdisk" {
// Create vendor_boot_filesystem_config from the assembled VENDOR_BOOT/RAMDISK intermediates directory
- a.generateFilesystemConfigForTargetFiles(ctx, builder, targetFilesDir.String(), targetFilesDir.String()+"/VENDOR_BOOT/RAMDISK", "vendor_boot_filesystem_config.txt")
+ vendorRamdiskStagingDir := targetFilesDir.String() + "/VENDOR_BOOT/RAMDISK"
+ vendorRamdiskFsConfigOut := targetFilesDir.String() + "/META/vendor_boot_filesystem_config.txt"
+ fsConfigBin := ctx.Config().HostToolPath(ctx, "fs_config")
+ builder.Command().Textf(
+ `(cd %s; find . -type d | sed 's,$,/,'; find . \! -type d) | cut -c 3- | sort | sed 's,^,,' | %s -C -D %s -R \"\" > %s`,
+ vendorRamdiskStagingDir, fsConfigBin, vendorRamdiskStagingDir, vendorRamdiskFsConfigOut).
+ Implicit(fsConfigBin)
}
}
// Copy ramdisk_node_list
@@ -632,6 +711,9 @@ func (a *androidDevice) copyMetadataToTargetZip(ctx android.ModuleContext, build
}
installedApexKeys = android.SortedUniquePaths(installedApexKeys) // Sort by keypath to match make
builder.Command().Text("cat").Inputs(installedApexKeys).Textf(" >> %s/META/apexkeys.txt", targetFilesDir.String())
+ // apkcerts.txt
+ builder.Command().Textf("cp").Input(a.apkCertsInfo).Textf(" %s/META/", targetFilesDir.String())
+
// Copy fastboot-info.txt
if fastbootInfo := android.PathForModuleSrc(ctx, proptools.String(a.deviceProps.FastbootInfo)); fastbootInfo != nil {
// TODO (b/399788523): Autogenerate fastboot-info.txt if there is no source fastboot-info.txt
@@ -646,6 +728,12 @@ func (a *androidDevice) copyMetadataToTargetZip(ctx android.ModuleContext, build
if a.kernelVersion != nil {
builder.Command().Textf("cp").Input(a.kernelVersion).Textf(" %s/META/", targetFilesDir.String())
}
+ // misc_info.txt
+ if a.miscInfo != nil {
+ builder.Command().Textf("cp").Input(a.miscInfo).Textf(" %s/META/", targetFilesDir.String())
+ }
+ // apex_info.pb, care_map.pb, vbmeta_digest.txt
+ a.addImgToTargetFiles(ctx, builder, targetFilesDir.String())
if a.partitionProps.Super_partition_name != nil {
superPartition := ctx.GetDirectDepProxyWithTag(*a.partitionProps.Super_partition_name, superPartitionDepTag)
@@ -660,17 +748,96 @@ func (a *androidDevice) copyMetadataToTargetZip(ctx android.ModuleContext, build
}
+// A partial implementation of make's $PRODUCT_OUT/misc_info.txt
+// https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/Makefile;l=5894?q=misc_info.txt%20f:build%2Fmake%2Fcore%2FMakefile&ss=android%2Fplatform%2Fsuperproject%2Fmain
+// This file is subsequently used by add_img_to_target_files to create additioanl metadata files like apex_info.pb
+// TODO (b/399788119): Complete the migration of misc_info.txt
+func (a *androidDevice) addMiscInfo(ctx android.ModuleContext) android.Path {
+ builder := android.NewRuleBuilder(pctx, ctx)
+ miscInfo := android.PathForModuleOut(ctx, "misc_info.txt")
+ builder.Command().
+ Textf("rm -f %s", miscInfo).
+ Textf("&& echo recovery_api_version=%s >> %s", ctx.Config().VendorConfig("recovery").String("recovery_api_version"), miscInfo).
+ Textf("&& echo fstab_version=%s >> %s", ctx.Config().VendorConfig("recovery").String("recovery_fstab_version"), miscInfo).
+ ImplicitOutput(miscInfo)
+
+ if a.partitionProps.Recovery_partition_name == nil {
+ builder.Command().Textf("echo no_recovery=true >> %s", miscInfo)
+ }
+ fsInfos := a.getFsInfos(ctx)
+ for _, partition := range android.SortedKeys(fsInfos) {
+ if fsInfos[partition].UseAvb {
+ builder.Command().Textf("echo 'avb_%s_hashtree_enable=true' >> %s", partition, miscInfo)
+ }
+ }
+ if len(a.partitionProps.Vbmeta_partitions) > 0 {
+ builder.Command().
+ Textf("echo avb_enable=true >> %s", miscInfo).
+ Textf("&& echo avb_building_vbmeta_image=true >> %s", miscInfo).
+ Textf("&& echo avb_avbtool=avbtool >> %s", miscInfo)
+ }
+ if a.partitionProps.Boot_partition_name != nil {
+ builder.Command().Textf("echo boot_images=boot.img >> %s", miscInfo)
+ }
+
+ if a.partitionProps.Super_partition_name != nil {
+ superPartition := ctx.GetDirectDepProxyWithTag(*a.partitionProps.Super_partition_name, superPartitionDepTag)
+ if info, ok := android.OtherModuleProvider(ctx, superPartition, SuperImageProvider); ok {
+ // cat dynamic_partition_info.txt
+ builder.Command().Text("cat").Input(info.DynamicPartitionsInfo).Textf(" >> %s", miscInfo)
+ } else {
+ ctx.ModuleErrorf("Super partition %s does set SuperImageProvider\n", superPartition.Name())
+ }
+ }
+ bootImgNames := []*string{
+ a.partitionProps.Boot_partition_name,
+ a.partitionProps.Init_boot_partition_name,
+ a.partitionProps.Vendor_boot_partition_name,
+ }
+ for _, bootImgName := range bootImgNames {
+ if bootImgName == nil {
+ continue
+ }
+
+ bootImg := ctx.GetDirectDepProxyWithTag(proptools.String(bootImgName), filesystemDepTag)
+ bootImgInfo, _ := android.OtherModuleProvider(ctx, bootImg, BootimgInfoProvider)
+ // cat avb_ metadata of the boot images
+ builder.Command().Text("cat").Input(bootImgInfo.PropFileForMiscInfo).Textf(" >> %s", miscInfo)
+ }
+
+ builder.Build("misc_info", "Building misc_info")
+
+ return miscInfo
+}
+
+// addImgToTargetFiles invokes `add_img_to_target_files` and creates the following files in META/
+// - apex_info.pb
+// - care_map.pb
+// - vbmeta_digest.txt
+func (a *androidDevice) addImgToTargetFiles(ctx android.ModuleContext, builder *android.RuleBuilder, targetFilesDir string) {
+ mkbootimg := ctx.Config().HostToolPath(ctx, "mkbootimg")
+ builder.Command().
+ Textf("PATH=%s:$PATH", ctx.Config().HostToolDir()).
+ Textf("MKBOOTIMG=%s", mkbootimg).
+ Implicit(mkbootimg).
+ BuiltTool("add_img_to_target_files").
+ Flag("-a -v -p").
+ Flag(ctx.Config().HostToolDir()).
+ Text(targetFilesDir)
+}
+
type ApexKeyPathInfo struct {
ApexKeyPath android.Path
}
var ApexKeyPathInfoProvider = blueprint.NewProvider[ApexKeyPathInfo]()
-func (a *androidDevice) generateFilesystemConfigForTargetFiles(ctx android.ModuleContext, builder *android.RuleBuilder, targetFilesDir, stagingDir, filename string) {
+func (a *androidDevice) generateFilesystemConfigForTargetFiles(ctx android.ModuleContext, builder *android.RuleBuilder, stagingDirTimestamp android.Path, targetFilesDir, stagingDir, filename string) {
fsConfigOut := android.PathForModuleOut(ctx, filename)
ctx.Build(pctx, android.BuildParams{
- Rule: fsConfigRule,
- Output: fsConfigOut,
+ Rule: fsConfigRule,
+ Implicit: stagingDirTimestamp,
+ Output: fsConfigOut,
Args: map[string]string{
"rootDir": stagingDir,
"prefix": "",
@@ -757,11 +924,12 @@ func (a *androidDevice) extractKernelVersionAndConfigs(ctx android.ModuleContext
Flag("--tools lz4:"+lz4tool.String()).Implicit(lz4tool).
FlagWithInput("--input ", kernel).
FlagWithOutput("--output-release ", extractedVersionFile).
- FlagWithOutput("--output-configs ", extractedConfigsFile)
+ FlagWithOutput("--output-configs ", extractedConfigsFile).
+ Textf(`&& printf "\n" >> %s`, extractedVersionFile)
if specifiedVersion := proptools.String(a.deviceProps.Kernel_version); specifiedVersion != "" {
specifiedVersionFile := android.PathForModuleOut(ctx, "specified_kernel_version.txt")
- android.WriteFileRuleVerbatim(ctx, specifiedVersionFile, specifiedVersion)
+ android.WriteFileRule(ctx, specifiedVersionFile, specifiedVersion)
builder.Command().Text("diff -q").
Input(specifiedVersionFile).
Input(extractedVersionFile).
@@ -785,3 +953,51 @@ func (a *androidDevice) extractKernelVersionAndConfigs(ctx android.ModuleContext
return extractedVersionFile, extractedConfigsFile
}
+
+func (a *androidDevice) buildApkCertsInfo(ctx android.ModuleContext, allInstalledModules []android.Module) android.Path {
+ // TODO (spandandas): Add compressed
+ formatLine := func(cert java.Certificate, name, partition string) string {
+ pem := cert.AndroidMkString()
+ var key string
+ if cert.Key == nil {
+ key = ""
+ } else {
+ key = cert.Key.String()
+ }
+ return fmt.Sprintf(`name="%s" certificate="%s" private_key="%s" partition="%s"`, name, pem, key, partition)
+ }
+
+ apkCerts := []string{}
+ for _, installedModule := range allInstalledModules {
+ partition := ""
+ if commonInfo, ok := android.OtherModuleProvider(ctx, installedModule, android.CommonModuleInfoProvider); ok {
+ partition = commonInfo.PartitionTag
+ } else {
+ ctx.ModuleErrorf("%s does not set CommonModuleInfoKey", installedModule.Name())
+ }
+ if info, ok := android.OtherModuleProvider(ctx, installedModule, java.AppInfoProvider); ok {
+ apkCerts = append(apkCerts, formatLine(info.Certificate, info.InstallApkName+".apk", partition))
+ } else if info, ok := android.OtherModuleProvider(ctx, installedModule, java.AppInfosProvider); ok {
+ for _, certInfo := range info {
+ // Partition information of apk-in-apex is not exported to the legacy Make packaging system.
+ // Hardcode the partition to "system"
+ apkCerts = append(apkCerts, formatLine(certInfo.Certificate, certInfo.InstallApkName+".apk", "system"))
+ }
+ } else if info, ok := android.OtherModuleProvider(ctx, installedModule, java.RuntimeResourceOverlayInfoProvider); ok {
+ apkCerts = append(apkCerts, formatLine(info.Certificate, info.OutputFile.Base(), partition))
+ }
+ }
+ slices.Sort(apkCerts) // sort by name
+ fsInfos := a.getFsInfos(ctx)
+ if fsInfos["system"].HasFsverity {
+ defaultPem, defaultKey := ctx.Config().DefaultAppCertificate(ctx)
+ apkCerts = append(apkCerts, formatLine(java.Certificate{Pem: defaultPem, Key: defaultKey}, "BuildManifest.apk", "system"))
+ if info, ok := fsInfos["system_ext"]; ok && info.HasFsverity {
+ apkCerts = append(apkCerts, formatLine(java.Certificate{Pem: defaultPem, Key: defaultKey}, "BuildManifestSystemExt.apk", "system_ext"))
+ }
+ }
+
+ apkCertsInfo := android.PathForModuleOut(ctx, "apkcerts.txt")
+ android.WriteFileRuleVerbatim(ctx, apkCertsInfo, strings.Join(apkCerts, "\n")+"\n")
+ return apkCertsInfo
+}
diff --git a/filesystem/bootimg.go b/filesystem/bootimg.go
index effbd6542..7959365e8 100644
--- a/filesystem/bootimg.go
+++ b/filesystem/bootimg.go
@@ -201,7 +201,8 @@ func (b *bootimg) GenerateAndroidBuildActions(ctx android.ModuleContext) {
return
}
- unsignedOutput := b.buildBootImage(ctx, b.getKernelPath(ctx))
+ kernelPath := b.getKernelPath(ctx)
+ unsignedOutput := b.buildBootImage(ctx, kernelPath)
output := unsignedOutput
if proptools.Bool(b.properties.Use_avb) {
@@ -212,7 +213,7 @@ func (b *bootimg) GenerateAndroidBuildActions(ctx android.ModuleContext) {
case "default":
output = b.signImage(ctx, unsignedOutput)
case "make_legacy":
- output = b.addAvbFooter(ctx, unsignedOutput, b.getKernelPath(ctx))
+ output = b.addAvbFooter(ctx, unsignedOutput, kernelPath)
default:
ctx.PropertyErrorf("avb_mode", `Unknown value for avb_mode, expected "default" or "make_legacy", got: %q`, *b.properties.Avb_mode)
}
@@ -235,12 +236,14 @@ func (b *bootimg) GenerateAndroidBuildActions(ctx android.ModuleContext) {
}
// Set BootimgInfo for building target_files.zip
+ dtbPath := b.getDtbPath(ctx)
android.SetProvider(ctx, BootimgInfoProvider, BootimgInfo{
- Cmdline: b.properties.Cmdline,
- Kernel: b.getKernelPath(ctx),
- Dtb: b.getDtbPath(ctx),
- Bootconfig: b.getBootconfigPath(ctx),
- Output: output,
+ Cmdline: b.properties.Cmdline,
+ Kernel: kernelPath,
+ Dtb: dtbPath,
+ Bootconfig: b.getBootconfigPath(ctx),
+ Output: output,
+ PropFileForMiscInfo: b.buildPropFileForMiscInfo(ctx),
})
extractedPublicKey := android.PathForModuleOut(ctx, b.partitionName()+".avbpubkey")
@@ -263,16 +266,32 @@ func (b *bootimg) GenerateAndroidBuildActions(ctx android.ModuleContext) {
PublicKey: extractedPublicKey,
Output: output,
})
+
+ // Dump compliance metadata
+ complianceMetadataInfo := ctx.ComplianceMetadataInfo()
+ prebuiltFilesCopied := make([]string, 0)
+ if kernelPath != nil {
+ prebuiltFilesCopied = append(prebuiltFilesCopied, kernelPath.String()+":kernel")
+ }
+ if dtbPath != nil {
+ prebuiltFilesCopied = append(prebuiltFilesCopied, dtbPath.String()+":dtb.img")
+ }
+ complianceMetadataInfo.SetPrebuiltFilesCopied(prebuiltFilesCopied)
+
+ if ramdisk := proptools.String(b.properties.Ramdisk_module); ramdisk != "" {
+ buildComplianceMetadata(ctx, bootimgRamdiskDep)
+ }
}
var BootimgInfoProvider = blueprint.NewProvider[BootimgInfo]()
type BootimgInfo struct {
- Cmdline []string
- Kernel android.Path
- Dtb android.Path
- Bootconfig android.Path
- Output android.Path
+ Cmdline []string
+ Kernel android.Path
+ Dtb android.Path
+ Bootconfig android.Path
+ Output android.Path
+ PropFileForMiscInfo android.Path
}
func (b *bootimg) getKernelPath(ctx android.ModuleContext) android.Path {
@@ -491,6 +510,25 @@ func (b *bootimg) buildPropFile(ctx android.ModuleContext) (android.Path, androi
return propFile, deps
}
+func (b *bootimg) buildPropFileForMiscInfo(ctx android.ModuleContext) android.Path {
+ var sb strings.Builder
+ addStr := func(name string, value string) {
+ fmt.Fprintf(&sb, "%s=%s\n", name, value)
+ }
+
+ bootImgType := proptools.String(b.properties.Boot_image_type)
+ addStr("avb_"+bootImgType+"_add_hash_footer_args", "TODO(b/398036609)")
+ if b.properties.Avb_private_key != nil {
+ addStr("avb_"+bootImgType+"_algorithm", proptools.StringDefault(b.properties.Avb_algorithm, "SHA256_RSA4096"))
+ addStr("avb_"+bootImgType+"_key_path", android.PathForModuleSrc(ctx, proptools.String(b.properties.Avb_private_key)).String())
+ addStr("avb_"+bootImgType+"_rollback_index_location", strconv.Itoa(proptools.Int(b.properties.Avb_rollback_index_location)))
+ }
+
+ propFile := android.PathForModuleOut(ctx, "prop_for_misc_info")
+ android.WriteFileRuleVerbatim(ctx, propFile, sb.String())
+ return propFile
+}
+
var _ android.AndroidMkEntriesProvider = (*bootimg)(nil)
// Implements android.AndroidMkEntriesProvider
diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go
index fc480e6f0..b8548805b 100644
--- a/filesystem/filesystem.go
+++ b/filesystem/filesystem.go
@@ -30,6 +30,7 @@ import (
"android/soong/linkerconfig"
"github.com/google/blueprint"
+ "github.com/google/blueprint/depset"
"github.com/google/blueprint/proptools"
)
@@ -374,6 +375,20 @@ func (fs fsType) IsUnknown() bool {
return fs == unknown
}
+// Type string that build_image.py accepts.
+func (t fsType) String() string {
+ switch t {
+ // TODO(372522486): add more types like f2fs, erofs, etc.
+ case ext4Type:
+ return "ext4"
+ case erofsType:
+ return "erofs"
+ case f2fsType:
+ return "f2fs"
+ }
+ panic(fmt.Errorf("unsupported fs type %d", t))
+}
+
type InstalledFilesStruct struct {
Txt android.Path
Json android.Path
@@ -424,8 +439,8 @@ type FilesystemInfo struct {
FullInstallPaths []FullInstallPathInfo
- // Installed files list
- InstalledFiles InstalledFilesStruct
+ // Installed files dep set of this module and its dependency filesystem modules
+ InstalledFilesDepSet depset.DepSet[InstalledFilesStruct]
// Path to compress hints file for erofs filesystems
// This will be nil for other fileystems like ext4
@@ -436,6 +451,10 @@ type FilesystemInfo struct {
FilesystemConfig android.Path
Owners []InstalledModuleInfo
+
+ UseAvb bool
+
+ HasFsverity bool
}
// FullInstallPathInfo contains information about the "full install" paths of all the files
@@ -539,13 +558,13 @@ func (f *filesystem) ModifyPackagingSpec(ps *android.PackagingSpec) {
}
}
-func buildInstalledFiles(ctx android.ModuleContext, partition string, rootDir android.Path, image android.Path) (txt android.ModuleOutPath, json android.ModuleOutPath) {
+func buildInstalledFiles(ctx android.ModuleContext, partition string, rootDir android.Path, image android.Path) InstalledFilesStruct {
fileName := "installed-files"
if len(partition) > 0 {
fileName += fmt.Sprintf("-%s", partition)
}
- txt = android.PathForModuleOut(ctx, fmt.Sprintf("%s.txt", fileName))
- json = android.PathForModuleOut(ctx, fmt.Sprintf("%s.json", fileName))
+ txt := android.PathForModuleOut(ctx, fmt.Sprintf("%s.txt", fileName))
+ json := android.PathForModuleOut(ctx, fmt.Sprintf("%s.json", fileName))
ctx.Build(pctx, android.BuildParams{
Rule: installedFilesJsonRule,
@@ -564,7 +583,10 @@ func buildInstalledFiles(ctx android.ModuleContext, partition string, rootDir an
Description: "Installed file list txt",
})
- return txt, json
+ return InstalledFilesStruct{
+ Txt: txt,
+ Json: json,
+ }
}
func (f *filesystem) GenerateAndroidBuildActions(ctx android.ModuleContext) {
@@ -647,11 +669,15 @@ func (f *filesystem) GenerateAndroidBuildActions(ctx android.ModuleContext) {
fileListFile := android.PathForModuleOut(ctx, "fileList")
android.WriteFileRule(ctx, fileListFile, f.installedFilesList())
- partitionName := f.partitionName()
- if partitionName == "system" {
- partitionName = ""
+ var partitionNameForInstalledFiles string
+ switch f.partitionName() {
+ case "system":
+ partitionNameForInstalledFiles = ""
+ case "vendor_ramdisk":
+ partitionNameForInstalledFiles = "vendor-ramdisk"
+ default:
+ partitionNameForInstalledFiles = f.partitionName()
}
- installedFileTxt, installedFileJson := buildInstalledFiles(ctx, partitionName, rootDir, f.output)
var erofsCompressHints android.Path
if f.properties.Erofs.Compress_hints != nil {
@@ -672,14 +698,17 @@ func (f *filesystem) GenerateAndroidBuildActions(ctx android.ModuleContext) {
BuildImagePropFileDeps: buildImagePropFileDeps,
SpecsForSystemOther: f.systemOtherFiles(ctx),
FullInstallPaths: fullInstallPaths,
- InstalledFiles: InstalledFilesStruct{
- Txt: installedFileTxt,
- Json: installedFileJson,
- },
+ InstalledFilesDepSet: depset.New(
+ depset.POSTORDER,
+ []InstalledFilesStruct{buildInstalledFiles(ctx, partitionNameForInstalledFiles, rootDir, f.output)},
+ includeFilesInstalledFiles(ctx),
+ ),
ErofsCompressHints: erofsCompressHints,
SelinuxFc: f.selinuxFc,
FilesystemConfig: f.generateFilesystemConfig(ctx, rootDir, rebasedDir),
Owners: f.gatherOwners(specs),
+ UseAvb: proptools.Bool(f.properties.Use_avb),
+ HasFsverity: f.properties.Fsverity.Inputs.GetOrDefault(ctx, nil) != nil,
}
android.SetProvider(ctx, FilesystemProvider, fsInfo)
@@ -695,6 +724,14 @@ func (f *filesystem) GenerateAndroidBuildActions(ctx android.ModuleContext) {
}
f.setVbmetaPartitionProvider(ctx)
+
+ // Dump metadata that can not be done in android/compliance-metadata.go
+ complianceMetadataInfo := ctx.ComplianceMetadataInfo()
+ filesContained := make([]string, 0, len(fullInstallPaths))
+ for _, file := range fullInstallPaths {
+ filesContained = append(filesContained, file.FullInstallPath.String())
+ }
+ complianceMetadataInfo.SetFilesContained(filesContained)
}
func (f *filesystem) fileystemStagingDirTimestamp(ctx android.ModuleContext) android.WritablePath {
@@ -879,13 +916,24 @@ func (f *filesystem) buildNonDepsFiles(
builder.Command().Text("mkdir -p").Text(filepath.Dir(dst.String()))
builder.Command().Text("ln -sf").Text(proptools.ShellEscape(target)).Text(dst.String())
f.appendToEntry(ctx, dst)
- // Only add the fullInstallPath logic for files in the rebased dir. The root dir
- // is harder to install to.
- if strings.HasPrefix(name, rebasedPrefix) {
+ // Add the fullInstallPath logic for files in the rebased dir, and for non-rebased files in "system" partition
+ // the fullInstallPath is changed to "root" which aligns to the behavior in Make.
+ if f.PartitionType() == "system" {
+ installPath := android.PathForModuleInPartitionInstall(ctx, f.PartitionType(), strings.TrimPrefix(name, rebasedPrefix))
+ if !strings.HasPrefix(name, rebasedPrefix) {
+ installPath = android.PathForModuleInPartitionInstall(ctx, "root", name)
+ }
*fullInstallPaths = append(*fullInstallPaths, FullInstallPathInfo{
- FullInstallPath: android.PathForModuleInPartitionInstall(ctx, f.PartitionType(), strings.TrimPrefix(name, rebasedPrefix)),
+ FullInstallPath: installPath,
SymlinkTarget: target,
})
+ } else {
+ if strings.HasPrefix(name, rebasedPrefix) {
+ *fullInstallPaths = append(*fullInstallPaths, FullInstallPathInfo{
+ FullInstallPath: android.PathForModuleInPartitionInstall(ctx, f.PartitionType(), strings.TrimPrefix(name, rebasedPrefix)),
+ SymlinkTarget: target,
+ })
+ }
}
}
@@ -997,21 +1045,7 @@ func (f *filesystem) buildPropFile(ctx android.ModuleContext) (android.Path, and
deps = append(deps, path)
}
- // Type string that build_image.py accepts.
- fsTypeStr := func(t fsType) string {
- switch t {
- // TODO(372522486): add more types like f2fs, erofs, etc.
- case ext4Type:
- return "ext4"
- case erofsType:
- return "erofs"
- case f2fsType:
- return "f2fs"
- }
- panic(fmt.Errorf("unsupported fs type %v", t))
- }
-
- addStr("fs_type", fsTypeStr(f.fsType(ctx)))
+ addStr("fs_type", f.fsType(ctx).String())
addStr("mount_point", proptools.StringDefault(f.properties.Mount_point, "/"))
addStr("use_dynamic_partition_size", "true")
addPath("ext_mkuserimg", ctx.Config().HostToolPath(ctx, "mkuserimg_mke2fs"))
@@ -1030,28 +1064,7 @@ func (f *filesystem) buildPropFile(ctx android.ModuleContext) (android.Path, and
addPath("avb_key_path", key)
}
addStr("partition_name", f.partitionName())
- avb_add_hashtree_footer_args := ""
- if !proptools.BoolDefault(f.properties.Use_fec, true) {
- avb_add_hashtree_footer_args += " --do_not_generate_fec"
- }
- hashAlgorithm := proptools.StringDefault(f.properties.Avb_hash_algorithm, "sha256")
- avb_add_hashtree_footer_args += " --hash_algorithm " + hashAlgorithm
- if f.properties.Rollback_index != nil {
- rollbackIndex := proptools.Int(f.properties.Rollback_index)
- if rollbackIndex < 0 {
- ctx.PropertyErrorf("rollback_index", "Rollback index must be non-negative")
- }
- avb_add_hashtree_footer_args += " --rollback_index " + strconv.Itoa(rollbackIndex)
- }
- avb_add_hashtree_footer_args += fmt.Sprintf(" --prop com.android.build.%s.os_version:%s", f.partitionName(), ctx.Config().PlatformVersionLastStable())
- // We're not going to add BuildFingerPrintFile as a dep. If it changed, it's likely because
- // the build number changed, and we don't want to trigger rebuilds solely based on the build
- // number.
- avb_add_hashtree_footer_args += fmt.Sprintf(" --prop com.android.build.%s.fingerprint:{CONTENTS_OF:%s}", f.partitionName(), ctx.Config().BuildFingerprintFile(ctx))
- if f.properties.Security_patch != nil && proptools.String(f.properties.Security_patch) != "" {
- avb_add_hashtree_footer_args += fmt.Sprintf(" --prop com.android.build.%s.security_patch:%s", f.partitionName(), proptools.String(f.properties.Security_patch))
- }
- addStr("avb_add_hashtree_footer_args", avb_add_hashtree_footer_args)
+ addStr("avb_add_hashtree_footer_args", f.getAvbAddHashtreeFooterArgs(ctx))
}
if f.properties.File_contexts != nil && f.properties.Precompiled_file_contexts != nil {
@@ -1100,7 +1113,7 @@ func (f *filesystem) buildPropFile(ctx android.ModuleContext) (android.Path, and
addStr("f2fs_sparse_flag", "-S")
}
}
- f.checkFsTypePropertyError(ctx, fst, fsTypeStr(fst))
+ f.checkFsTypePropertyError(ctx, fst, fst.String())
if f.properties.Partition_size != nil {
addStr("partition_size", strconv.FormatInt(*f.properties.Partition_size, 10))
@@ -1131,6 +1144,31 @@ func (f *filesystem) buildPropFile(ctx android.ModuleContext) (android.Path, and
return propFile, deps
}
+func (f *filesystem) getAvbAddHashtreeFooterArgs(ctx android.ModuleContext) string {
+ avb_add_hashtree_footer_args := ""
+ if !proptools.BoolDefault(f.properties.Use_fec, true) {
+ avb_add_hashtree_footer_args += " --do_not_generate_fec"
+ }
+ hashAlgorithm := proptools.StringDefault(f.properties.Avb_hash_algorithm, "sha256")
+ avb_add_hashtree_footer_args += " --hash_algorithm " + hashAlgorithm
+ if f.properties.Rollback_index != nil {
+ rollbackIndex := proptools.Int(f.properties.Rollback_index)
+ if rollbackIndex < 0 {
+ ctx.PropertyErrorf("rollback_index", "Rollback index must be non-negative")
+ }
+ avb_add_hashtree_footer_args += " --rollback_index " + strconv.Itoa(rollbackIndex)
+ }
+ avb_add_hashtree_footer_args += fmt.Sprintf(" --prop com.android.build.%s.os_version:%s", f.partitionName(), ctx.Config().PlatformVersionLastStable())
+ // We're not going to add BuildFingerPrintFile as a dep. If it changed, it's likely because
+ // the build number changed, and we don't want to trigger rebuilds solely based on the build
+ // number.
+ avb_add_hashtree_footer_args += fmt.Sprintf(" --prop com.android.build.%s.fingerprint:{CONTENTS_OF:%s}", f.partitionName(), ctx.Config().BuildFingerprintFile(ctx))
+ if f.properties.Security_patch != nil && proptools.String(f.properties.Security_patch) != "" {
+ avb_add_hashtree_footer_args += fmt.Sprintf(" --prop com.android.build.%s.security_patch:%s", f.partitionName(), proptools.String(f.properties.Security_patch))
+ }
+ return avb_add_hashtree_footer_args
+}
+
// This method checks if there is any property set for the fstype(s) other than
// the current fstype.
func (f *filesystem) checkFsTypePropertyError(ctx android.ModuleContext, t fsType, fs string) {
@@ -1164,6 +1202,15 @@ func includeFilesRootDir(ctx android.ModuleContext) (rootDirs android.Paths, par
return rootDirs, partitions
}
+func includeFilesInstalledFiles(ctx android.ModuleContext) (ret []depset.DepSet[InstalledFilesStruct]) {
+ ctx.VisitDirectDepsWithTag(interPartitionInstallDependencyTag, func(m android.Module) {
+ if fsProvider, ok := android.OtherModuleProvider(ctx, m, FilesystemProvider); ok {
+ ret = append(ret, fsProvider.InstalledFilesDepSet)
+ }
+ })
+ return
+}
+
func (f *filesystem) buildCpioImage(
ctx android.ModuleContext,
builder *android.RuleBuilder,
@@ -1426,7 +1473,7 @@ func (f *filesystem) getLibsForLinkerConfig(ctx android.ModuleContext) ([]androi
deps := f.gatherFilteredPackagingSpecs(ctx)
ctx.WalkDepsProxy(func(child, parent android.ModuleProxy) bool {
- if !android.OtherModuleProviderOrDefault(ctx, child, android.CommonModuleInfoKey).Enabled {
+ if !android.OtherModulePointerProviderOrDefault(ctx, child, android.CommonModuleInfoProvider).Enabled {
return false
}
for _, ps := range android.OtherModuleProviderOrDefault(
@@ -1447,7 +1494,7 @@ func (f *filesystem) getLibsForLinkerConfig(ctx android.ModuleContext) ([]androi
var requireModules []android.ModuleProxy
ctx.WalkDepsProxy(func(child, parent android.ModuleProxy) bool {
- if !android.OtherModuleProviderOrDefault(ctx, child, android.CommonModuleInfoKey).Enabled {
+ if !android.OtherModulePointerProviderOrDefault(ctx, child, android.CommonModuleInfoProvider).Enabled {
return false
}
_, parentInPackage := modulesInPackageByModule[parent]
diff --git a/filesystem/filesystem_test.go b/filesystem/filesystem_test.go
index 6d0b49016..bf7f5b64b 100644
--- a/filesystem/filesystem_test.go
+++ b/filesystem/filesystem_test.go
@@ -723,26 +723,47 @@ cc_library {
// override_android_* modules implicitly override their base module.
// If both of these are listed in `deps`, the base module should not be installed.
+// Also, required deps should be updated too.
func TestOverrideModulesInDeps(t *testing.T) {
result := fixture.RunTestWithBp(t, `
+ cc_library_shared {
+ name: "libfoo",
+ stl: "none",
+ system_shared_libs: [],
+ }
+ cc_library_shared {
+ name: "libbar",
+ stl: "none",
+ system_shared_libs: [],
+ }
android_filesystem {
name: "myfilesystem",
+ deps: ["myapp"],
+ }
+ android_filesystem {
+ name: "myfilesystem_overridden",
deps: ["myapp", "myoverrideapp"],
}
android_app {
name: "myapp",
platform_apis: true,
+ required: ["libfoo"],
}
override_android_app {
name: "myoverrideapp",
base: "myapp",
+ required: ["libbar"],
}
`)
partition := result.ModuleForTests(t, "myfilesystem", "android_common")
fileList := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("fileList"))
- android.AssertStringEquals(t, "filesystem with override app", "app/myoverrideapp/myoverrideapp.apk\n", fileList)
+ android.AssertStringEquals(t, "filesystem without override app", "app/myapp/myapp.apk\nlib64/libfoo.so\n", fileList)
+
+ overriddenPartition := result.ModuleForTests(t, "myfilesystem_overridden", "android_common")
+ overriddenFileList := android.ContentFromFileRuleForTests(t, result.TestContext, overriddenPartition.Output("fileList"))
+ android.AssertStringEquals(t, "filesystem with override app", "app/myoverrideapp/myoverrideapp.apk\nlib64/libbar.so\n", overriddenFileList)
}
func TestRamdiskPartitionSetsDevNodes(t *testing.T) {
diff --git a/filesystem/super_image.go b/filesystem/super_image.go
index 5e62fa702..cd7df027a 100644
--- a/filesystem/super_image.go
+++ b/filesystem/super_image.go
@@ -80,6 +80,8 @@ type SuperImageProperties struct {
}
// Whether the super image will be disted in the update package
Super_image_in_update_package *bool
+ // Whether a super_empty.img should be created
+ Create_super_empty *bool
}
type PartitionGroupsInfo struct {
@@ -118,6 +120,8 @@ type SuperImageInfo struct {
SubImageInfo map[string]FilesystemInfo
DynamicPartitionsInfo android.Path
+
+ SuperEmptyImage android.Path
}
var SuperImageProvider = blueprint.NewProvider[SuperImageInfo]()
@@ -163,7 +167,7 @@ func (s *superImage) DepsMutator(ctx android.BottomUpMutatorContext) {
}
func (s *superImage) GenerateAndroidBuildActions(ctx android.ModuleContext) {
- miscInfo, deps, subImageInfos := s.buildMiscInfo(ctx)
+ miscInfo, deps, subImageInfos := s.buildMiscInfo(ctx, false)
builder := android.NewRuleBuilder(pctx, ctx)
output := android.PathForModuleOut(ctx, s.installFileName())
lpMake := ctx.Config().HostToolPath(ctx, "lpmake")
@@ -176,20 +180,39 @@ func (s *superImage) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Implicits(deps).
Output(output)
builder.Build("build_super_image", fmt.Sprintf("Creating super image %s", s.BaseModuleName()))
+ var superEmptyImage android.WritablePath
+ if proptools.Bool(s.properties.Create_super_empty) {
+ superEmptyImageBuilder := android.NewRuleBuilder(pctx, ctx)
+ superEmptyImage = android.PathForModuleOut(ctx, "super_empty.img")
+ superEmptyMiscInfo, superEmptyDeps, _ := s.buildMiscInfo(ctx, true)
+ if superEmptyDeps != nil {
+ ctx.ModuleErrorf("TODO: Handle additional deps when building super_empty.img")
+ }
+ superEmptyImageBuilder.Command().Textf("PATH=%s:\\$PATH", lpMakeDir).
+ BuiltTool("build_super_image").
+ Text("-v").
+ Input(superEmptyMiscInfo).
+ Implicit(lpMake).
+ Output(superEmptyImage)
+ superEmptyImageBuilder.Build("build_super_empty_image", fmt.Sprintf("Creating super empty image %s", s.BaseModuleName()))
+ }
android.SetProvider(ctx, SuperImageProvider, SuperImageInfo{
SuperImage: output,
SubImageInfo: subImageInfos,
DynamicPartitionsInfo: s.generateDynamicPartitionsInfo(ctx),
+ SuperEmptyImage: superEmptyImage,
})
ctx.SetOutputFiles([]android.Path{output}, "")
ctx.CheckbuildFile(output)
+
+ buildComplianceMetadata(ctx, subImageDepTag)
}
func (s *superImage) installFileName() string {
return "super.img"
}
-func (s *superImage) buildMiscInfo(ctx android.ModuleContext) (android.Path, android.Paths, map[string]FilesystemInfo) {
+func (s *superImage) buildMiscInfo(ctx android.ModuleContext, superEmpty bool) (android.Path, android.Paths, map[string]FilesystemInfo) {
var miscInfoString strings.Builder
partitionList := s.dumpDynamicPartitionInfo(ctx, &miscInfoString)
addStr := func(name string, value string) {
@@ -198,6 +221,12 @@ func (s *superImage) buildMiscInfo(ctx android.ModuleContext) (android.Path, and
miscInfoString.WriteString(value)
miscInfoString.WriteRune('\n')
}
+ addStr("ab_update", strconv.FormatBool(proptools.Bool(s.properties.Ab_update)))
+ if superEmpty {
+ miscInfo := android.PathForModuleOut(ctx, "misc_info_super_empty.txt")
+ android.WriteFileRule(ctx, miscInfo, miscInfoString.String())
+ return miscInfo, nil, nil
+ }
subImageInfo := make(map[string]FilesystemInfo)
var deps android.Paths
@@ -296,38 +325,43 @@ func (s *superImage) dumpDynamicPartitionInfo(ctx android.ModuleContext, sb *str
sb.WriteRune('\n')
}
- addStr("build_super_partition", "true")
addStr("use_dynamic_partitions", strconv.FormatBool(proptools.Bool(s.properties.Use_dynamic_partitions)))
if proptools.Bool(s.properties.Retrofit) {
addStr("dynamic_partition_retrofit", "true")
}
addStr("lpmake", "lpmake")
+ addStr("build_super_partition", "true")
+ if proptools.Bool(s.properties.Create_super_empty) {
+ addStr("build_super_empty_partition", "true")
+ }
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, " "))
}
- if proptools.Bool(s.properties.Super_image_in_update_package) {
- addStr("super_image_in_update_package", "true")
- }
- addStr("super_partition_size", strconv.Itoa(proptools.Int(s.properties.Size)))
// TODO: In make, there's more complicated logic than just this surrounding super_*_device_size
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("dynamic_partition_list", strings.Join(android.SortedUniqueStrings(partitionList), " "))
+ addStr("super_partition_groups", strings.Join(groups, " "))
initialPartitionListLen := len(partitionList)
partitionList = android.SortedUniqueStrings(partitionList)
if len(partitionList) != initialPartitionListLen {
ctx.ModuleErrorf("Duplicate partitions found in the partition_groups property")
}
- addStr("super_partition_groups", strings.Join(groups, " "))
- addStr("dynamic_partition_list", strings.Join(partitionList, " "))
+ // Add Partition group info after adding `super_partition_groups` and `dynamic_partition_list`
+ for _, groupInfo := range s.properties.Partition_groups {
+ addStr("super_"+groupInfo.Name+"_group_size", groupInfo.GroupSize)
+ addStr("super_"+groupInfo.Name+"_partition_list", strings.Join(groupInfo.PartitionList, " "))
+ }
- addStr("ab_update", strconv.FormatBool(proptools.Bool(s.properties.Ab_update)))
+ if proptools.Bool(s.properties.Super_image_in_update_package) {
+ addStr("super_image_in_update_package", "true")
+ }
+ addStr("super_partition_size", strconv.Itoa(proptools.Int(s.properties.Size)))
if proptools.Bool(s.properties.Virtual_ab.Enable) {
addStr("virtual_ab", "true")
@@ -342,12 +376,12 @@ func (s *superImage) dumpDynamicPartitionInfo(ctx android.ModuleContext, sb *str
}
addStr("virtual_ab_compression_method", *s.properties.Virtual_ab.Compression_method)
}
- if s.properties.Virtual_ab.Compression_factor != nil {
- addStr("virtual_ab_compression_factor", strconv.FormatInt(*s.properties.Virtual_ab.Compression_factor, 10))
- }
if s.properties.Virtual_ab.Cow_version != nil {
addStr("virtual_ab_cow_version", strconv.FormatInt(*s.properties.Virtual_ab.Cow_version, 10))
}
+ if s.properties.Virtual_ab.Compression_factor != nil {
+ addStr("virtual_ab_compression_factor", strconv.FormatInt(*s.properties.Virtual_ab.Compression_factor, 10))
+ }
} else {
if s.properties.Virtual_ab.Retrofit != nil {
@@ -371,6 +405,6 @@ func (s *superImage) generateDynamicPartitionsInfo(ctx android.ModuleContext) an
var contents strings.Builder
s.dumpDynamicPartitionInfo(ctx, &contents)
dynamicPartitionsInfo := android.PathForModuleOut(ctx, "dynamic_partitions_info.txt")
- android.WriteFileRule(ctx, dynamicPartitionsInfo, contents.String())
+ android.WriteFileRuleVerbatim(ctx, dynamicPartitionsInfo, contents.String())
return dynamicPartitionsInfo
}