Revert "Convert cc modules to use AndroidMkInfoProvider."

This reverts commit 5640008749795a6ebfb2680e28daa6b067207ce8.

Reason for revert: Droidmonitor created revert due to b/374130363. Will be verifying through ABTD before submission.

Change-Id: Iced10a8b71766826465966e9370cdd5e347e7b79
diff --git a/cc/androidmk.go b/cc/androidmk.go
index 920b58b..6966f76 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -36,7 +36,7 @@
 type AndroidMkContext interface {
 	BaseModuleName() string
 	Target() android.Target
-	subAndroidMk(android.Config, *android.AndroidMkInfo, interface{})
+	subAndroidMk(*android.AndroidMkEntries, interface{})
 	Arch() android.Arch
 	Os() android.OsType
 	Host() bool
@@ -48,120 +48,112 @@
 	InRecovery() bool
 	NotInPlatform() bool
 	InVendorOrProduct() bool
-	ArchSpecific() bool
 }
 
-type subAndroidMkProviderInfoProducer interface {
-	prepareAndroidMKProviderInfo(android.Config, AndroidMkContext, *android.AndroidMkInfo)
+type subAndroidMkProvider interface {
+	AndroidMkEntries(AndroidMkContext, *android.AndroidMkEntries)
 }
 
-type subAndroidMkFooterInfoProducer interface {
-	prepareAndroidMKFooterInfo(android.Config, AndroidMkContext, *android.AndroidMkInfo)
-}
-
-func (c *Module) subAndroidMk(config android.Config, entries *android.AndroidMkInfo, obj interface{}) {
+func (c *Module) subAndroidMk(entries *android.AndroidMkEntries, obj interface{}) {
 	if c.subAndroidMkOnce == nil {
-		c.subAndroidMkOnce = make(map[subAndroidMkProviderInfoProducer]bool)
+		c.subAndroidMkOnce = make(map[subAndroidMkProvider]bool)
 	}
-	if androidmk, ok := obj.(subAndroidMkProviderInfoProducer); ok {
+	if androidmk, ok := obj.(subAndroidMkProvider); ok {
 		if !c.subAndroidMkOnce[androidmk] {
 			c.subAndroidMkOnce[androidmk] = true
-			androidmk.prepareAndroidMKProviderInfo(config, c, entries)
+			androidmk.AndroidMkEntries(c, entries)
 		}
 	}
 }
 
-var _ android.AndroidMkProviderInfoProducer = (*Module)(nil)
-
-func (c *Module) PrepareAndroidMKProviderInfo(config android.Config) *android.AndroidMkProviderInfo {
+func (c *Module) AndroidMkEntries() []android.AndroidMkEntries {
 	if c.hideApexVariantFromMake || c.Properties.HideFromMake {
-		return &android.AndroidMkProviderInfo{
-			PrimaryInfo: android.AndroidMkInfo{
-				Disabled: true,
-			},
-		}
+		return []android.AndroidMkEntries{{
+			Disabled: true,
+		}}
 	}
 
-	providerData := android.AndroidMkProviderInfo{
-		PrimaryInfo: android.AndroidMkInfo{
-			OutputFile:   c.outputFile,
-			Required:     c.Properties.AndroidMkRuntimeLibs,
-			OverrideName: c.BaseModuleName(),
-			Include:      "$(BUILD_SYSTEM)/soong_cc_rust_prebuilt.mk",
-			EntryMap:     make(map[string][]string),
+	entries := android.AndroidMkEntries{
+		OutputFile: c.outputFile,
+		// TODO(jiyong): add the APEXes providing shared libs to the required
+		// modules Currently, adding c.Properties.ApexesProvidingSharedLibs is
+		// causing multiple ART APEXes (com.android.art and com.android.art.debug)
+		// to be installed. And this is breaking some older devices (like marlin)
+		// where system.img is small.
+		Required:     c.Properties.AndroidMkRuntimeLibs,
+		OverrideName: c.BaseModuleName(),
+		Include:      "$(BUILD_SYSTEM)/soong_cc_rust_prebuilt.mk",
+
+		ExtraEntries: []android.AndroidMkExtraEntriesFunc{
+			func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+				if len(c.Properties.Logtags) > 0 {
+					entries.AddStrings("LOCAL_SOONG_LOGTAGS_FILES", c.logtagsPaths.Strings()...)
+				}
+				// Note: Pass the exact value of AndroidMkSystemSharedLibs to the Make
+				// world, even if it is an empty list. In the Make world,
+				// LOCAL_SYSTEM_SHARED_LIBRARIES defaults to "none", which is expanded
+				// to the default list of system shared libs by the build system.
+				// Soong computes the exact list of system shared libs, so we have to
+				// override the default value when the list of libs is actually empty.
+				entries.SetString("LOCAL_SYSTEM_SHARED_LIBRARIES", strings.Join(c.Properties.AndroidMkSystemSharedLibs, " "))
+				if len(c.Properties.AndroidMkSharedLibs) > 0 {
+					entries.AddStrings("LOCAL_SHARED_LIBRARIES", c.Properties.AndroidMkSharedLibs...)
+				}
+				if len(c.Properties.AndroidMkRuntimeLibs) > 0 {
+					entries.AddStrings("LOCAL_RUNTIME_LIBRARIES", c.Properties.AndroidMkRuntimeLibs...)
+				}
+				entries.SetString("LOCAL_SOONG_LINK_TYPE", c.makeLinkType)
+				if c.InVendor() {
+					entries.SetBool("LOCAL_IN_VENDOR", true)
+				} else if c.InProduct() {
+					entries.SetBool("LOCAL_IN_PRODUCT", true)
+				}
+				if c.Properties.SdkAndPlatformVariantVisibleToMake {
+					// Add the unsuffixed name to SOONG_SDK_VARIANT_MODULES so that Make can rewrite
+					// dependencies to the .sdk suffix when building a module that uses the SDK.
+					entries.SetString("SOONG_SDK_VARIANT_MODULES",
+						"$(SOONG_SDK_VARIANT_MODULES) $(patsubst %.sdk,%,$(LOCAL_MODULE))")
+				}
+				entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", c.IsSkipInstall())
+			},
+		},
+		ExtraFooters: []android.AndroidMkExtraFootersFunc{
+			func(w io.Writer, name, prefix, moduleDir string) {
+				if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake &&
+					c.CcLibraryInterface() && c.Shared() {
+					// Using the SDK variant as a JNI library needs a copy of the .so that
+					// is not named .sdk.so so that it can be packaged into the APK with
+					// the right name.
+					fmt.Fprintln(w, "$(eval $(call copy-one-file,",
+						"$(LOCAL_BUILT_MODULE),",
+						"$(patsubst %.sdk.so,%.so,$(LOCAL_BUILT_MODULE))))")
+				}
+			},
 		},
 	}
 
-	entries := &providerData.PrimaryInfo
-	if len(c.Properties.Logtags) > 0 {
-		entries.AddStrings("LOCAL_SOONG_LOGTAGS_FILES", c.logtagsPaths.Strings()...)
-	}
-	// Note: Pass the exact value of AndroidMkSystemSharedLibs to the Make
-	// world, even if it is an empty list. In the Make world,
-	// LOCAL_SYSTEM_SHARED_LIBRARIES defaults to "none", which is expanded
-	// to the default list of system shared libs by the build system.
-	// Soong computes the exact list of system shared libs, so we have to
-	// override the default value when the list of libs is actually empty.
-	entries.SetString("LOCAL_SYSTEM_SHARED_LIBRARIES", strings.Join(c.Properties.AndroidMkSystemSharedLibs, " "))
-	if len(c.Properties.AndroidMkSharedLibs) > 0 {
-		entries.AddStrings("LOCAL_SHARED_LIBRARIES", c.Properties.AndroidMkSharedLibs...)
-	}
-	if len(c.Properties.AndroidMkRuntimeLibs) > 0 {
-		entries.AddStrings("LOCAL_RUNTIME_LIBRARIES", c.Properties.AndroidMkRuntimeLibs...)
-	}
-	entries.SetString("LOCAL_SOONG_LINK_TYPE", c.makeLinkType)
-	if c.InVendor() {
-		entries.SetBool("LOCAL_IN_VENDOR", true)
-	} else if c.InProduct() {
-		entries.SetBool("LOCAL_IN_PRODUCT", true)
-	}
-	if c.Properties.SdkAndPlatformVariantVisibleToMake {
-		// Add the unsuffixed name to SOONG_SDK_VARIANT_MODULES so that Make can rewrite
-		// dependencies to the .sdk suffix when building a module that uses the SDK.
-		entries.SetString("SOONG_SDK_VARIANT_MODULES",
-			"$(SOONG_SDK_VARIANT_MODULES) $(patsubst %.sdk,%,$(LOCAL_MODULE))")
-	}
-	entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", c.IsSkipInstall())
-
 	for _, feature := range c.features {
-		c.subAndroidMk(config, entries, feature)
+		c.subAndroidMk(&entries, feature)
 	}
 
-	c.subAndroidMk(config, entries, c.compiler)
-	c.subAndroidMk(config, entries, c.linker)
+	c.subAndroidMk(&entries, c.compiler)
+	c.subAndroidMk(&entries, c.linker)
 	if c.sanitize != nil {
-		c.subAndroidMk(config, entries, c.sanitize)
+		c.subAndroidMk(&entries, c.sanitize)
 	}
-	c.subAndroidMk(config, entries, c.installer)
+	c.subAndroidMk(&entries, c.installer)
 
 	entries.SubName += c.Properties.SubName
 
-	if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake &&
-		c.CcLibraryInterface() && c.Shared() {
-		// Using the SDK variant as a JNI library needs a copy of the .so that
-		// is not named .sdk.so so that it can be packaged into the APK with
-		// the right name.
-		entries.FooterStrings = []string{
-			fmt.Sprintf("%s %s %s", "$(eval $(call copy-one-file,",
-				"$(LOCAL_BUILT_MODULE),",
-				"$(patsubst %.sdk.so,%.so,$(LOCAL_BUILT_MODULE))))")}
-	}
-
-	for _, obj := range []interface{}{c.compiler, c.linker, c.sanitize, c.installer} {
-		if obj == nil {
-			continue
-		}
-		if p, ok := obj.(subAndroidMkFooterInfoProducer); ok {
-			p.prepareAndroidMKFooterInfo(config, c, entries)
-		}
-	}
-
-	return &providerData
+	return []android.AndroidMkEntries{entries}
 }
 
-func androidMkWriteExtraTestConfigs(extraTestConfigs android.Paths, entries *android.AndroidMkInfo) {
+func androidMkWriteExtraTestConfigs(extraTestConfigs android.Paths, entries *android.AndroidMkEntries) {
 	if len(extraTestConfigs) > 0 {
-		entries.AddStrings("LOCAL_EXTRA_FULL_TEST_CONFIGS", extraTestConfigs.Strings()...)
+		entries.ExtraEntries = append(entries.ExtraEntries,
+			func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+				entries.AddStrings("LOCAL_EXTRA_FULL_TEST_CONFIGS", extraTestConfigs.Strings()...)
+			})
 	}
 }
 
@@ -177,7 +169,7 @@
 	return overrides
 }
 
-func (library *libraryDecorator) androidMkWriteExportedFlags(entries *android.AndroidMkInfo) {
+func (library *libraryDecorator) androidMkWriteExportedFlags(entries *android.AndroidMkEntries) {
 	var exportedFlags []string
 	var includeDirs android.Paths
 	var systemIncludeDirs android.Paths
@@ -208,7 +200,7 @@
 	}
 }
 
-func (library *libraryDecorator) androidMkEntriesWriteAdditionalDependenciesForSourceAbiDiff(entries *android.AndroidMkInfo) {
+func (library *libraryDecorator) androidMkEntriesWriteAdditionalDependenciesForSourceAbiDiff(entries *android.AndroidMkEntries) {
 	if !library.static() {
 		entries.AddPaths("LOCAL_ADDITIONAL_DEPENDENCIES", library.sAbiDiff)
 	}
@@ -221,21 +213,23 @@
 	}
 }
 
-func (library *libraryDecorator) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
+func (library *libraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
 	if library.static() {
 		entries.Class = "STATIC_LIBRARIES"
 	} else if library.shared() {
 		entries.Class = "SHARED_LIBRARIES"
-		entries.SetString("LOCAL_SOONG_TOC", library.toc().String())
-		if !library.buildStubs() && library.unstrippedOutputFile != nil {
-			entries.SetString("LOCAL_SOONG_UNSTRIPPED_BINARY", library.unstrippedOutputFile.String())
-		}
-		if len(library.Properties.Overrides) > 0 {
-			entries.SetString("LOCAL_OVERRIDES_MODULES", strings.Join(makeOverrideModuleNames(ctx, library.Properties.Overrides), " "))
-		}
-		if len(library.postInstallCmds) > 0 {
-			entries.SetString("LOCAL_POST_INSTALL_CMD", strings.Join(library.postInstallCmds, "&& "))
-		}
+		entries.ExtraEntries = append(entries.ExtraEntries, func(_ android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+			entries.SetString("LOCAL_SOONG_TOC", library.toc().String())
+			if !library.buildStubs() && library.unstrippedOutputFile != nil {
+				entries.SetString("LOCAL_SOONG_UNSTRIPPED_BINARY", library.unstrippedOutputFile.String())
+			}
+			if len(library.Properties.Overrides) > 0 {
+				entries.SetString("LOCAL_OVERRIDES_MODULES", strings.Join(makeOverrideModuleNames(ctx, library.Properties.Overrides), " "))
+			}
+			if len(library.postInstallCmds) > 0 {
+				entries.SetString("LOCAL_POST_INSTALL_CMD", strings.Join(library.postInstallCmds, "&& "))
+			}
+		})
 	} else if library.header() {
 		entries.Class = "HEADER_LIBRARIES"
 	}
@@ -244,30 +238,34 @@
 		entries.DistFiles = android.MakeDefaultDistFiles(library.distFile)
 	}
 
-	library.androidMkWriteExportedFlags(entries)
-	library.androidMkEntriesWriteAdditionalDependenciesForSourceAbiDiff(entries)
+	entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+		library.androidMkWriteExportedFlags(entries)
+		library.androidMkEntriesWriteAdditionalDependenciesForSourceAbiDiff(entries)
 
-	if entries.OutputFile.Valid() {
-		_, _, ext := android.SplitFileExt(entries.OutputFile.Path().Base())
-		entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext)
-	}
+		if entries.OutputFile.Valid() {
+			_, _, ext := android.SplitFileExt(entries.OutputFile.Path().Base())
+			entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext)
+		}
 
-	if library.coverageOutputFile.Valid() {
-		entries.SetString("LOCAL_PREBUILT_COVERAGE_ARCHIVE", library.coverageOutputFile.String())
-	}
+		if library.coverageOutputFile.Valid() {
+			entries.SetString("LOCAL_PREBUILT_COVERAGE_ARCHIVE", library.coverageOutputFile.String())
+		}
+	})
 
 	if library.shared() && !library.buildStubs() {
-		ctx.subAndroidMk(config, entries, library.baseInstaller)
+		ctx.subAndroidMk(entries, library.baseInstaller)
 	} else {
 		if library.buildStubs() && library.stubsVersion() != "" {
 			entries.SubName = "." + library.stubsVersion()
 		}
-		// library.makeUninstallable() depends on this to bypass HideFromMake() for
-		// static libraries.
-		entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
-		if library.buildStubs() {
-			entries.SetBool("LOCAL_NO_NOTICE_FILE", true)
-		}
+		entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+			// library.makeUninstallable() depends on this to bypass HideFromMake() for
+			// static libraries.
+			entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
+			if library.buildStubs() {
+				entries.SetBool("LOCAL_NO_NOTICE_FILE", true)
+			}
+		})
 	}
 	// If a library providing a stub is included in an APEX, the private APIs of the library
 	// is accessible only inside the APEX. From outside of the APEX, clients can only use the
