Revert "Rewrite sbox to use a textproto manifest"

This reverts commit 151b9ff0cf7d22b7257defa6aecc39693f1f2b3c.

Reason for revert: broke builds

Change-Id: I69b3b8795d5a36b4fa0debb1af2d433be3c15d6c
diff --git a/android/rule_builder.go b/android/rule_builder.go
index 3efe9f8..86418b2 100644
--- a/android/rule_builder.go
+++ b/android/rule_builder.go
@@ -20,33 +20,27 @@
 	"path/filepath"
 	"sort"
 	"strings"
-	"testing"
 
-	"github.com/golang/protobuf/proto"
 	"github.com/google/blueprint"
 	"github.com/google/blueprint/proptools"
 
-	"android/soong/cmd/sbox/sbox_proto"
 	"android/soong/shared"
 )
 
-const sboxSandboxBaseDir = "__SBOX_SANDBOX_DIR__"
-const sboxOutSubDir = "out"
-const sboxOutDir = sboxSandboxBaseDir + "/" + sboxOutSubDir
+const sboxOutDir = "__SBOX_OUT_DIR__"
 
 // RuleBuilder provides an alternative to ModuleContext.Rule and ModuleContext.Build to add a command line to the build
 // graph.
 type RuleBuilder struct {
-	commands         []*RuleBuilderCommand
-	installs         RuleBuilderInstalls
-	temporariesSet   map[WritablePath]bool
-	restat           bool
-	sbox             bool
-	highmem          bool
-	remoteable       RemoteRuleSupports
-	sboxOutDir       WritablePath
-	sboxManifestPath WritablePath
-	missingDeps      []string
+	commands       []*RuleBuilderCommand
+	installs       RuleBuilderInstalls
+	temporariesSet map[WritablePath]bool
+	restat         bool
+	sbox           bool
+	highmem        bool
+	remoteable     RemoteRuleSupports
+	sboxOutDir     WritablePath
+	missingDeps    []string
 }
 
 // NewRuleBuilder returns a newly created RuleBuilder.
@@ -112,14 +106,12 @@
 	return r
 }
 
-// Sbox marks the rule as needing to be wrapped by sbox. The outputDir should point to the output
-// directory that sbox will wipe. It should not be written to by any other rule. manifestPath should
-// point to a location where sbox's manifest will be written and must be outside outputDir. sbox
-// will ensure that all outputs have been written, and will discard any output files that were not
-// specified.
+// Sbox marks the rule as needing to be wrapped by sbox. The WritablePath should point to the output
+// directory that sbox will wipe. It should not be written to by any other rule. sbox will ensure
+// that all outputs have been written, and will discard any output files that were not specified.
 //
 // Sbox is not compatible with Restat()
-func (r *RuleBuilder) Sbox(outputDir WritablePath, manifestPath WritablePath) *RuleBuilder {
+func (r *RuleBuilder) Sbox(outputDir WritablePath) *RuleBuilder {
 	if r.sbox {
 		panic("Sbox() may not be called more than once")
 	}
@@ -131,7 +123,6 @@
 	}
 	r.sbox = true
 	r.sboxOutDir = outputDir
-	r.sboxManifestPath = manifestPath
 	return r
 }
 
