diff --git a/ui/build/config.go b/ui/build/config.go
index 90b98f5..dfe0dfe 100644
--- a/ui/build/config.go
+++ b/ui/build/config.go
@@ -214,10 +214,6 @@
 		sandboxConfig:         &SandboxConfig{},
 		ninjaWeightListSource: DEFAULT,
 	}
-	wd, err := os.Getwd()
-	if err != nil {
-		ctx.Fatalln("Failed to get working directory:", err)
-	}
 
 	// Skip soong tests by default on Linux
 	if runtime.GOOS == "linux" {
@@ -249,13 +245,17 @@
 
 	// Make sure OUT_DIR is set appropriately
 	if outDir, ok := ret.environ.Get("OUT_DIR"); ok {
-		ret.environ.Set("OUT_DIR", ret.sandboxPath(wd, filepath.Clean(outDir)))
+		ret.environ.Set("OUT_DIR", filepath.Clean(outDir))
 	} else {
 		outDir := "out"
 		if baseDir, ok := ret.environ.Get("OUT_DIR_COMMON_BASE"); ok {
-			outDir = filepath.Join(baseDir, filepath.Base(wd))
+			if wd, err := os.Getwd(); err != nil {
+				ctx.Fatalln("Failed to get working directory:", err)
+			} else {
+				outDir = filepath.Join(baseDir, filepath.Base(wd))
+			}
 		}
-		ret.environ.Set("OUT_DIR", ret.sandboxPath(wd, outDir))
+		ret.environ.Set("OUT_DIR", outDir)
 	}
 
 	// loadEnvConfig needs to know what the OUT_DIR is, so it should
@@ -350,9 +350,6 @@
 
 		// Use config.useN2 instead.
 		"SOONG_USE_N2",
-
-		// Leaks usernames into environment.
-		"HOME",
 	)
 
 	if ret.UseGoma() || ret.ForceUseGoma() {
@@ -364,12 +361,12 @@
 	ret.environ.Set("PYTHONDONTWRITEBYTECODE", "1")
 
 	tmpDir := absPath(ctx, ret.TempDir())
-	ret.environ.Set("TMPDIR", ret.sandboxPath(wd, tmpDir))
+	ret.environ.Set("TMPDIR", tmpDir)
 
 	// Always set ASAN_SYMBOLIZER_PATH so that ASAN-based tools can symbolize any crashes
 	symbolizerPath := filepath.Join("prebuilts/clang/host", ret.HostPrebuiltTag(),
 		"llvm-binutils-stable/llvm-symbolizer")
-	ret.environ.Set("ASAN_SYMBOLIZER_PATH", ret.sandboxPath(wd, absPath(ctx, symbolizerPath)))
+	ret.environ.Set("ASAN_SYMBOLIZER_PATH", absPath(ctx, symbolizerPath))
 
 	// Precondition: the current directory is the top of the source tree
 	checkTopDir(ctx)
@@ -423,18 +420,15 @@
 
 	ret.configureLocale(ctx)
 
-	newPath := []string{ret.sandboxPath(wd, filepath.Join(absJavaHome, "bin"))}
+	newPath := []string{filepath.Join(absJavaHome, "bin")}
 	if path, ok := ret.environ.Get("PATH"); ok && path != "" {
-		entries := strings.Split(path, string(filepath.ListSeparator))
-		for _, ent := range entries {
-			newPath = append(newPath, ret.sandboxPath(wd, ent))
-		}
+		newPath = append(newPath, path)
 	}
 
 	ret.environ.Unset("OVERRIDE_ANDROID_JAVA_HOME")
-	ret.environ.Set("JAVA_HOME", ret.sandboxPath(wd, absJavaHome))
-	ret.environ.Set("ANDROID_JAVA_HOME", ret.sandboxPath(wd, javaHome))
-	ret.environ.Set("ANDROID_JAVA8_HOME", ret.sandboxPath(wd, java8Home))
+	ret.environ.Set("JAVA_HOME", absJavaHome)
+	ret.environ.Set("ANDROID_JAVA_HOME", javaHome)
+	ret.environ.Set("ANDROID_JAVA8_HOME", java8Home)
 	ret.environ.Set("PATH", strings.Join(newPath, string(filepath.ListSeparator)))
 
 	// b/286885495, https://bugzilla.redhat.com/show_bug.cgi?id=2227130: some versions of Fedora include patches
@@ -450,7 +444,7 @@
 		ret.buildDateTime = strconv.FormatInt(time.Now().Unix(), 10)
 	}
 