@@ -286,136 +284,124 @@
 	}
 }
 
-func (object *objectLinker) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
+func (object *objectLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
 	entries.Class = "STATIC_LIBRARIES"
+	entries.ExtraFooters = append(entries.ExtraFooters,
+		func(w io.Writer, name, prefix, moduleDir string) {
+			out := entries.OutputFile.Path()
+			varname := fmt.Sprintf("SOONG_%sOBJECT_%s%s", prefix, name, entries.SubName)
+
+			fmt.Fprintf(w, "\n%s := %s\n", varname, out.String())
+			fmt.Fprintln(w, ".KATI_READONLY: "+varname)
+		})
 }
 
-func (object *objectLinker) prepareAndroidMKFooterInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
-	out := entries.OutputFile.Path()
-	name := ctx.BaseModuleName()
-	if entries.OverrideName != "" {
-		name = entries.OverrideName
-	}
-
-	prefix := ""
-	if ctx.ArchSpecific() {
-		switch ctx.Os().Class {
-		case android.Host:
-			if ctx.Target().HostCross {
-				prefix = "HOST_CROSS_"
-			} else {
-				prefix = "HOST_"
-			}
-		case android.Device:
-			prefix = "TARGET_"
-
+func (test *testDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
+	entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+		if len(test.InstallerProperties.Test_suites) > 0 {
+			entries.AddCompatibilityTestSuites(test.InstallerProperties.Test_suites...)
 		}
-
-		if ctx.Arch().ArchType != config.Targets[ctx.Os()][0].Arch.ArchType {
-			prefix = "2ND_" + prefix
-		}
-	}
-
-	varname := fmt.Sprintf("SOONG_%sOBJECT_%s%s", prefix, name, entries.SubName)
-
-	entries.FooterStrings = append(entries.FooterStrings,
-		fmt.Sprintf("\n%s := %s\n.KATI_READONLY: %s", varname, out.String(), varname))
+	})
 }
 
