Avoid writing soong_build_metrics.pb multiple times

Previously, running `m nothing`	would write the	soong_build_metrics.pb
file 3 times:
1. For bp2build - it contains a single `soong_build` event as the rest
   is written to the `bp2build_metrics.pb` file.
2. For Bazel symlink forrest - it too contains a single `soong_build`
   event as the rest is appended to the `bp2build_metrics.pb` file.
3. For soong_build proper (including mixed builds) - it contains useful
   information.

This change avoids that by pushing the code to write the
soong_build_metrics.pb file from the top level where it applies to all
build modes into the build mode specific function that needs it.

Bug: 257590265
Test: m nothing
      # Run with some logging to make sure the file is only created once.
Change-Id: Iee239fb87edf443fed65156fa14b8a30c89a2328

Change-Id: I09724f6143352de6b7d6fb29eaf3fbed5a1abd21
diff --git a/cmd/soong_build/main.go b/cmd/soong_build/main.go
index e41ccae..9b25c3d 100644
--- a/cmd/soong_build/main.go
+++ b/cmd/soong_build/main.go
@@ -358,18 +358,29 @@
 		runBp2Build(configuration, extraNinjaDeps, metricsDir)
 		return bp2buildMarker
 	} else if configuration.BuildMode == android.ApiBp2build {
-		return runApiBp2build(configuration, extraNinjaDeps)
+		outputFile := runApiBp2build(configuration, extraNinjaDeps)
+		writeMetrics(configuration, ctx.EventHandler, metricsDir)
+		return outputFile
 	} else {
+
+		var outputFile string
 		if configuration.IsMixedBuildsEnabled() {
-			return runMixedModeBuild(configuration, ctx, extraNinjaDeps)
+			outputFile = runMixedModeBuild(configuration, ctx, extraNinjaDeps)
 		} else {
-			return runSoongOnlyBuild(configuration, ctx, extraNinjaDeps)
+			outputFile = runSoongOnlyBuild(configuration, ctx, extraNinjaDeps)
 		}
+
+		writeMetrics(configuration, ctx.EventHandler, metricsDir)
+
+		return outputFile
 	}
 }
 
 // runSoongOnlyBuild runs the standard Soong build in a number of different modes.
 func runSoongOnlyBuild(configuration android.Config, ctx *android.Context, extraNinjaDeps []string) string {
+	ctx.EventHandler.Begin("soong_build")
+	defer ctx.EventHandler.End("soong_build")
+
 	var stopBefore bootstrap.StopBefore
 	if configuration.BuildMode == android.GenerateModuleGraph {
 		stopBefore = bootstrap.StopBeforeWriteNinja
@@ -470,13 +481,9 @@
 	logDir := availableEnv["LOG_DIR"]
 
 	ctx := newContext(configuration)
-	ctx.EventHandler.Begin("soong_build")
 
 	finalOutputFile := doChosenActivity(ctx, configuration, extraNinjaDeps, logDir)
 
-	ctx.EventHandler.End("soong_build")
-	writeMetrics(configuration, ctx.EventHandler, logDir)
-
 	writeUsedEnvironmentFile(configuration, finalOutputFile)
 }