Revert "Build vbmeta partitions with soong"

Revert submission 3341139-vbmeta_partitions_in_soong

Reason for revert: DroidMonitor: Potential culprit for http://b/377943457. 

Reverted changes: /q/submissionid:3341139-vbmeta_partitions_in_soong

Change-Id: I7a3aeacc91f17832688ee4d917cdee34db5d4a1b
diff --git a/android/variable.go b/android/variable.go
index f82c9ca..142fab9 100644
--- a/android/variable.go
+++ b/android/variable.go
@@ -577,14 +577,6 @@
 	BoardAvbRollbackIndexLocation string `json:",omitempty"`
 }
 
-type ChainedAvbPartitionProps struct {
-	Partitions            []string `json:",omitempty"`
-	Key                   string   `json:",omitempty"`
-	Algorithm             string   `json:",omitempty"`
-	RollbackIndex         string   `json:",omitempty"`
-	RollbackIndexLocation string   `json:",omitempty"`
-}
-
 type PartitionVariables struct {
 	ProductDirectory            string `json:",omitempty"`
 	PartitionQualifiedVariables map[string]PartitionQualifiedVariablesType
@@ -609,12 +601,7 @@
 	ProductUseDynamicPartitionSize bool   `json:",omitempty"`
 	CopyImagesForTargetFilesZip    bool   `json:",omitempty"`
 
-	BoardAvbEnable          bool                                `json:",omitempty"`
-	BoardAvbAlgorithm       string                              `json:",omitempty"`
-	BoardAvbKeyPath         string                              `json:",omitempty"`
-	BoardAvbRollbackIndex   string                              `json:",omitempty"`
-	BuildingVbmetaImage     bool                                `json:",omitempty"`
-	ChainedVbmetaPartitions map[string]ChainedAvbPartitionProps `json:",omitempty"`
+	BoardAvbEnable bool `json:",omitempty"`
 
 	ProductPackages         []string `json:",omitempty"`
 	ProductPackagesDebug    []string `json:",omitempty"`
diff --git a/filesystem/android_device.go b/filesystem/android_device.go
index 2645dc4..9071272 100644
--- a/filesystem/android_device.go
+++ b/filesystem/android_device.go
@@ -34,8 +34,6 @@
 	Vendor_partition_name *string
 	// Name of the Odm partition filesystem module
 	Odm_partition_name *string
-	// The vbmeta partition and its "chained" partitions
-	Vbmeta_partitions []string
 }
 
 type androidDevice struct {
@@ -48,6 +46,7 @@
 	module := &androidDevice{}
 	module.AddProperties(&module.partitionProps)
 	android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon)
+
 	return module
 }
 
@@ -70,9 +69,6 @@
 	addDependencyIfDefined(a.partitionProps.Product_partition_name)
 	addDependencyIfDefined(a.partitionProps.Vendor_partition_name)
 	addDependencyIfDefined(a.partitionProps.Odm_partition_name)
-	for _, vbmetaPartition := range a.partitionProps.Vbmeta_partitions {
-		ctx.AddDependency(ctx.Module(), filesystemDepTag, vbmetaPartition)
-	}
 }
 
 func (a *androidDevice) GenerateAndroidBuildActions(ctx android.ModuleContext) {
diff --git a/filesystem/vbmeta.go b/filesystem/vbmeta.go
index 6a3fc1f..0bae479 100644
--- a/filesystem/vbmeta.go
+++ b/filesystem/vbmeta.go
@@ -25,19 +25,19 @@
 )
 
 func init() {
-	android.RegisterModuleType("vbmeta", VbmetaFactory)
+	android.RegisterModuleType("vbmeta", vbmetaFactory)
 }
 
 type vbmeta struct {
 	android.ModuleBase
 
-	properties VbmetaProperties
+	properties vbmetaProperties
 
 	output     android.OutputPath
 	installDir android.InstallPath
 }
 