-func (test *testDecorator) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
-	if len(test.InstallerProperties.Test_suites) > 0 {
-		entries.AddCompatibilityTestSuites(test.InstallerProperties.Test_suites...)
-	}
-}
-
-func (binary *binaryDecorator) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
-	ctx.subAndroidMk(config, entries, binary.baseInstaller)
+func (binary *binaryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
+	ctx.subAndroidMk(entries, binary.baseInstaller)
 
 	entries.Class = "EXECUTABLES"
 	entries.DistFiles = binary.distFiles
-	entries.SetString("LOCAL_SOONG_UNSTRIPPED_BINARY", binary.unstrippedOutputFile.String())
-	if len(binary.symlinks) > 0 {
-		entries.AddStrings("LOCAL_MODULE_SYMLINKS", binary.symlinks...)
-	}
+	entries.ExtraEntries = append(entries.ExtraEntries, func(_ android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+		entries.SetString("LOCAL_SOONG_UNSTRIPPED_BINARY", binary.unstrippedOutputFile.String())
+		if len(binary.symlinks) > 0 {
+			entries.AddStrings("LOCAL_MODULE_SYMLINKS", binary.symlinks...)
+		}
 
-	if binary.coverageOutputFile.Valid() {
-		entries.SetString("LOCAL_PREBUILT_COVERAGE_ARCHIVE", binary.coverageOutputFile.String())
-	}
+		if binary.coverageOutputFile.Valid() {
+			entries.SetString("LOCAL_PREBUILT_COVERAGE_ARCHIVE", binary.coverageOutputFile.String())
+		}
 
-	if len(binary.Properties.Overrides) > 0 {
-		entries.SetString("LOCAL_OVERRIDES_MODULES", strings.Join(makeOverrideModuleNames(ctx, binary.Properties.Overrides), " "))
-	}
-	if len(binary.postInstallCmds) > 0 {
-		entries.SetString("LOCAL_POST_INSTALL_CMD", strings.Join(binary.postInstallCmds, "&& "))
-	}
+		if len(binary.Properties.Overrides) > 0 {
+			entries.SetString("LOCAL_OVERRIDES_MODULES", strings.Join(makeOverrideModuleNames(ctx, binary.Properties.Overrides), " "))
+		}
+		if len(binary.postInstallCmds) > 0 {
+			entries.SetString("LOCAL_POST_INSTALL_CMD", strings.Join(binary.postInstallCmds, "&& "))
+		}
+	})
 }
 