-	ret.environ.Set("BUILD_DATETIME_FILE", ret.sandboxPath(wd, buildDateTimeFile))
+	ret.environ.Set("BUILD_DATETIME_FILE", buildDateTimeFile)
 
 	if _, ok := ret.environ.Get("BUILD_USERNAME"); !ok {
 		username := "unknown"
@@ -461,7 +455,6 @@
 		}
 		ret.environ.Set("BUILD_USERNAME", username)
 	}
-	ret.environ.Set("PWD", ret.sandboxPath(wd, wd))
 
 	if ret.UseRBE() {
 		for k, v := range getRBEVars(ctx, Config{ret}) {
@@ -1303,19 +1296,6 @@
 	return err == nil
 }
 
-func (c *configImpl) sandboxPath(base, in string) string {
-	if !c.UseABFS() {
-		return in
-	}
-
-	rel, err := filepath.Rel(base, in)
-	if err != nil {
-		return in
-	}
-
-	return filepath.Join(abfsSrcDir, rel)
-}
-
 func (c *configImpl) UseRBE() bool {
 	// These alternate modes of running Soong do not use RBE / reclient.
 	if c.Queryview() || c.JsonModuleGraph() {
@@ -1736,11 +1716,6 @@
 }
 
 func (c *configImpl) SkipMetricsUpload() bool {
-	// b/362625275 - Metrics upload sometimes prevents abfs unmount
-	if c.UseABFS() {
-		return true
-	}
-
 	return c.skipMetricsUpload
 }
 
diff --git a/ui/build/path.go b/ui/build/path.go
index 075bf2e..51ebff1 100644
--- a/ui/build/path.go
+++ b/ui/build/path.go
@@ -57,22 +57,6 @@
 	return ret
 }
 
-func updatePathForSandbox(config Config) {
-	wd, err := os.Getwd()
-	if err != nil {
-		return
-	}
-
-	var newPath []string
-	if path, ok := config.Environment().Get("PATH"); ok && path != "" {
-		entries := strings.Split(path, string(filepath.ListSeparator))
-		for _, ent := range entries {
-			newPath = append(newPath, config.sandboxPath(wd, ent))
-		}
-	}
-	config.Environment().Set("PATH", strings.Join(newPath, string(filepath.ListSeparator)))
-}
-
 // SetupLitePath is the "lite" version of SetupPath used for dumpvars, or other
 // places that does not need the full logging capabilities of path_interposer,
 // wants the minimal performance overhead, and still get the benefits of $PATH
@@ -137,7 +121,6 @@
 	// Set $PATH to be the directories containing the host tool symlinks, and
 	// the prebuilts directory for the current host OS.
 	config.Environment().Set("PATH", myPath)
-	updatePathForSandbox(config)
 	config.pathReplaced = true
 }
 
@@ -282,6 +265,5 @@
 	// Replace the $PATH variable with the path_interposer symlinks, and
 	// checked-in prebuilts.
 	config.Environment().Set("PATH", myPath)
-	updatePathForSandbox(config)
 	config.pathReplaced = true
 }
diff --git a/ui/build/sandbox_linux.go b/ui/build/sandbox_linux.go
index 6c46000..d9ca854 100644
--- a/ui/build/sandbox_linux.go
+++ b/ui/build/sandbox_linux.go
@@ -187,17 +187,8 @@
 	return args
 }
 
-func (c *Cmd) workDir() string {
-	if !c.config.UseABFS() {
-		wd, _ := os.Getwd()
-		return wd
-	}
-
-	return abfsSrcDir
-}
-
 func (c *Cmd) wrapSandbox() {
-	wd := c.workDir()
+	wd, _ := os.Getwd()
 
 	var sandboxArgs []string
 	sandboxArgs = append(sandboxArgs,
@@ -235,7 +226,7 @@
 	)
 
 	sandboxArgs = append(sandboxArgs,
-		c.readMountArgs()...,
+		c.readMountArgs()...
 	)
 
 	sandboxArgs = append(sandboxArgs,
