Add SOONG_SDK_SNAPSHOT_PREFER support

By default the generated snapshot has prefer: false. Building it with
SOONG_SDK_SNAPSHOT_PREFER=true will force it to generate prefer: true.

Bug: 157884619
Test: m nothing
      m SOONG_SDK_SNAPSHOT_PREFER=true art-module-sdk
      - check the generated Android.bp file to make sure it contains
        prefer: true
Change-Id: Ied297b32d9bd4822a140fa99016f38e234c50f64
diff --git a/sdk/update.go b/sdk/update.go
index 457cbd9..853f6b0 100644
--- a/sdk/update.go
+++ b/sdk/update.go
@@ -29,6 +29,14 @@
 	"android/soong/android"
 )
 
+// Environment variables that affect the generated snapshot
+// ========================================================
+//
+// SOONG_SDK_SNAPSHOT_PREFER
+//     By default every unversioned module in the generated snapshot has prefer: false. Building it
+//     with SOONG_SDK_SNAPSHOT_PREFER=true will force them to use prefer: true.
+//
+
 var pctx = android.NewPackageContext("android/soong/sdk")
 
 var (
@@ -274,7 +282,14 @@
 
 	// Create a transformer that will transform an unversioned module by replacing any references
 	// to internal members with a unique module name and setting prefer: false.
-	unversionedTransformer := unversionedTransformation{builder: builder}
+	unversionedTransformer := unversionedTransformation{
+		builder: builder,
+		// Set the prefer based on the environment variable. This is a temporary work around to allow a
+		// snapshot to be created that sets prefer: true.
+		// TODO(b/174997203): Remove once the ability to select the modules to prefer can be done
+		//  dynamically at build time not at snapshot generation time.
+		prefer: ctx.Config().IsEnvTrue("SOONG_SDK_SNAPSHOT_PREFER"),
+	}
 
 	for _, unversioned := range builder.prebuiltOrder {
 		// Prune any empty property sets.
@@ -614,6 +629,7 @@
 type unversionedTransformation struct {
 	identityTransformation
 	builder *snapshotBuilder
+	prefer  bool
 }
 
 func (t unversionedTransformation) transformModule(module *bpModule) *bpModule {
@@ -621,8 +637,11 @@
 	name := module.getValue("name").(string)
 	module.setProperty("name", t.builder.unversionedSdkMemberName(name, true))
 
-	// Set prefer: false - this is not strictly required as that is the default.
-	module.insertAfter("name", "prefer", false)
+	// Set prefer. Setting this to false is not strictly required as that is the default but it does
+	// provide a convenient hook to post-process the generated Android.bp file, e.g. in tests to check
+	// the behavior when a prebuilt is preferred. It also makes it explicit what the default behavior
+	// is for the module.
+	module.insertAfter("name", "prefer", t.prefer)
 
 	return module
 }