Add props property to add_avb_hash_footer

It is used to provide name:value properties to the footer. Value can be
from a text in *.bp file or a binary file referenced via the `file`
prop. e.g.

```
avb_add_hash_footer {
	...
	props: [
		{
			name: "string_prop",
			value: "string_value",
		},
		{
			name: "binary_prop",
			file: "a_binary_file_name",
		},
	],
}
```

This CL also adds a test for the module type which has been missing.

Bug: 256148237
Test: m nothing
Change-Id: Idf55b308c8ce760387c01a847846b42d1aebe4ea
diff --git a/filesystem/avb_add_hash_footer.go b/filesystem/avb_add_hash_footer.go
index af3bdbe..1ee0edc 100644
--- a/filesystem/avb_add_hash_footer.go
+++ b/filesystem/avb_add_hash_footer.go
@@ -23,10 +23,6 @@
 	"android/soong/android"
 )
 
-func init() {
-	android.RegisterModuleType("avb_add_hash_footer", avbAddHashFooterFactory)
-}
-
 type avbAddHashFooter struct {
 	android.ModuleBase
 
@@ -36,6 +32,17 @@
 	installDir android.InstallPath
 }
 
+type avbProp struct {
+	// Name of a property
+	Name *string
+
+	// Value of a property. Can't be used together with `file`.
+	Value *string
+
+	// File from which the value of the prop is read from. Can't be used together with `value`.
+	File *string `android:"path,arch_variant"`
+}
+
 type avbAddHashFooterProperties struct {
 	// Source file of this image. Can reference a genrule type module with the ":module" syntax.
 	Src *string `android:"path,arch_variant"`
@@ -57,6 +64,9 @@
 
 	// The salt in hex. Required for reproducible builds.
 	Salt *string
+
+	// List of properties to add to the footer
+	Props []avbProp
 }
 
 // The AVB footer adds verification information to the image.
@@ -106,6 +116,10 @@
 	}
 	cmd.FlagWithArg("--salt ", proptools.String(a.properties.Salt))
 
+	for _, prop := range a.properties.Props {
+		addAvbProp(ctx, cmd, prop)
+	}
+
 	cmd.FlagWithOutput("--image ", a.output)
 
 	builder.Build("avbAddHashFooter", fmt.Sprintf("avbAddHashFooter %s", ctx.ModuleName()))
@@ -114,6 +128,32 @@
 	ctx.InstallFile(a.installDir, a.installFileName(), a.output)
 }
 
+func addAvbProp(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, prop avbProp) {
+	name := proptools.String(prop.Name)
+	value := proptools.String(prop.Value)
+	file := proptools.String(prop.File)
+	if name == "" {
+		ctx.PropertyErrorf("name", "can't be empty")
+		return
+	}
+	if value == "" && file == "" {
+		ctx.PropertyErrorf("value", "either value or file should be set")
+		return
+	}
+	if value != "" && file != "" {
+		ctx.PropertyErrorf("value", "value and file can't be set at the same time")
+		return
+	}
+
+	if value != "" {
+		cmd.FlagWithArg("--prop ", proptools.ShellEscape(fmt.Sprintf("%s:%s", name, value)))
+	} else {
+		p := android.PathForModuleSrc(ctx, file)
+		cmd.Input(p)
+		cmd.FlagWithArg("--prop_from_file ", proptools.ShellEscape(fmt.Sprintf("%s:%s", name, cmd.PathForInput(p))))
+	}
+}
+
 var _ android.AndroidMkEntriesProvider = (*avbAddHashFooter)(nil)
 
 // Implements android.AndroidMkEntriesProvider