Refactor factories

Change module factories from returning a blueprint.Module and a list
of property structs to returning an android.Module, which holds the
list of property structs.

Test: build.ninja identical except for Factory: comment lines
Change-Id: Ica1d823f009db812c518f271a386fbff39c9766f
diff --git a/android/arch.go b/android/arch.go
index effd5a6..67ce30e 100644
--- a/android/arch.go
+++ b/android/arch.go
@@ -20,7 +20,6 @@
 	"runtime"
 	"strings"
 
-	"github.com/google/blueprint"
 	"github.com/google/blueprint/proptools"
 )
 
@@ -491,13 +490,11 @@
 
 var archPropTypeMap OncePer
 
-func InitArchModule(m Module,
-	propertyStructs ...interface{}) (blueprint.Module, []interface{}) {
+func InitArchModule(m Module) {
 
 	base := m.base()
 
-	base.generalProperties = append(base.generalProperties,
-		propertyStructs...)
+	base.generalProperties = m.GetProperties()
 
 	for _, properties := range base.generalProperties {
 		propertiesValue := reflect.ValueOf(properties)
@@ -524,17 +521,13 @@
 		}
 	}
 
-	var allProperties []interface{}
-	allProperties = append(allProperties, base.generalProperties...)
 	for _, asp := range base.archProperties {
 		if asp != nil {
-			allProperties = append(allProperties, asp)
+			m.AddProperties(asp)
 		}
 	}
 
-	base.customizableProperties = allProperties
-
-	return m, allProperties
+	base.customizableProperties = m.GetProperties()
 }
 
 var variantReplacer = strings.NewReplacer("-", "_", ".", "_")
diff --git a/android/defaults.go b/android/defaults.go
index df1409e..0776405 100644
--- a/android/defaults.go
+++ b/android/defaults.go
@@ -50,14 +50,11 @@
 
 var _ Defaultable = (*DefaultableModule)(nil)
 