-type VbmetaProperties struct {
+type vbmetaProperties struct {
 	// Name of the partition stored in vbmeta desc. Defaults to the name of this module.
 	Partition_name *string
 
@@ -50,8 +50,9 @@
 	// Algorithm that avbtool will use to sign this vbmeta image. Default is SHA256_RSA4096.
 	Algorithm *string
 
-	// The rollback index. If unspecified, the rollback index is from PLATFORM_SECURITY_PATCH
-	Rollback_index *int64
+	// File whose content will provide the rollback index. If unspecified, the rollback index
+	// is from PLATFORM_SECURITY_PATCH
+	Rollback_index_file *string `android:"path"`
 
 	// Rollback index location of this vbmeta image. Must be 0, 1, 2, etc. Default is 0.
 	Rollback_index_location *int64
@@ -61,7 +62,7 @@
 	Partitions proptools.Configurable[[]string]
 
 	// List of chained partitions that this vbmeta deletages the verification.
-	Chained_partitions []ChainedPartitionProperties
+	Chained_partitions []chainedPartitionProperties
 
 	// List of key-value pair of avb properties
 	Avb_properties []avbProperty
@@ -75,7 +76,7 @@
 	Value *string
 }
 
-type ChainedPartitionProperties struct {
+type chainedPartitionProperties struct {
 	// Name of the chained partition
 	Name *string
 
@@ -94,7 +95,7 @@
 }
 
 // vbmeta is the partition image that has the verification information for other partitions.
-func VbmetaFactory() android.Module {
+func vbmetaFactory() android.Module {
 	module := &vbmeta{}
 	module.AddProperties(&module.properties)
 	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
@@ -216,12 +217,15 @@
 
 // Returns the embedded shell command that prints the rollback index
 func (v *vbmeta) rollbackIndexCommand(ctx android.ModuleContext) string {
-	if v.properties.Rollback_index != nil {
-		return fmt.Sprintf("%d", *v.properties.Rollback_index)
+	var cmd string
+	if v.properties.Rollback_index_file != nil {
+		f := android.PathForModuleSrc(ctx, proptools.String(v.properties.Rollback_index_file))
+		cmd = "cat " + f.String()
 	} else {
-		// Take the first line and remove the newline char
-		return "$(date -d 'TZ=\"GMT\" " + ctx.Config().PlatformSecurityPatch() + "' +%s | head -1 | tr -d '\n'" + ")"
+		cmd = "date -d 'TZ=\"GMT\" " + ctx.Config().PlatformSecurityPatch() + "' +%s"
 	}
+	// Take the first line and remove the newline char
+	return "$(" + cmd + " | head -1 | tr -d '\n'" + ")"
 }
 
 // Extract public keys from chained_partitions.private_key. The keys are indexed with the partition
diff --git a/fsgen/Android.bp b/fsgen/Android.bp
index 8cd7518..690ad28 100644
--- a/fsgen/Android.bp
+++ b/fsgen/Android.bp
@@ -16,7 +16,6 @@
         "filesystem_creator.go",
         "fsgen_mutators.go",
         "prebuilt_etc_modules_gen.go",
-        "vbmeta_partitions.go",
     ],
     testSrcs: [
         "filesystem_creator_test.go",
diff --git a/fsgen/filesystem_creator.go b/fsgen/filesystem_creator.go
index b580ea9..bdffabf 100644
--- a/fsgen/filesystem_creator.go
+++ b/fsgen/filesystem_creator.go
@@ -44,9 +44,6 @@
 type filesystemCreatorProps struct {
 	Generated_partition_types   []string `blueprint:"mutated"`
 	Unsupported_partition_types []string `blueprint:"mutated"`
-
-	Vbmeta_module_names    []string `blueprint:"mutated"`
-	Vbmeta_partition_names []string `blueprint:"mutated"`
 }
 
 type filesystemCreator struct {
@@ -70,24 +67,16 @@
 }
 
 func (f *filesystemCreator) createInternalModules(ctx android.LoadHookContext) {
-	soongGeneratedPartitions := generatedPartitions(ctx)
-	finalSoongGeneratedPartitions := make([]string, 0, len(soongGeneratedPartitions))
-	for _, partitionType := range soongGeneratedPartitions {
+	soongGeneratedPartitions := &ctx.Config().Get(fsGenStateOnceKey).(*FsGenState).soongGeneratedPartitions
+	for _, partitionType := range *soongGeneratedPartitions {
 		if f.createPartition(ctx, partitionType) {
 			f.properties.Generated_partition_types = append(f.properties.Generated_partition_types, partitionType)
-			finalSoongGeneratedPartitions = append(finalSoongGeneratedPartitions, partitionType)
 		} else {
 			f.properties.Unsupported_partition_types = append(f.properties.Unsupported_partition_types, partitionType)
+			_, *soongGeneratedPartitions = android.RemoveFromList(partitionType, *soongGeneratedPartitions)
 		}
 	}
-
-	for _, x := range createVbmetaPartitions(ctx, finalSoongGeneratedPartitions) {
-		f.properties.Vbmeta_module_names = append(f.properties.Vbmeta_module_names, x.moduleName)
-		f.properties.Vbmeta_partition_names = append(f.properties.Vbmeta_partition_names, x.partitionName)
-	}
-
-	ctx.Config().Get(fsGenStateOnceKey).(*FsGenState).soongGeneratedPartitions = finalSoongGeneratedPartitions
-	f.createDeviceModule(ctx, finalSoongGeneratedPartitions, f.properties.Vbmeta_module_names)
+	f.createDeviceModule(ctx)
 }
 
 func generatedModuleName(cfg android.Config, suffix string) string {
@@ -102,11 +91,7 @@
 	return generatedModuleName(cfg, fmt.Sprintf("%s_image", partitionType))
 }
 
-func (f *filesystemCreator) createDeviceModule(
-	ctx android.LoadHookContext,
-	generatedPartitionTypes []string,
-	vbmetaPartitions []string,
-) {
+func (f *filesystemCreator) createDeviceModule(ctx android.LoadHookContext) {
 	baseProps := &struct {
 		Name *string
 	}{
@@ -115,22 +100,21 @@
 
 	// Currently, only the system and system_ext partition module is created.
 	partitionProps := &filesystem.PartitionNameProperties{}
-	if android.InList("system", generatedPartitionTypes) {
+	if android.InList("system", f.properties.Generated_partition_types) {
 		partitionProps.System_partition_name = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system"))
 	}
-	if android.InList("system_ext", generatedPartitionTypes) {
+	if android.InList("system_ext", f.properties.Generated_partition_types) {
 		partitionProps.System_ext_partition_name = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system_ext"))
 	}
-	if android.InList("vendor", generatedPartitionTypes) {
+	if android.InList("vendor", f.properties.Generated_partition_types) {
 		partitionProps.Vendor_partition_name = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "vendor"))
 	}
-	if android.InList("product", generatedPartitionTypes) {
+	if android.InList("product", f.properties.Generated_partition_types) {
 		partitionProps.Product_partition_name = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "product"))
 	}
-	if android.InList("odm", generatedPartitionTypes) {
+	if android.InList("odm", f.properties.Generated_partition_types) {
 		partitionProps.Odm_partition_name = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "odm"))
 	}
-	partitionProps.Vbmeta_partitions = vbmetaPartitions
 
 	ctx.CreateModule(filesystem.AndroidDeviceFactory, baseProps, partitionProps)
 }
@@ -350,15 +334,12 @@
 type filesystemBaseProperty struct {
 	Name             *string
 	Compile_multilib *string
-	Visibility       []string
 }
 
 func generateBaseProps(namePtr *string) *filesystemBaseProperty {
 	return &filesystemBaseProperty{
 		Name:             namePtr,
 		Compile_multilib: proptools.StringPtr("both"),
-		// The vbmeta modules are currently in the root directory and depend on the partitions
-		Visibility: []string{"//.", "//build/soong:__subpackages__"},
 	}
 }
 
@@ -454,42 +435,16 @@
 	return file
 }
 
-func createVbmetaDiff(ctx android.ModuleContext, vbmetaModuleName string, vbmetaPartitionName string) android.Path {
-	vbmetaModule := ctx.GetDirectDepWithTag(vbmetaModuleName, generatedVbmetaPartitionDepTag)
-	outputFilesProvider, ok := android.OtherModuleProvider(ctx, vbmetaModule, android.OutputFilesProvider)
-	if !ok {
-		ctx.ModuleErrorf("Expected module %s to provide OutputFiles", vbmetaModule)
-	}
-	if len(outputFilesProvider.DefaultOutputFiles) != 1 {
-		ctx.ModuleErrorf("Expected 1 output file from module %s", vbmetaModule)
-	}
-	soongVbMetaFile := outputFilesProvider.DefaultOutputFiles[0]
-	makeVbmetaFile := android.PathForArbitraryOutput(ctx, fmt.Sprintf("target/product/%s/%s.img", ctx.Config().DeviceName(), vbmetaPartitionName))
-
-	diffTestResultFile := android.PathForModuleOut(ctx, fmt.Sprintf("diff_test_%s.txt", vbmetaModuleName))
-	builder := android.NewRuleBuilder(pctx, ctx)
-	builder.Command().Text("diff").
-		Input(soongVbMetaFile).
-		Input(makeVbmetaFile)
-	builder.Command().Text("touch").Output(diffTestResultFile)
-	builder.Build(vbmetaModuleName+" diff test", vbmetaModuleName+" diff test")
-	return diffTestResultFile
-}
-
 type systemImageDepTagType struct {
 	blueprint.BaseDependencyTag
 }
 
 var generatedFilesystemDepTag systemImageDepTagType
-var generatedVbmetaPartitionDepTag systemImageDepTagType
 
 func (f *filesystemCreator) DepsMutator(ctx android.BottomUpMutatorContext) {
 	for _, partitionType := range f.properties.Generated_partition_types {
 		ctx.AddDependency(ctx.Module(), generatedFilesystemDepTag, generatedModuleNameForPartition(ctx.Config(), partitionType))
 	}
-	for _, vbmetaModule := range f.properties.Vbmeta_module_names {
-		ctx.AddDependency(ctx.Module(), generatedVbmetaPartitionDepTag, vbmetaModule)
-	}
 }
 
 func (f *filesystemCreator) GenerateAndroidBuildActions(ctx android.ModuleContext) {
@@ -519,11 +474,6 @@
 		diffTestFiles = append(diffTestFiles, diffTestFile)
 		ctx.Phony(fmt.Sprintf("soong_generated_%s_filesystem_test", partitionType), diffTestFile)
 	}
-	for i, vbmetaModule := range f.properties.Vbmeta_module_names {
-		diffTestFile := createVbmetaDiff(ctx, vbmetaModule, f.properties.Vbmeta_partition_names[i])
-		diffTestFiles = append(diffTestFiles, diffTestFile)
-		ctx.Phony(fmt.Sprintf("soong_generated_%s_filesystem_test", f.properties.Vbmeta_partition_names[i]), diffTestFile)
-	}
 	ctx.Phony("soong_generated_filesystem_tests", diffTestFiles...)
 }
 
diff --git a/fsgen/fsgen_mutators.go b/fsgen/fsgen_mutators.go
index 92ea128..f3aec00 100644
--- a/fsgen/fsgen_mutators.go
+++ b/fsgen/fsgen_mutators.go
@@ -145,6 +145,7 @@
 				},
 				"system_dlkm": {},
 			},
+			soongGeneratedPartitions:  generatedPartitions(ctx),
 			fsDepsMutex:               sync.Mutex{},
 			moduleToInstallationProps: map[string]installationProperties{},
 		}
diff --git a/fsgen/vbmeta_partitions.go b/fsgen/vbmeta_partitions.go
deleted file mode 100644
index f5b5f1c..0000000
--- a/fsgen/vbmeta_partitions.go
+++ /dev/null
@@ -1,174 +0,0 @@
-// 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 (
-	"android/soong/android"
-	"android/soong/filesystem"
-	"slices"
-	"strconv"
-
-	"github.com/google/blueprint/proptools"
-)
-
-type vbmetaModuleInfo struct {
-	// The name of the generated vbmeta module
-	moduleName string
-	// The name of the module that avb understands. This is the name passed to --chain_partition,
-	// and also the basename of the output file. (the output file is called partitionName + ".img")
-	partitionName string
-}
-
-// Creates the vbmeta partition and the chained vbmeta partitions. Returns the list of module names
-// that the function created. May return nil if the product isn't using avb.
-//
-// AVB is Android Verified Boot: https://source.android.com/docs/security/features/verifiedboot
-// It works by signing all the partitions, but then also including an extra metadata paritition
-// called vbmeta that depends on all the other signed partitions. This creates a requirement
-// that you update all those partitions and the vbmeta partition together, so in order to relax
-// that requirement products can set up "chained" vbmeta partitions, where a chained partition
-// like vbmeta_system might contain the avb metadata for just a few products. In cuttlefish
-// vbmeta_system contains metadata about product, system, and system_ext. Using chained partitions,
-// that group of partitions can be updated independently from the other signed partitions.
-func createVbmetaPartitions(ctx android.LoadHookContext, generatedPartitionTypes []string) []vbmetaModuleInfo {
-	partitionVars := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
-	// Some products seem to have BuildingVbmetaImage as true even when BoardAvbEnable is false
-	if !partitionVars.BuildingVbmetaImage || !partitionVars.BoardAvbEnable {
-		return nil
-	}
-
-	var result []vbmetaModuleInfo
-
-	var chainedPartitions []filesystem.ChainedPartitionProperties
-	var partitionTypesHandledByChainedPartitions []string
-	for chainedName, props := range partitionVars.ChainedVbmetaPartitions {
-		chainedName = "vbmeta_" + chainedName
-		if len(props.Partitions) == 0 {
-			continue
-		}
-		if len(props.Key) == 0 {
-			ctx.ModuleErrorf("No key found for chained avb partition %s", chainedName)
-			continue
-		}
-		if len(props.Algorithm) == 0 {
-			ctx.ModuleErrorf("No algorithm found for chained avb partition %s", chainedName)
-			continue
-		}
-		if len(props.RollbackIndex) == 0 {
-			ctx.ModuleErrorf("No rollback index found for chained avb partition %s", chainedName)
-			continue
-		}
-		ril, err := strconv.ParseInt(props.RollbackIndexLocation, 10, 32)
-		if err != nil {
-			ctx.ModuleErrorf("Rollback index location must be an int, got %s", props.RollbackIndexLocation)
-			continue
-		}
-		// The default is to use the PlatformSecurityPatch, and a lot of product config files
-		// just set it to the platform security patch, so detect that and don't set the property
-		// in soong.
-		var rollbackIndex *int64
-		if props.RollbackIndex != ctx.Config().PlatformSecurityPatch() {
-			i, err := strconv.ParseInt(props.RollbackIndex, 10, 32)
-			if err != nil {
-				ctx.ModuleErrorf("Rollback index must be an int, got %s", props.RollbackIndex)
-				continue
-			}
-			rollbackIndex = &i
-		}
-
-		var partitionModules []string
-		for _, partition := range props.Partitions {
-			partitionTypesHandledByChainedPartitions = append(partitionTypesHandledByChainedPartitions, partition)
-			if !slices.Contains(generatedPartitionTypes, partition) {
-				// The partition is probably unsupported.
-				continue
-			}
-			partitionModules = append(partitionModules, generatedModuleNameForPartition(ctx.Config(), partition))
-		}
-
-		name := generatedModuleName(ctx.Config(), chainedName)
-		ctx.CreateModuleInDirectory(
-			filesystem.VbmetaFactory,
-			".", // Create in the root directory for now so its easy to get the key
-			&filesystem.VbmetaProperties{
-				Partition_name:          proptools.StringPtr(chainedName),
-				Stem:                    proptools.StringPtr(chainedName + ".img"),
-				Private_key:             proptools.StringPtr(props.Key),
-				Algorithm:               &props.Algorithm,
-				Rollback_index:          rollbackIndex,
-				Rollback_index_location: &ril,
-				Partitions:              proptools.NewSimpleConfigurable(partitionModules),
-			}, &struct {
-				Name *string
-			}{
-				Name: &name,
-			},
-		).HideFromMake()
-
-		chainedPartitions = append(chainedPartitions, filesystem.ChainedPartitionProperties{
-			Name:                    &chainedName,
-			Rollback_index_location: &ril,
-			Private_key:             &props.Key,
-		})
-
-		result = append(result, vbmetaModuleInfo{
-			moduleName:    name,
-			partitionName: chainedName,
-		})
-	}
-
-	vbmetaModuleName := generatedModuleName(ctx.Config(), "vbmeta")
-
-	var algorithm *string
-	if len(partitionVars.BoardAvbAlgorithm) > 0 {
-		algorithm = proptools.StringPtr(partitionVars.BoardAvbAlgorithm)
-	}
-	ril, err := strconv.ParseInt(partitionVars.BoardAvbRollbackIndex, 10, 32)
-	if err != nil {
-		ctx.ModuleErrorf("Rollback index location must be an int, got %s", partitionVars.BoardAvbRollbackIndex)
-	}
-
-	var partitionModules []string
-	for _, partitionType := range generatedPartitionTypes {
-		if slices.Contains(partitionTypesHandledByChainedPartitions, partitionType) {
-			// Already handled by a chained vbmeta partition
-			continue
-		}
-		partitionModules = append(partitionModules, generatedModuleNameForPartition(ctx.Config(), partitionType))
-	}
-
-	ctx.CreateModuleInDirectory(
-		filesystem.VbmetaFactory,
-		".", // Create in the root directory for now so its easy to get the key
-		&filesystem.VbmetaProperties{
-			Stem:                    proptools.StringPtr("vbmeta.img"),
-			Algorithm:               algorithm,
-			Private_key:             proptools.StringPtr(partitionVars.BoardAvbKeyPath),
-			Rollback_index_location: &ril,
-			Chained_partitions:      chainedPartitions,
-			Partitions:              proptools.NewSimpleConfigurable(partitionModules),
-		}, &struct {
-			Name *string
-		}{
-			Name: &vbmetaModuleName,
-		},
-	).HideFromMake()
-
-	result = append(result, vbmetaModuleInfo{
-		moduleName:    vbmetaModuleName,
-		partitionName: "vbmeta",
-	})
-	return result
-}