Merge "Regenerate R.java files from LOCAL_STATIC_ANDROID_LIBRARIES"
diff --git a/ui/build/config.go b/ui/build/config.go
index 530c3a8..5622dff 100644
--- a/ui/build/config.go
+++ b/ui/build/config.go
@@ -44,10 +44,11 @@
 	skipMake   bool
 
 	// From the product config
-	katiArgs     []string
-	ninjaArgs    []string
-	katiSuffix   string
-	targetDevice string
+	katiArgs        []string
+	ninjaArgs       []string
+	katiSuffix      string
+	targetDevice    string
+	targetDeviceDir string
 
 	brokenDupRules bool
 }
@@ -568,3 +569,11 @@
 func (c *configImpl) BuildBrokenDupRules() bool {
 	return c.brokenDupRules
 }
+
+func (c *configImpl) SetTargetDeviceDir(dir string) {
+	c.targetDeviceDir = dir
+}
+
+func (c *configImpl) TargetDeviceDir() string {
+	return c.targetDeviceDir
+}
diff --git a/ui/build/dumpvars.go b/ui/build/dumpvars.go
index eb43ed6..cc9e742 100644
--- a/ui/build/dumpvars.go
+++ b/ui/build/dumpvars.go
@@ -157,6 +157,9 @@
 		// To find target/product/<DEVICE>
 		"TARGET_DEVICE",
 
+		// So that later Kati runs can find BoardConfig.mk faster
+		"TARGET_DEVICE_DIR",
+
 		// Whether --werror_overriding_commands will work
 		"BUILD_BROKEN_DUP_RULES",
 	}, exportEnvVars...), BannerVars...)
@@ -182,6 +185,7 @@
 	config.SetKatiArgs(strings.Fields(make_vars["KATI_GOALS"]))
 	config.SetNinjaArgs(strings.Fields(make_vars["NINJA_GOALS"]))
 	config.SetTargetDevice(make_vars["TARGET_DEVICE"])
+	config.SetTargetDeviceDir(make_vars["TARGET_DEVICE_DIR"])
 
 	config.SetBuildBrokenDupRules(make_vars["BUILD_BROKEN_DUP_RULES"] != "false")
 }
diff --git a/ui/build/kati.go b/ui/build/kati.go
index a73ebdf..81edd32 100644
--- a/ui/build/kati.go
+++ b/ui/build/kati.go
@@ -94,7 +94,8 @@
 	args = append(args,
 		"BUILDING_WITH_NINJA=true",
 		"SOONG_ANDROID_MK="+config.SoongAndroidMk(),
-		"SOONG_MAKEVARS_MK="+config.SoongMakeVarsMk())
+		"SOONG_MAKEVARS_MK="+config.SoongMakeVarsMk(),
+		"TARGET_DEVICE_DIR="+config.TargetDeviceDir())
 
 	if config.UseGoma() {
 		args = append(args, "-j"+strconv.Itoa(config.Parallel()))
@@ -196,17 +197,22 @@
 		"--werror_find_emulator",
 		"--werror_overriding_commands",
 		"--use_find_emulator",
+		"--kati_stats",
 		"-f", "build/make/core/cleanbuild.mk",
 		"BUILDING_WITH_NINJA=true",
 		"SOONG_MAKEVARS_MK=" + config.SoongMakeVarsMk(),
+		"TARGET_DEVICE_DIR=" + config.TargetDeviceDir(),
 	}
 
 	cmd := Command(ctx, config, "ckati", executable, args...)
 	cmd.Sandbox = katiCleanSpecSandbox
-	cmd.Stdout = ctx.Stdout()
-	cmd.Stderr = ctx.Stderr()
+	pipe, err := cmd.StdoutPipe()
+	if err != nil {
+		ctx.Fatalln("Error getting output pipe for ckati:", err)
+	}
+	cmd.Stderr = cmd.Stdout
 
-	// Kati leaks memory, so ensure leak detection is turned off
-	cmd.Environment.Set("ASAN_OPTIONS", "detect_leaks=0")
-	cmd.RunOrFatal()
+	cmd.StartOrFatal()
+	katiRewriteOutput(ctx, pipe)
+	cmd.WaitOrFatal()
 }