-func InitDefaultableModule(module Module, d Defaultable,
-	props ...interface{}) (blueprint.Module, []interface{}) {
+func InitDefaultableModule(module Module, d Defaultable) {
 
-	d.setProperties(props)
+	d.setProperties(module.GetProperties())
 
-	props = append(props, d.defaults())
-
-	return module, props
+	module.AddProperties(d.defaults())
 }
 
 type DefaultsModule struct {
@@ -79,21 +76,18 @@
 	return d.defaultableProperties
 }
 
-func InitDefaultsModule(module Module, d Defaults, props ...interface{}) (blueprint.Module, []interface{}) {
-	props = append(props,
+func InitDefaultsModule(module Module, d Defaults) {
+	module.AddProperties(
 		&hostAndDeviceProperties{},
 		&commonProperties{},
 		&variableProperties{})
 
-	_, props = InitArchModule(module, props...)
+	InitArchModule(module)
+	InitDefaultableModule(module, d)
 
-	_, props = InitDefaultableModule(module, d, props...)
-
-	props = append(props, &module.base().nameProperties)
+	module.AddProperties(&module.base().nameProperties)
 
 	module.base().module = module
-
-	return module, props
 }
 
 var _ Defaults = (*DefaultsModule)(nil)
diff --git a/android/module.go b/android/module.go
index 8f8f34b..18810fb 100644
--- a/android/module.go
+++ b/android/module.go
@@ -108,6 +108,9 @@
 	InstallInData() bool
 	InstallInSanitizerDir() bool
 	SkipInstall()
+
+	AddProperties(props ...interface{})
+	GetProperties() []interface{}
 }
 
 type nameProperties struct {
@@ -194,24 +197,18 @@
 	NeitherHostNorDeviceSupported
 )
 
-func InitAndroidModule(m Module,
-	propertyStructs ...interface{}) (blueprint.Module, []interface{}) {
-
+func InitAndroidModule(m Module) {
 	base := m.base()
 	base.module = m
 
-	propertyStructs = append(propertyStructs,
+	m.AddProperties(
 		&base.nameProperties,
 		&base.commonProperties,
 		&base.variableProperties)
-
-	return m, propertyStructs
 }
 
-func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib,
-	propertyStructs ...interface{}) (blueprint.Module, []interface{}) {
-
-	_, propertyStructs = InitAndroidModule(m, propertyStructs...)
+func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
+	InitAndroidModule(m)
 
 	base := m.base()
 	base.commonProperties.HostOrDeviceSupported = hod
@@ -225,10 +222,10 @@
 		base.hostAndDeviceProperties.Device_supported = boolPtr(true)
 		fallthrough
 	case HostAndDeviceDefault:
-		propertyStructs = append(propertyStructs, &base.hostAndDeviceProperties)
+		m.AddProperties(&base.hostAndDeviceProperties)
 	}
 
-	return InitArchModule(m, propertyStructs...)
+	InitArchModule(m)
 }
 
 // A ModuleBase object contains the properties that are common to all Android
@@ -250,7 +247,6 @@
 //
 //     import (
 //         "android/soong/android"
-//         "github.com/google/blueprint"
 //     )
 //
 //     type myModule struct {
@@ -260,9 +256,11 @@
 //         }
 //     }
 //
-//     func NewMyModule() (blueprint.Module, []interface{}) {
+//     func NewMyModule() android.Module) {
 //         m := &myModule{}
-//         return android.InitAndroidModule(m, &m.properties)
+//         m.AddProperties(&m.properties)
+//         android.InitAndroidModule(m)
+//         return m
 //     }
 //
 //     func (m *myModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
@@ -274,6 +272,7 @@
 type ModuleBase struct {
 	// Putting the curiously recurring thing pointing to the thing that contains
 	// the thing pattern to good use.
+	// TODO: remove this
 	module Module
 
 	nameProperties          nameProperties
@@ -295,6 +294,16 @@
 	blueprintDir     string
 
 	hooks hooks
+
+	registerProps []interface{}
+}
+
+func (a *ModuleBase) AddProperties(props ...interface{}) {
+	a.registerProps = append(a.registerProps, props...)
+}
+
+func (a *ModuleBase) GetProperties() []interface{} {
+	return a.registerProps
 }
 
 // Name returns the name of the module.  It may be overridden by individual module types, for
diff --git a/android/prebuilt_test.go b/android/prebuilt_test.go
index d09518b..5fa2032 100644
--- a/android/prebuilt_test.go
+++ b/android/prebuilt_test.go
@@ -123,8 +123,8 @@
 	for _, test := range prebuiltsTests {
 		t.Run(test.name, func(t *testing.T) {
 			ctx := NewContext()
-			ctx.RegisterModuleType("prebuilt", newPrebuiltModule)
-			ctx.RegisterModuleType("source", newSourceModule)
+			ctx.RegisterModuleType("prebuilt", ModuleFactoryAdaptor(newPrebuiltModule))
+			ctx.RegisterModuleType("source", ModuleFactoryAdaptor(newSourceModule))
 			ctx.MockFileSystem(map[string][]byte{
 				"Blueprints": []byte(`
 					source {
@@ -183,9 +183,11 @@
 	prebuilt Prebuilt
 }
 
-func newPrebuiltModule() (blueprint.Module, []interface{}) {
+func newPrebuiltModule() Module {
 	m := &prebuiltModule{}
-	return InitAndroidModule(m, &m.prebuilt.Properties)
+	m.AddProperties(&m.prebuilt.Properties)
+	InitAndroidModule(m)
+	return m
 }
 
 func (p *prebuiltModule) Name() string {
@@ -210,9 +212,11 @@
 	dependsOnSourceModule, dependsOnPrebuiltModule bool
 }
 
-func newSourceModule() (blueprint.Module, []interface{}) {
+func newSourceModule() Module {
 	m := &sourceModule{}
-	return InitAndroidModule(m, &m.properties)
+	m.AddProperties(&m.properties)
+	InitAndroidModule(m)
+	return m
 }
 
 func (s *sourceModule) DepsMutator(ctx BottomUpMutatorContext) {
diff --git a/android/register.go b/android/register.go
index 9396664..76a1cc9 100644
--- a/android/register.go
+++ b/android/register.go
@@ -41,8 +41,19 @@
 
 var mutators []*mutator
 
-func RegisterModuleType(name string, factory blueprint.ModuleFactory) {
-	moduleTypes = append(moduleTypes, moduleType{name, factory})
+type ModuleFactory func() Module
+
+// ModuleFactoryAdapter Wraps a ModuleFactory into a blueprint.ModuleFactory by converting an Module
+// into a blueprint.Module and a list of property structs
+func ModuleFactoryAdaptor(factory ModuleFactory) blueprint.ModuleFactory {
+	return func() (blueprint.Module, []interface{}) {
+		module := factory()
+		return module, module.GetProperties()
+	}
+}
+
+func RegisterModuleType(name string, factory ModuleFactory) {
+	moduleTypes = append(moduleTypes, moduleType{name, ModuleFactoryAdaptor(factory)})
 }
 
 func RegisterSingletonType(name string, factory blueprint.SingletonFactory) {
diff --git a/cc/binary.go b/cc/binary.go
index e982329..f6e62b7 100644
--- a/cc/binary.go
+++ b/cc/binary.go
@@ -17,7 +17,6 @@
 import (
 	"path/filepath"
 
-	"github.com/google/blueprint"
 	"github.com/google/blueprint/proptools"
 
 	"android/soong/android"
@@ -55,13 +54,13 @@
 }
 
 // Module factory for binaries
-func binaryFactory() (blueprint.Module, []interface{}) {
+func binaryFactory() android.Module {
 	module, _ := NewBinary(android.HostAndDeviceSupported)
 	return module.Init()
 }
 
 // Module factory for host binaries
-func binaryHostFactory() (blueprint.Module, []interface{}) {
+func binaryHostFactory() android.Module {
 	module, _ := NewBinary(android.HostSupported)
 	return module.Init()
 }
diff --git a/cc/cc.go b/cc/cc.go
index 867b196..a3f4c1d 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -304,36 +304,38 @@
 	flags Flags
 }
 
-func (c *Module) Init() (blueprint.Module, []interface{}) {
-	props := []interface{}{&c.Properties, &c.unused}
+func (c *Module) Init() android.Module {
+	c.AddProperties(&c.Properties, &c.unused)
 	if c.compiler != nil {
-		props = append(props, c.compiler.compilerProps()...)
+		c.AddProperties(c.compiler.compilerProps()...)
 	}
 	if c.linker != nil {
-		props = append(props, c.linker.linkerProps()...)
+		c.AddProperties(c.linker.linkerProps()...)
 	}
 	if c.installer != nil {
-		props = append(props, c.installer.installerProps()...)
+		c.AddProperties(c.installer.installerProps()...)
 	}
 	if c.stl != nil {
-		props = append(props, c.stl.props()...)
+		c.AddProperties(c.stl.props()...)
 	}
 	if c.sanitize != nil {
-		props = append(props, c.sanitize.props()...)
+		c.AddProperties(c.sanitize.props()...)
 	}
 	if c.coverage != nil {
-		props = append(props, c.coverage.props()...)
+		c.AddProperties(c.coverage.props()...)
 	}
 	if c.sabi != nil {
-		props = append(props, c.sabi.props()...)
+		c.AddProperties(c.sabi.props()...)
 	}
 	for _, feature := range c.features {
-		props = append(props, feature.props()...)
+		c.AddProperties(feature.props()...)
 	}
 
-	_, props = android.InitAndroidArchModule(c, c.hod, c.multilib, props...)
+	android.InitAndroidArchModule(c, c.hod, c.multilib)
 
-	return android.InitDefaultableModule(c, c, props...)
+	android.InitDefaultableModule(c, c)
+
+	return c
 }
 
 // Returns true for dependency roots (binaries)
@@ -1108,14 +1110,15 @@
 func (d *Defaults) DepsMutator(ctx android.BottomUpMutatorContext) {
 }
 
-func defaultsFactory() (blueprint.Module, []interface{}) {
+func defaultsFactory() android.Module {
 	return DefaultsFactory()
 }
 
-func DefaultsFactory(props ...interface{}) (blueprint.Module, []interface{}) {
+func DefaultsFactory(props ...interface{}) android.Module {
 	module := &Defaults{}
 
-	props = append(props,
+	module.AddProperties(props...)
+	module.AddProperties(
 		&BaseProperties{},
 		&BaseCompilerProperties{},
 		&BaseLinkerProperties{},
@@ -1134,7 +1137,9 @@
 		&SAbiProperties{},
 	)
 
-	return android.InitDefaultsModule(module, module, props...)
+	android.InitDefaultsModule(module, module)
+
+	return module
 }
 
 const (
diff --git a/cc/coverage.go b/cc/coverage.go
index b1c8783..0b4188f 100644
--- a/cc/coverage.go
+++ b/cc/coverage.go
@@ -16,6 +16,7 @@
 
 import (
 	"android/soong/android"
+
 	"github.com/google/blueprint"
 )
 
diff --git a/cc/library.go b/cc/library.go
index 0164221..c7c1142 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -108,41 +108,41 @@
 
 // Module factory for combined static + shared libraries, device by default but with possible host
 // support
-func libraryFactory() (blueprint.Module, []interface{}) {
+func libraryFactory() android.Module {
 	module, _ := NewLibrary(android.HostAndDeviceSupported)
 	return module.Init()
 }
 
 // Module factory for static libraries
-func libraryStaticFactory() (blueprint.Module, []interface{}) {
+func libraryStaticFactory() android.Module {
 	module, library := NewLibrary(android.HostAndDeviceSupported)
 	library.BuildOnlyStatic()
 	return module.Init()
 }
 
 // Module factory for shared libraries
-func librarySharedFactory() (blueprint.Module, []interface{}) {
+func librarySharedFactory() android.Module {
 	module, library := NewLibrary(android.HostAndDeviceSupported)
 	library.BuildOnlyShared()
 	return module.Init()
 }
 
 // Module factory for host static libraries
-func libraryHostStaticFactory() (blueprint.Module, []interface{}) {
+func libraryHostStaticFactory() android.Module {
 	module, library := NewLibrary(android.HostSupported)
 	library.BuildOnlyStatic()
 	return module.Init()
 }
 
 // Module factory for host shared libraries
-func libraryHostSharedFactory() (blueprint.Module, []interface{}) {
+func libraryHostSharedFactory() android.Module {
 	module, library := NewLibrary(android.HostSupported)
 	library.BuildOnlyShared()
 	return module.Init()
 }
 
 // Module factory for header-only libraries
-func libraryHeaderFactory() (blueprint.Module, []interface{}) {
+func libraryHeaderFactory() android.Module {
 	module, library := NewLibrary(android.HostAndDeviceSupported)
 	library.HeaderOnly()
 	return module.Init()
diff --git a/cc/llndk_library.go b/cc/llndk_library.go
index cde1bc7..66ffc9f 100644
--- a/cc/llndk_library.go
+++ b/cc/llndk_library.go
@@ -18,8 +18,6 @@
 	"path/filepath"
 	"strings"
 
-	"github.com/google/blueprint"
-
 	"android/soong/android"
 )
 
@@ -136,7 +134,7 @@
 	return stub.libraryDecorator.link(ctx, flags, deps, objs)
 }
 
-func newLLndkStubLibrary() (*Module, []interface{}) {
+func newLLndkStubLibrary() *Module {
 	module, library := NewLibrary(android.DeviceSupported)
 	library.BuildOnlyShared()
 	module.stl = nil
@@ -150,13 +148,18 @@
 	module.linker = stub
 	module.installer = nil
 
-	return module, []interface{}{&stub.Properties, &library.MutatedProperties, &library.flagExporter.Properties}
+	module.AddProperties(
+		&stub.Properties,
+		&library.MutatedProperties,
+		&library.flagExporter.Properties)
+
+	return module
 }
 
-func llndkLibraryFactory() (blueprint.Module, []interface{}) {
-	module, properties := newLLndkStubLibrary()
-	return android.InitAndroidArchModule(module, android.DeviceSupported,
-		android.MultilibBoth, properties...)
+func llndkLibraryFactory() android.Module {
+	module := newLLndkStubLibrary()
+	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibBoth)
+	return module
 }
 
 func init() {
diff --git a/cc/ndk_headers.go b/cc/ndk_headers.go
index 516f6e2..5fa3232 100644
--- a/cc/ndk_headers.go
+++ b/cc/ndk_headers.go
@@ -137,9 +137,11 @@
 	}
 }
 
-func ndkHeadersFactory() (blueprint.Module, []interface{}) {
+func ndkHeadersFactory() android.Module {
 	module := &headerModule{}
-	return android.InitAndroidModule(module, &module.properties)
+	module.AddProperties(&module.properties)
+	android.InitAndroidModule(module)
+	return module
 }
 
 type preprocessedHeaderProperies struct {
@@ -251,12 +253,16 @@
 	return timestampFile
 }
 
-func preprocessedNdkHeadersFactory() (blueprint.Module, []interface{}) {
+func preprocessedNdkHeadersFactory() android.Module {
 	module := &preprocessedHeaderModule{}
+
+	module.AddProperties(&module.properties)
+
 	// Host module rather than device module because device module install steps
 	// do not get run when embedded in make. We're not any of the existing
 	// module types that can be exposed via the Android.mk exporter, so just use
 	// a host module.
-	return android.InitAndroidArchModule(module, android.HostSupportedNoCross,
-		android.MultilibFirst, &module.properties)
+	android.InitAndroidArchModule(module, android.HostSupportedNoCross, android.MultilibFirst)
+
+	return module
 }
diff --git a/cc/ndk_library.go b/cc/ndk_library.go
index d801775..5765aa9 100644
--- a/cc/ndk_library.go
+++ b/cc/ndk_library.go
@@ -335,7 +335,7 @@
 	stub.installPath = ctx.InstallFile(installDir, path).String()
 }
 
-func newStubLibrary() (*Module, []interface{}) {
+func newStubLibrary() *Module {
 	module, library := NewLibrary(android.DeviceSupported)
 	library.BuildOnlyShared()
 	module.stl = nil
@@ -349,11 +349,13 @@
 	module.linker = stub
 	module.installer = stub
 
-	return module, []interface{}{&stub.properties, &library.MutatedProperties}
+	module.AddProperties(&stub.properties, &library.MutatedProperties)
+
+	return module
 }
 
-func ndkLibraryFactory() (blueprint.Module, []interface{}) {
-	module, properties := newStubLibrary()
-	return android.InitAndroidArchModule(module, android.DeviceSupported,
-		android.MultilibBoth, properties...)
+func ndkLibraryFactory() android.Module {
+	module := newStubLibrary()
+	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibBoth)
+	return module
 }
diff --git a/cc/ndk_prebuilt.go b/cc/ndk_prebuilt.go
index 15a9d28..13424e3 100644
--- a/cc/ndk_prebuilt.go
+++ b/cc/ndk_prebuilt.go
@@ -18,8 +18,6 @@
 	"fmt"
 	"strings"
 
-	"github.com/google/blueprint"
-
 	"android/soong/android"
 	"android/soong/cc/config"
 )
@@ -67,7 +65,7 @@
 	return deps
 }
 
-func ndkPrebuiltObjectFactory() (blueprint.Module, []interface{}) {
+func ndkPrebuiltObjectFactory() android.Module {
 	module := newBaseModule(android.DeviceSupported, android.MultilibBoth)
 	module.linker = &ndkPrebuiltObjectLinker{
 		objectLinker: objectLinker{
@@ -101,7 +99,7 @@
 	return deps
 }
 
-func ndkPrebuiltLibraryFactory() (blueprint.Module, []interface{}) {
+func ndkPrebuiltLibraryFactory() android.Module {
 	module, library := NewLibrary(android.DeviceSupported)
 	library.BuildOnlyShared()
 	linker := &ndkPrebuiltLibraryLinker{
@@ -132,7 +130,7 @@
 	ndkPrebuiltLibraryLinker
 }
 
-func ndkPrebuiltSharedStlFactory() (blueprint.Module, []interface{}) {
+func ndkPrebuiltSharedStlFactory() android.Module {
 	module, library := NewLibrary(android.DeviceSupported)
 	library.BuildOnlyShared()
 	linker := &ndkPrebuiltStlLinker{
@@ -147,7 +145,7 @@
 	return module.Init()
 }
 
-func ndkPrebuiltStaticStlFactory() (blueprint.Module, []interface{}) {
+func ndkPrebuiltStaticStlFactory() android.Module {
 	module, library := NewLibrary(android.DeviceSupported)
 	library.BuildOnlyStatic()
 	linker := &ndkPrebuiltStlLinker{
diff --git a/cc/object.go b/cc/object.go
index eaddd89..1478908 100644
--- a/cc/object.go
+++ b/cc/object.go
@@ -17,8 +17,6 @@
 import (
 	"fmt"
 
-	"github.com/google/blueprint"
-
 	"android/soong/android"
 )
 
@@ -35,7 +33,7 @@
 	Properties ObjectLinkerProperties
 }
 
-func objectFactory() (blueprint.Module, []interface{}) {
+func objectFactory() android.Module {
 	module := newBaseModule(android.HostAndDeviceSupported, android.MultilibBoth)
 	module.linker = &objectLinker{
 		baseLinker: NewBaseLinker(),
diff --git a/cc/prebuilt.go b/cc/prebuilt.go
index d064a46..ac05df0 100644
--- a/cc/prebuilt.go
+++ b/cc/prebuilt.go
@@ -16,8 +16,6 @@
 
 import (
 	"android/soong/android"
-
-	"github.com/google/blueprint"
 )
 
 func init() {
@@ -65,7 +63,7 @@
 	return nil
 }
 
-func prebuiltSharedLibraryFactory() (blueprint.Module, []interface{}) {
+func prebuiltSharedLibraryFactory() android.Module {
 	module, _ := NewPrebuiltSharedLibrary(android.HostAndDeviceSupported)
 	return module.Init()
 }
@@ -83,7 +81,7 @@
 	return module, library
 }
 
-func prebuiltStaticLibraryFactory() (blueprint.Module, []interface{}) {
+func prebuiltStaticLibraryFactory() android.Module {
 	module, _ := NewPrebuiltStaticLibrary(android.HostAndDeviceSupported)
 	return module.Init()
 }
@@ -124,7 +122,7 @@
 	return nil
 }
 
-func prebuiltBinaryFactory() (blueprint.Module, []interface{}) {
+func prebuiltBinaryFactory() android.Module {
 	module, _ := NewPrebuiltBinary(android.HostAndDeviceSupported)
 	return module.Init()
 }
diff --git a/cc/sabi.go b/cc/sabi.go
index 92fc7cf..9aff738 100644
--- a/cc/sabi.go
+++ b/cc/sabi.go
@@ -17,9 +17,9 @@
 import (
 	"strings"
 
-	"android/soong/android"
 	"github.com/google/blueprint"
 
+	"android/soong/android"
 	"android/soong/cc/config"
 )
 
diff --git a/cc/test.go b/cc/test.go
index 448f089..ea05ba5 100644
--- a/cc/test.go
+++ b/cc/test.go
@@ -20,8 +20,6 @@
 	"strings"
 
 	"android/soong/android"
-
-	"github.com/google/blueprint"
 )
 
 type TestProperties struct {
@@ -57,31 +55,31 @@
 }
 
 // Module factory for tests
-func testFactory() (blueprint.Module, []interface{}) {
+func testFactory() android.Module {
 	module := NewTest(android.HostAndDeviceSupported)
 	return module.Init()
 }
 
 // Module factory for test libraries
-func testLibraryFactory() (blueprint.Module, []interface{}) {
+func testLibraryFactory() android.Module {
 	module := NewTestLibrary(android.HostAndDeviceSupported)
 	return module.Init()
 }
 
 // Module factory for benchmarks
-func benchmarkFactory() (blueprint.Module, []interface{}) {
+func benchmarkFactory() android.Module {
 	module := NewBenchmark(android.HostAndDeviceSupported)
 	return module.Init()
 }
 
 // Module factory for host tests
-func testHostFactory() (blueprint.Module, []interface{}) {
+func testHostFactory() android.Module {
 	module := NewTest(android.HostSupported)
 	return module.Init()
 }
 
 // Module factory for host benchmarks
-func benchmarkHostFactory() (blueprint.Module, []interface{}) {
+func benchmarkHostFactory() android.Module {
 	module := NewBenchmark(android.HostSupported)
 	return module.Init()
 }
diff --git a/cc/test_data_test.go b/cc/test_data_test.go
index 9b5a85a..a798919 100644
--- a/cc/test_data_test.go
+++ b/cc/test_data_test.go
@@ -131,8 +131,10 @@
 				"dir/baz":        nil,
 				"dir/bar/baz":    nil,
 			})
-			ctx.RegisterModuleType("filegroup", genrule.FileGroupFactory)
-			ctx.RegisterModuleType("test", newTest)
+			ctx.RegisterModuleType("filegroup",
+				android.ModuleFactoryAdaptor(genrule.FileGroupFactory))
+			ctx.RegisterModuleType("test",
+				android.ModuleFactoryAdaptor(newTest))
 
 			_, errs := ctx.ParseBlueprintsFiles("Blueprints")
 			fail(t, errs)
@@ -175,9 +177,11 @@
 	}
 }
 
-func newTest() (blueprint.Module, []interface{}) {
+func newTest() android.Module {
 	m := &testDataTest{}
-	return android.InitAndroidModule(m, &m.Properties)
+	m.AddProperties(&m.Properties)
+	android.InitAndroidModule(m)
+	return m
 }
 
 func (test *testDataTest) DepsMutator(ctx android.BottomUpMutatorContext) {
diff --git a/cc/toolchain_library.go b/cc/toolchain_library.go
index 1bbe774..9b83f18 100644
--- a/cc/toolchain_library.go
+++ b/cc/toolchain_library.go
@@ -15,7 +15,6 @@
 package cc
 
 import (
-	"github.com/google/blueprint"
 	"github.com/google/blueprint/proptools"
 
 	"android/soong/android"
@@ -38,7 +37,7 @@
 	return deps
 }
 
-func toolchainLibraryFactory() (blueprint.Module, []interface{}) {
+func toolchainLibraryFactory() android.Module {
 	module, library := NewLibrary(android.HostAndDeviceSupported)
 	library.BuildOnlyStatic()
 	toolchainLibrary := &toolchainLibraryDecorator{
diff --git a/genrule/filegroup.go b/genrule/filegroup.go
index 71c5439..4029134 100644
--- a/genrule/filegroup.go
+++ b/genrule/filegroup.go
@@ -15,8 +15,6 @@
 package genrule
 
 import (
-	"github.com/google/blueprint"
-
 	"android/soong/android"
 )
 
@@ -48,10 +46,11 @@
 // filegroup modules contain a list of files, and can be used to export files across package
 // boundaries.  filegroups (and genrules) can be referenced from srcs properties of other modules
 // using the syntax ":module".
-func FileGroupFactory() (blueprint.Module, []interface{}) {
+func FileGroupFactory() android.Module {
 	module := &fileGroup{}
-
-	return android.InitAndroidModule(module, &module.properties)
+	module.AddProperties(&module.properties)
+	android.InitAndroidModule(module)
+	return module
 }
 
 func (fg *fileGroup) DepsMutator(ctx android.BottomUpMutatorContext) {
diff --git a/genrule/genrule.go b/genrule/genrule.go
index dc4e968..c5de1fd 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -268,17 +268,20 @@
 	}
 }
 
-func generatorFactory(tasks taskFunc, props ...interface{}) (blueprint.Module, []interface{}) {
+func generatorFactory(tasks taskFunc, props ...interface{}) android.Module {
 	module := &generator{
 		tasks: tasks,
 	}
 
-	props = append(props, &module.properties)
+	module.AddProperties(props...)
+	module.AddProperties(&module.properties)
 
-	return android.InitAndroidModule(module, props...)
+	android.InitAndroidModule(module)
+
+	return module
 }
 
-func GenSrcsFactory() (blueprint.Module, []interface{}) {
+func GenSrcsFactory() android.Module {
 	properties := &genSrcsProperties{}
 
 	tasks := func(ctx android.ModuleContext, srcFiles android.Paths) []generateTask {
@@ -300,7 +303,7 @@
 	Output_extension string
 }
 
-func GenRuleFactory() (blueprint.Module, []interface{}) {
+func GenRuleFactory() android.Module {
 	properties := &genRuleProperties{}
 
 	tasks := func(ctx android.ModuleContext, srcFiles android.Paths) []generateTask {
diff --git a/java/app.go b/java/app.go
index f6ccd34..2f2b899 100644
--- a/java/app.go
+++ b/java/app.go
@@ -274,13 +274,16 @@
 	return aaptFlags, aaptDeps, hasResources
 }
 
-func AndroidAppFactory() (blueprint.Module, []interface{}) {
+func AndroidAppFactory() android.Module {
 	module := &AndroidApp{}
 
 	module.deviceProperties.Dex = true
 
-	return android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon,
+	module.AddProperties(
 		&module.Module.properties,
 		&module.Module.deviceProperties,
 		&module.appProperties)
+
+	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
+	return module
 }
diff --git a/java/java.go b/java/java.go
index 20661c4..3cc552f 100644
--- a/java/java.go
+++ b/java/java.go
@@ -418,21 +418,26 @@
 	j.deps(ctx)
 }
 
-func JavaLibraryFactory() (blueprint.Module, []interface{}) {
+func JavaLibraryFactory() android.Module {
 	module := &JavaLibrary{}
 
 	module.deviceProperties.Dex = true
 
-	return android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon,
+	module.AddProperties(
 		&module.Module.properties,
 		&module.Module.deviceProperties)
+
+	android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon)
+	return module
 }
 
-func JavaLibraryHostFactory() (blueprint.Module, []interface{}) {
+func JavaLibraryHostFactory() android.Module {
 	module := &JavaLibrary{}
 
-	return android.InitAndroidArchModule(module, android.HostSupported, android.MultilibCommon,
-		&module.Module.properties)
+	module.AddProperties(&module.Module.properties)
+
+	android.InitAndroidArchModule(module, android.HostSupported, android.MultilibCommon)
+	return module
 }
 
 //
@@ -463,24 +468,30 @@
 	j.deps(ctx)
 }
 
-func JavaBinaryFactory() (blueprint.Module, []interface{}) {
+func JavaBinaryFactory() android.Module {
 	module := &JavaBinary{}
 
 	module.deviceProperties.Dex = true
 
-	return android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon,
+	module.AddProperties(
 		&module.Module.properties,
 		&module.Module.deviceProperties,
 		&module.binaryProperties)
+
+	android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon)
+	return module
 }
 
-func JavaBinaryHostFactory() (blueprint.Module, []interface{}) {
+func JavaBinaryHostFactory() android.Module {
 	module := &JavaBinary{}
 
-	return android.InitAndroidArchModule(module, android.HostSupported, android.MultilibCommon,
+	module.AddProperties(
 		&module.Module.properties,
 		&module.Module.deviceProperties,
 		&module.binaryProperties)
+
+	android.InitAndroidArchModule(module, android.HostSupported, android.MultilibCommon)
+	return module
 }
 
 //
@@ -536,11 +547,13 @@
 	return nil
 }
 
-func JavaPrebuiltFactory() (blueprint.Module, []interface{}) {
+func JavaPrebuiltFactory() android.Module {
 	module := &JavaPrebuilt{}
 
-	return android.InitAndroidArchModule(module, android.HostAndDeviceSupported,
-		android.MultilibCommon, &module.properties)
+	module.AddProperties(&module.properties)
+
+	android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon)
+	return module
 }
 
 //
@@ -576,11 +589,15 @@
 	return j.aidlPreprocessed
 }
 
-func SdkPrebuiltFactory() (blueprint.Module, []interface{}) {
+func SdkPrebuiltFactory() android.Module {
 	module := &sdkPrebuilt{}
 
-	return android.InitAndroidArchModule(module, android.HostAndDeviceSupported,
-		android.MultilibCommon, &module.properties, &module.sdkProperties)
+	module.AddProperties(
+		&module.properties,
+		&module.sdkProperties)
+
+	android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon)
+	return module
 }
 
 func inList(s string, l []string) bool {
diff --git a/phony/phony.go b/phony/phony.go
index c405af8..79f3a1b 100644
--- a/phony/phony.go
+++ b/phony/phony.go
@@ -19,8 +19,6 @@
 	"io"
 	"strings"
 
-	"github.com/google/blueprint"
-
 	"android/soong/android"
 )
 
@@ -33,10 +31,11 @@
 	requiredModuleNames []string
 }
 
-func phonyFactory() (blueprint.Module, []interface{}) {
+func phonyFactory() android.Module {
 	module := &phony{}
 
-	return android.InitAndroidModule(module)
+	android.InitAndroidModule(module)
+	return module
 }
 
 func (p *phony) DepsMutator(ctx android.BottomUpMutatorContext) {
diff --git a/python/binary.go b/python/binary.go
index 81e8bd9..ae2693b 100644
--- a/python/binary.go
+++ b/python/binary.go
@@ -21,8 +21,6 @@
 	"path/filepath"
 	"strings"
 
-	"github.com/google/blueprint"
-
 	"android/soong/android"
 )
 
@@ -74,15 +72,16 @@
 	stubTemplateHost = "build/soong/python/scripts/stub_template_host.txt"
 )
 
-func PythonBinaryHostFactory() (blueprint.Module, []interface{}) {
+func PythonBinaryHostFactory() android.Module {
 	decorator := &pythonBinaryHostDecorator{
 		pythonDecorator: pythonDecorator{baseInstaller: NewPythonInstaller("bin")}}
 
 	module := &PythonBinaryHost{}
 	module.pythonBaseModule.installer = decorator
+	module.AddProperties(&module.binaryProperties)
 
 	return InitPythonBaseModule(&module.pythonBinaryBase.pythonBaseModule,
-		&module.pythonBinaryBase, android.HostSupportedNoCross, &module.binaryProperties)
+		&module.pythonBinaryBase, android.HostSupportedNoCross)
 }
 
 func (p *pythonBinaryBase) GeneratePythonBuildActions(ctx android.ModuleContext) android.OptionalPath {
diff --git a/python/library.go b/python/library.go
index 0b70756..2039e56 100644
--- a/python/library.go
+++ b/python/library.go
@@ -17,8 +17,6 @@
 // This file contains the module types for building Python library.
 
 import (
-	"github.com/google/blueprint"
-
 	"android/soong/android"
 )
 
@@ -32,7 +30,7 @@
 
 var _ PythonSubModule = (*PythonLibrary)(nil)
 
-func PythonLibraryHostFactory() (blueprint.Module, []interface{}) {
+func PythonLibraryHostFactory() android.Module {
 	module := &PythonLibrary{}
 
 	return InitPythonBaseModule(&module.pythonBaseModule, module, android.HostSupportedNoCross)
diff --git a/python/python.go b/python/python.go
index ab80e4d..df5999d 100644
--- a/python/python.go
+++ b/python/python.go
@@ -152,14 +152,15 @@
 var _ android.AndroidMkDataProvider = (*pythonBaseModule)(nil)
 
 func InitPythonBaseModule(baseModule *pythonBaseModule, subModule PythonSubModule,
-	hod android.HostOrDeviceSupported,
-	props ...interface{}) (blueprint.Module, []interface{}) {
+	hod android.HostOrDeviceSupported) android.Module {
 
 	baseModule.subModule = subModule
 
-	props = append(props, &baseModule.properties)
+	baseModule.AddProperties(&baseModule.properties)
 
-	return android.InitAndroidArchModule(baseModule, hod, android.MultilibCommon, props...)
+	android.InitAndroidArchModule(baseModule, hod, android.MultilibCommon)
+
+	return baseModule
 }
 
 // the tag used to mark dependencies within "py_libs" attribute.
diff --git a/python/python_test.go b/python/python_test.go
index bb407e4..57aaa34 100644
--- a/python/python_test.go
+++ b/python/python_test.go
@@ -313,8 +313,10 @@
 		t.Run(d.desc, func(t *testing.T) {
 			ctx := blueprint.NewContext()
 			android.RegisterTestMutators(ctx)
-			ctx.RegisterModuleType("python_library_host", PythonLibraryHostFactory)
-			ctx.RegisterModuleType("python_binary_host", PythonBinaryHostFactory)
+			ctx.RegisterModuleType("python_library_host",
+				android.ModuleFactoryAdaptor(PythonLibraryHostFactory))
+			ctx.RegisterModuleType("python_binary_host",
+				android.ModuleFactoryAdaptor(PythonBinaryHostFactory))
 			ctx.MockFileSystem(d.mockFiles)
 			_, testErrs := ctx.ParseBlueprintsFiles(bpFile)
 			fail(t, testErrs)
diff --git a/python/test.go b/python/test.go
index 8318438..837eb25 100644
--- a/python/test.go
+++ b/python/test.go
@@ -17,8 +17,6 @@
 import (
 	"android/soong/android"
 	"path/filepath"
-
-	"github.com/google/blueprint"
 )
 
 // This file contains the module types for building Python test.
@@ -42,13 +40,15 @@
 	p.pythonDecorator.baseInstaller.install(ctx, file)
 }
 
-func PythonTestHostFactory() (blueprint.Module, []interface{}) {
+func PythonTestHostFactory() android.Module {
 	decorator := &pythonTestHostDecorator{
 		pythonDecorator: pythonDecorator{baseInstaller: NewPythonInstaller("nativetest")}}
 
 	module := &PythonBinaryHost{}
 	module.pythonBaseModule.installer = decorator
 
+	module.AddProperties(&module.binaryProperties)
+
 	return InitPythonBaseModule(&module.pythonBinaryBase.pythonBaseModule,
-		&module.pythonBinaryBase, android.HostSupportedNoCross, &module.binaryProperties)
+		&module.pythonBinaryBase, android.HostSupportedNoCross)
 }