@@ -429,8 +420,7 @@
 			r.depFileMergerCmd(ctx, depFiles)
 
 			if r.sbox {
-				// Check for Rel() errors, as all depfiles should be in the output dir.  Errors
-				// will be reported to the ctx.
+				// Check for Rel() errors, as all depfiles should be in the output dir
 				for _, path := range depFiles[1:] {
 					Rel(ctx, r.sboxOutDir.String(), path.String())
 				}
@@ -453,60 +443,34 @@
 	commandString := strings.Join(commands, " && ")
 
 	if r.sbox {
-		// If running the command inside sbox, write the rule data out to an sbox
-		// manifest.textproto.
-		manifest := sbox_proto.Manifest{}
-		command := sbox_proto.Command{}
-		manifest.Commands = append(manifest.Commands, &command)
-		command.Command = proto.String(commandString)
-
-		if depFile != nil {
-			manifest.OutputDepfile = proto.String(depFile.String())
-		}
-
-		// Add copy rules to the manifest to copy each output file from the sbox directory.
-		// to the output directory.
 		sboxOutputs := make([]string, len(outputs))
 		for i, output := range outputs {
-			rel := Rel(ctx, r.sboxOutDir.String(), output.String())
-			sboxOutputs[i] = filepath.Join(sboxOutDir, rel)
-			command.CopyAfter = append(command.CopyAfter, &sbox_proto.Copy{
-				From: proto.String(filepath.Join(sboxOutSubDir, rel)),
-				To:   proto.String(output.String()),
-			})
+			sboxOutputs[i] = filepath.Join(sboxOutDir, Rel(ctx, r.sboxOutDir.String(), output.String()))
 		}
 
-		// Add a hash of the list of input files to the manifest so that the textproto file
-		// changes when the list of input files changes and causes the sbox rule that
-		// depends on it to rerun.
-		command.InputHash = proto.String(hashSrcFiles(inputs))
-
-		// Verify that the manifest textproto is not inside the sbox output directory, otherwise
-		// it will get deleted when the sbox rule clears its output directory.
-		_, manifestInOutDir := MaybeRel(ctx, r.sboxOutDir.String(), r.sboxManifestPath.String())
-		if manifestInOutDir {
-			ReportPathErrorf(ctx, "sbox rule %q manifestPath %q must not be in outputDir %q",
-				name, r.sboxManifestPath.String(), r.sboxOutDir.String())
+		commandString = proptools.ShellEscape(commandString)
+		if !strings.HasPrefix(commandString, `'`) {
+			commandString = `'` + commandString + `'`
 		}
 
-		// Create a rule to write the manifest as a the textproto.
-		WriteFileRule(ctx, r.sboxManifestPath, proto.MarshalTextString(&manifest))
-
-		// Generate a new string to use as the command line of the sbox rule.  This uses
-		// a RuleBuilderCommand as a convenience method of building the command line, then
-		// converts it to a string to replace commandString.
 		sboxCmd := &RuleBuilderCommand{}
-		sboxCmd.Text("rm -rf").Output(r.sboxOutDir)
-		sboxCmd.Text("&&")
 		sboxCmd.BuiltTool(ctx, "sbox").
+			Flag("-c").Text(commandString).
 			Flag("--sandbox-path").Text(shared.TempDirForOutDir(PathForOutput(ctx).String())).
-			Flag("--manifest").Input(r.sboxManifestPath)
+			Flag("--output-root").Text(r.sboxOutDir.String())
 
-		// Replace the command string, and add the sbox tool and manifest textproto to the
-		// dependencies of the final sbox rule.
+		if depFile != nil {
+			sboxCmd.Flag("--depfile-out").Text(depFile.String())
+		}
+
+		// Add a hash of the list of input files to the xbox command line so that ninja reruns
+		// it when the list of input files changes.
+		sboxCmd.FlagWithArg("--input-hash ", hashSrcFiles(inputs))
+
+		sboxCmd.Flags(sboxOutputs)
+
 		commandString = sboxCmd.buf.String()
 		tools = append(tools, sboxCmd.tools...)
-		inputs = append(inputs, sboxCmd.inputs...)
 	} else {
 		// If not using sbox the rule will run the command directly, put the hash of the
 		// list of input files in a comment at the end of the command line to ensure ninja
@@ -926,19 +890,6 @@
 	return ninjaEscapeExceptForSpans(c.String(), c.unescapedSpans)
 }
 
-// RuleBuilderSboxProtoForTests takes the BuildParams for the manifest passed to RuleBuilder.Sbox()
-// and returns sbox testproto generated by the RuleBuilder.
-func RuleBuilderSboxProtoForTests(t *testing.T, params TestingBuildParams) *sbox_proto.Manifest {
-	t.Helper()
-	content := ContentFromFileRuleForTests(t, params)
-	manifest := sbox_proto.Manifest{}
-	err := proto.UnmarshalText(content, &manifest)
-	if err != nil {
-		t.Fatalf("failed to unmarshal manifest: %s", err.Error())
-	}
-	return &manifest
-}
-
 func ninjaEscapeExceptForSpans(s string, spans [][2]int) string {
 	if len(spans) == 0 {
 		return proptools.NinjaEscape(s)