-func (benchmark *benchmarkDecorator) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
-	ctx.subAndroidMk(config, entries, benchmark.binaryDecorator)
+func (benchmark *benchmarkDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
+	ctx.subAndroidMk(entries, benchmark.binaryDecorator)
 	entries.Class = "NATIVE_TESTS"
-	if len(benchmark.Properties.Test_suites) > 0 {
-		entries.AddCompatibilityTestSuites(benchmark.Properties.Test_suites...)
-	}
-	if benchmark.testConfig != nil {
-		entries.SetString("LOCAL_FULL_TEST_CONFIG", benchmark.testConfig.String())
-	}
-	entries.SetBool("LOCAL_NATIVE_BENCHMARK", true)
-	if !BoolDefault(benchmark.Properties.Auto_gen_config, true) {
-		entries.SetBool("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", true)
-	}
+	entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+		if len(benchmark.Properties.Test_suites) > 0 {
+			entries.AddCompatibilityTestSuites(benchmark.Properties.Test_suites...)
+		}
+		if benchmark.testConfig != nil {
+			entries.SetString("LOCAL_FULL_TEST_CONFIG", benchmark.testConfig.String())
+		}
+		entries.SetBool("LOCAL_NATIVE_BENCHMARK", true)
+		if !BoolDefault(benchmark.Properties.Auto_gen_config, true) {
+			entries.SetBool("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", true)
+		}
+	})
 }
 
-func (test *testBinary) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
-	ctx.subAndroidMk(config, entries, test.binaryDecorator)
-	ctx.subAndroidMk(config, entries, test.testDecorator)
+func (test *testBinary) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
+	ctx.subAndroidMk(entries, test.binaryDecorator)
+	ctx.subAndroidMk(entries, test.testDecorator)
 
 	entries.Class = "NATIVE_TESTS"
-	if test.testConfig != nil {
-		entries.SetString("LOCAL_FULL_TEST_CONFIG", test.testConfig.String())
-	}
-	if !BoolDefault(test.Properties.Auto_gen_config, true) {
-		entries.SetBool("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", true)
-	}
-	entries.AddStrings("LOCAL_TEST_MAINLINE_MODULES", test.Properties.Test_mainline_modules...)
+	entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+		if test.testConfig != nil {
+			entries.SetString("LOCAL_FULL_TEST_CONFIG", test.testConfig.String())
+		}
+		if !BoolDefault(test.Properties.Auto_gen_config, true) {
+			entries.SetBool("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", true)
+		}
+		entries.AddStrings("LOCAL_TEST_MAINLINE_MODULES", test.Properties.Test_mainline_modules...)
 
-	entries.SetBoolIfTrue("LOCAL_COMPATIBILITY_PER_TESTCASE_DIRECTORY", Bool(test.Properties.Per_testcase_directory))
-	if len(test.Properties.Data_bins) > 0 {
-		entries.AddStrings("LOCAL_TEST_DATA_BINS", test.Properties.Data_bins...)
-	}
+		entries.SetBoolIfTrue("LOCAL_COMPATIBILITY_PER_TESTCASE_DIRECTORY", Bool(test.Properties.Per_testcase_directory))
+		if len(test.Properties.Data_bins) > 0 {
+			entries.AddStrings("LOCAL_TEST_DATA_BINS", test.Properties.Data_bins...)
+		}
 
-	test.Properties.Test_options.CommonTestOptions.SetAndroidMkInfoEntries(entries)
+		test.Properties.Test_options.CommonTestOptions.SetAndroidMkEntries(entries)
+	})
 
 	androidMkWriteExtraTestConfigs(test.extraTestConfigs, entries)
 }
 
-func (fuzz *fuzzBinary) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
-	ctx.subAndroidMk(config, entries, fuzz.binaryDecorator)
+func (fuzz *fuzzBinary) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
+	ctx.subAndroidMk(entries, fuzz.binaryDecorator)
 
-	entries.SetBool("LOCAL_IS_FUZZ_TARGET", true)
-	if fuzz.installedSharedDeps != nil {
-		// TOOD: move to install dep
-		entries.AddStrings("LOCAL_FUZZ_INSTALLED_SHARED_DEPS", fuzz.installedSharedDeps...)
-	}
+	entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+		entries.SetBool("LOCAL_IS_FUZZ_TARGET", true)
+		if fuzz.installedSharedDeps != nil {
+			// TOOD: move to install dep
+			entries.AddStrings("LOCAL_FUZZ_INSTALLED_SHARED_DEPS", fuzz.installedSharedDeps...)
+		}
+	})
 }
 
-func (test *testLibrary) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
-	ctx.subAndroidMk(config, entries, test.libraryDecorator)
-	ctx.subAndroidMk(config, entries, test.testDecorator)
+func (test *testLibrary) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
+	ctx.subAndroidMk(entries, test.libraryDecorator)
+	ctx.subAndroidMk(entries, test.testDecorator)
 }
 
-func (installer *baseInstaller) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
+func (installer *baseInstaller) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
 	if installer.path == (android.InstallPath{}) {
 		return
 	}
 
-	path, file := filepath.Split(installer.path.String())
-	stem, suffix, _ := android.SplitFileExt(file)
-	entries.SetString("LOCAL_MODULE_SUFFIX", suffix)
-	entries.SetString("LOCAL_MODULE_PATH", path)
-	entries.SetString("LOCAL_MODULE_STEM", stem)
+	entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+		path, file := filepath.Split(installer.path.String())
+		stem, suffix, _ := android.SplitFileExt(file)
+		entries.SetString("LOCAL_MODULE_SUFFIX", suffix)
+		entries.SetString("LOCAL_MODULE_PATH", path)
+		entries.SetString("LOCAL_MODULE_STEM", stem)
+	})
 }
 
-func (c *stubDecorator) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
+func (c *stubDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
 	entries.SubName = ndkLibrarySuffix + "." + c.apiLevel.String()
 	entries.Class = "SHARED_LIBRARIES"
 
@@ -424,75 +410,85 @@
 		return
 	}
 
-	path, file := filepath.Split(c.installPath.String())
-	stem, suffix, _ := android.SplitFileExt(file)
-	entries.SetString("LOCAL_MODULE_SUFFIX", suffix)
-	entries.SetString("LOCAL_MODULE_PATH", path)
-	entries.SetString("LOCAL_MODULE_STEM", stem)
-	entries.SetBool("LOCAL_NO_NOTICE_FILE", true)
-	if c.parsedCoverageXmlPath.String() != "" {
-		entries.SetString("SOONG_NDK_API_XML", "$(SOONG_NDK_API_XML) "+c.parsedCoverageXmlPath.String())
-	}
-	entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true) // Stubs should not be installed
+	entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+		path, file := filepath.Split(c.installPath.String())
+		stem, suffix, _ := android.SplitFileExt(file)
+		entries.SetString("LOCAL_MODULE_SUFFIX", suffix)
+		entries.SetString("LOCAL_MODULE_PATH", path)
+		entries.SetString("LOCAL_MODULE_STEM", stem)
+		entries.SetBool("LOCAL_NO_NOTICE_FILE", true)
+		if c.parsedCoverageXmlPath.String() != "" {
+			entries.SetString("SOONG_NDK_API_XML", "$(SOONG_NDK_API_XML) "+c.parsedCoverageXmlPath.String())
+		}
+		entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true) // Stubs should not be installed
+	})
 }
 
-func (c *vndkPrebuiltLibraryDecorator) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
+func (c *vndkPrebuiltLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
 	entries.Class = "SHARED_LIBRARIES"
 
 	entries.SubName = c.androidMkSuffix
 
-	c.libraryDecorator.androidMkWriteExportedFlags(entries)
+	entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+		c.libraryDecorator.androidMkWriteExportedFlags(entries)
 
-	// Specifying stem is to pass check_elf_files when vendor modules link against vndk prebuilt.
-	// We can't use install path because VNDKs are not installed. Instead, Srcs is directly used.
-	_, file := filepath.Split(c.properties.Srcs[0])
-	stem, suffix, ext := android.SplitFileExt(file)
-	entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext)
-	entries.SetString("LOCAL_MODULE_SUFFIX", suffix)
-	entries.SetString("LOCAL_MODULE_STEM", stem)
+		// Specifying stem is to pass check_elf_files when vendor modules link against vndk prebuilt.
+		// We can't use install path because VNDKs are not installed. Instead, Srcs is directly used.
+		_, file := filepath.Split(c.properties.Srcs[0])
+		stem, suffix, ext := android.SplitFileExt(file)
+		entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext)
+		entries.SetString("LOCAL_MODULE_SUFFIX", suffix)
+		entries.SetString("LOCAL_MODULE_STEM", stem)
 
-	if c.tocFile.Valid() {
-		entries.SetString("LOCAL_SOONG_TOC", c.tocFile.String())
-	}
+		if c.tocFile.Valid() {
+			entries.SetString("LOCAL_SOONG_TOC", c.tocFile.String())
+		}
 
-	// VNDK libraries available to vendor are not installed because
-	// they are packaged in VNDK APEX and installed by APEX packages (apex/apex.go)
-	entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
+		// VNDK libraries available to vendor are not installed because
+		// they are packaged in VNDK APEX and installed by APEX packages (apex/apex.go)
+		entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
+	})
 }
 
-func (p *prebuiltLinker) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
-	if p.properties.Check_elf_files != nil {
-		entries.SetBool("LOCAL_CHECK_ELF_FILES", *p.properties.Check_elf_files)
-	} else {
-		// soong_cc_rust_prebuilt.mk does not include check_elf_file.mk by default
-		// because cc_library_shared and cc_binary use soong_cc_rust_prebuilt.mk as well.
-		// In order to turn on prebuilt ABI checker, set `LOCAL_CHECK_ELF_FILES` to
-		// true if `p.properties.Check_elf_files` is not specified.
-		entries.SetBool("LOCAL_CHECK_ELF_FILES", true)
-	}
+func (p *prebuiltLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
+	entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+		if p.properties.Check_elf_files != nil {
+			entries.SetBool("LOCAL_CHECK_ELF_FILES", *p.properties.Check_elf_files)
+		} else {
+			// soong_cc_rust_prebuilt.mk does not include check_elf_file.mk by default
+			// because cc_library_shared and cc_binary use soong_cc_rust_prebuilt.mk as well.
+			// In order to turn on prebuilt ABI checker, set `LOCAL_CHECK_ELF_FILES` to
+			// true if `p.properties.Check_elf_files` is not specified.
+			entries.SetBool("LOCAL_CHECK_ELF_FILES", true)
+		}
+	})
 }
 
-func (p *prebuiltLibraryLinker) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
-	ctx.subAndroidMk(config, entries, p.libraryDecorator)
+func (p *prebuiltLibraryLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
+	ctx.subAndroidMk(entries, p.libraryDecorator)
 	if p.shared() {
-		ctx.subAndroidMk(config, entries, &p.prebuiltLinker)
+		ctx.subAndroidMk(entries, &p.prebuiltLinker)
 		androidMkWritePrebuiltOptions(p.baseLinker, entries)
 	}
 }
 
-func (p *prebuiltBinaryLinker) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
-	ctx.subAndroidMk(config, entries, p.binaryDecorator)
-	ctx.subAndroidMk(config, entries, &p.prebuiltLinker)
+func (p *prebuiltBinaryLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
+	ctx.subAndroidMk(entries, p.binaryDecorator)
+	ctx.subAndroidMk(entries, &p.prebuiltLinker)
 	androidMkWritePrebuiltOptions(p.baseLinker, entries)
 }
 
-func androidMkWritePrebuiltOptions(linker *baseLinker, entries *android.AndroidMkInfo) {
+func androidMkWritePrebuiltOptions(linker *baseLinker, entries *android.AndroidMkEntries) {
 	allow := linker.Properties.Allow_undefined_symbols
 	if allow != nil {
-		entries.SetBool("LOCAL_ALLOW_UNDEFINED_SYMBOLS", *allow)
+		entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+			entries.SetBool("LOCAL_ALLOW_UNDEFINED_SYMBOLS", *allow)
+		})
 	}
 	ignore := linker.Properties.Ignore_max_page_size
 	if ignore != nil {
-		entries.SetBool("LOCAL_IGNORE_MAX_PAGE_SIZE", *ignore)
+		entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+			entries.SetBool("LOCAL_IGNORE_MAX_PAGE_SIZE", *ignore)
+		})
 	}
 }
diff --git a/cc/cc.go b/cc/cc.go
index 9aff7df..1b7624d 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -878,7 +878,7 @@
 
 	cachedToolchain config.Toolchain
 
-	subAndroidMkOnce map[subAndroidMkProviderInfoProducer]bool
+	subAndroidMkOnce map[subAndroidMkProvider]bool
 
 	// Flags used to compile this module
 	flags Flags
diff --git a/cc/cc_test.go b/cc/cc_test.go
index 8b930e9..3f3347b 100644
--- a/cc/cc_test.go
+++ b/cc/cc_test.go
@@ -381,7 +381,7 @@
 	if !strings.HasSuffix(outputPath, "/main_test") {
 		t.Errorf("expected test output file to be 'main_test', but was '%s'", outputPath)
 	}
-	entries := android.AndroidMkInfoForTest(t, ctx, module).PrimaryInfo
+	entries := android.AndroidMkEntriesForTest(t, ctx, module)[0]
 	if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][0], ":test_lib.so:foo/bar/baz") {
 		t.Errorf("expected LOCAL_TEST_DATA to end with `:test_lib.so:foo/bar/baz`,"+
 			" but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][0])
@@ -409,7 +409,7 @@
 	ctx := prepareForCcTest.RunTestWithBp(t, bp).TestContext
 	module := ctx.ModuleForTests("main_test", "android_arm_armv7-a-neon").Module()
 
-	entries := android.AndroidMkInfoForTest(t, ctx, module).PrimaryInfo
+	entries := android.AndroidMkEntriesForTest(t, ctx, module)[0]
 	compatEntries := entries.EntryMap["LOCAL_COMPATIBILITY_SUITE"]
 	if len(compatEntries) != 2 {
 		t.Errorf("expected two elements in LOCAL_COMPATIBILITY_SUITE. got %d", len(compatEntries))
@@ -441,7 +441,7 @@
 	ctx := prepareForCcTest.RunTestWithBp(t, bp).TestContext
 	module := ctx.ModuleForTests("main_test_lib", "android_arm_armv7-a-neon_shared").Module()
 
-	entries := android.AndroidMkInfoForTest(t, ctx, module).PrimaryInfo
+	entries := android.AndroidMkEntriesForTest(t, ctx, module)[0]
 	compatEntries := entries.EntryMap["LOCAL_COMPATIBILITY_SUITE"]
 	if len(compatEntries) != 2 {
 		t.Errorf("expected two elements in LOCAL_COMPATIBILITY_SUITE. got %d", len(compatEntries))
@@ -1430,7 +1430,7 @@
 	if !strings.HasSuffix(outputPath, "/main_test") {
 		t.Errorf("expected test output file to be 'main_test', but was '%s'", outputPath)
 	}
-	entries := android.AndroidMkInfoForTest(t, ctx, module).PrimaryInfo
+	entries := android.AndroidMkEntriesForTest(t, ctx, module)[0]
 	if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][0], ":test_lib.so:foo/bar/baz") {
 		t.Errorf("expected LOCAL_TEST_DATA to end with `:test_lib.so:foo/bar/baz`,"+
 			" but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][0])
diff --git a/cc/library_headers_test.go b/cc/library_headers_test.go
index 5a45767..1924b2f 100644
--- a/cc/library_headers_test.go
+++ b/cc/library_headers_test.go
@@ -46,7 +46,7 @@
 
 			// Test that there's a valid AndroidMk entry.
 			headers := ctx.ModuleForTests("headers", "android_arm64_armv8-a").Module()
-			e := android.AndroidMkInfoForTest(t, ctx, headers).PrimaryInfo
+			e := android.AndroidMkEntriesForTest(t, ctx, headers)[0]
 
 			// This duplicates the tests done in AndroidMkEntries.write. It would be
 			// better to test its output, but there are no test functions that capture that.
diff --git a/cc/prebuilt_test.go b/cc/prebuilt_test.go
index 3214fb4..acbbabc 100644
--- a/cc/prebuilt_test.go
+++ b/cc/prebuilt_test.go
@@ -50,7 +50,6 @@
 		cc_prebuilt_library_shared {
 			name: "liba",
 			srcs: ["liba.so"],
-			prefer: true,
 		}
 
 		cc_library {
@@ -60,7 +59,6 @@
 		cc_prebuilt_library_static {
 			name: "libb",
 			srcs: ["libb.a"],
-			prefer: true,
 		}
 
 		cc_library_shared {
@@ -171,9 +169,9 @@
 		t.Errorf("crtx missing dependency on prebuilt_crtx")
 	}
 
-	entries := android.AndroidMkInfoForTest(t, ctx, prebuiltLiba).PrimaryInfo
+	entries := android.AndroidMkEntriesForTest(t, ctx, prebuiltLiba)[0]
 	android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "cc_prebuilt_library_shared", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
-	entries = android.AndroidMkInfoForTest(t, ctx, prebuiltLibb).PrimaryInfo
+	entries = android.AndroidMkEntriesForTest(t, ctx, prebuiltLibb)[0]
 	android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "cc_prebuilt_library_static", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
 }
 
@@ -488,7 +486,7 @@
 		expectedDependency := ctx.ModuleForTests(tc.expectedDependencyName, "android_arm64_armv8-a_shared").Module()
 		android.AssertBoolEquals(t, fmt.Sprintf("expected dependency from %s to %s\n", libfoo.Name(), tc.expectedDependencyName), true, hasDep(ctx, libfoo, expectedDependency))
 		// check that LOCAL_SHARED_LIBRARIES contains libbar and not libbar.v<N>
-		entries := android.AndroidMkInfoForTest(t, ctx, libfoo).PrimaryInfo
+		entries := android.AndroidMkEntriesForTest(t, ctx, libfoo)[0]
 		android.AssertStringListContains(t, "Version should not be present in LOCAL_SHARED_LIBRARIES", entries.EntryMap["LOCAL_SHARED_LIBRARIES"], "libbar")
 
 		// check installation rules
@@ -498,7 +496,7 @@
 
 		// check LOCAL_MODULE of the selected module name
 		// the prebuilt should have the same LOCAL_MODULE when exported to make
-		entries = android.AndroidMkInfoForTest(t, ctx, libbar).PrimaryInfo
+		entries = android.AndroidMkEntriesForTest(t, ctx, libbar)[0]
 		android.AssertStringEquals(t, "unexpected LOCAL_MODULE", "libbar", entries.EntryMap["LOCAL_MODULE"][0])
 	}
 }
diff --git a/cc/sanitize.go b/cc/sanitize.go
index 18851d1..498ef7c 100644
--- a/cc/sanitize.go
+++ b/cc/sanitize.go
@@ -992,7 +992,7 @@
 	return flags
 }
 
-func (s *sanitize) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) {
+func (s *sanitize) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
 	// Add a suffix for cfi/hwasan/scs-enabled static/header libraries to allow surfacing
 	// both the sanitized and non-sanitized variants to make without a name conflict.
 	if entries.Class == "STATIC_LIBRARIES" || entries.Class == "HEADER_LIBRARIES" {
@@ -1905,13 +1905,11 @@
 	ctx.SetOutputFiles(android.Paths{txt.outputFile}, "")
 }
 
-func (txt *sanitizerLibrariesTxtModule) PrepareAndroidMKProviderInfo(config android.Config) *android.AndroidMkProviderInfo {
-	return &android.AndroidMkProviderInfo{
-		PrimaryInfo: android.AndroidMkInfo{
-			Class:      "ETC",
-			OutputFile: android.OptionalPathForPath(txt.outputFile),
-		},
-	}
+func (txt *sanitizerLibrariesTxtModule) AndroidMkEntries() []android.AndroidMkEntries {
+	return []android.AndroidMkEntries{{
+		Class:      "ETC",
+		OutputFile: android.OptionalPathForPath(txt.outputFile),
+	}}
 }
 
 // PrebuiltEtcModule interface