diff --git a/benchmarks/spawn/Android.bp b/benchmarks/spawn/Android.bp
index 5be8599..2276d2e 100644
--- a/benchmarks/spawn/Android.bp
+++ b/benchmarks/spawn/Android.bp
@@ -26,21 +26,8 @@
 // SUCH DAMAGE.
 //
 
-cc_benchmark {
-    name: "bionic-spawn-benchmarks",
-    srcs: ["spawn_benchmarks.cpp"],
-    static_libs: [
-        "libbase",
-        "liblog",
-    ],
-
-    // Install these binaries in the same directory as the main benchmark binary.
-    data: [
-        ":bench_noop",
-        ":bench_noop_nostl",
-        ":bench_noop_static",
-    ],
-
+cc_defaults {
+    name: "bionic_spawn_benchmark_targets",
     host_supported: true,
     target: {
         darwin: {
@@ -55,8 +42,41 @@
     },
 }
 
+cc_library_static {
+    name: "libbionic_spawn_benchmark",
+    defaults: ["bionic_spawn_benchmark_targets"],
+
+    srcs: ["spawn_benchmark.cpp"],
+    export_include_dirs: ["include"],
+    static_libs: [
+        "libbase",
+        "libgoogle-benchmark",
+        "liblog",
+    ],
+}
+
+cc_benchmark {
+    name: "bionic-spawn-benchmarks",
+    defaults: ["bionic_spawn_benchmark_targets"],
+
+    srcs: ["spawn_benchmarks.cpp"],
+    static_libs: [
+        "libbase",
+        "libbionic_spawn_benchmark",
+        "liblog",
+    ],
+
+    // Install these binaries in the same directory as the main benchmark binary.
+    data: [
+        ":bench_noop",
+        ":bench_noop_nostl",
+        ":bench_noop_static",
+    ],
+}
+
 cc_defaults {
     name: "noop_binary_defaults",
+    defaults: ["bionic_spawn_benchmark_targets"],
 
     compile_multilib: "both",
     multilib: {
@@ -67,19 +87,6 @@
             suffix: "64",
         },
     },
-
-    host_supported: true,
-    target: {
-        darwin: {
-            enabled: false,
-        },
-        windows: {
-            enabled: false,
-        },
-        linux_glibc_x86: {
-            enabled: false,
-        },
-    },
 }
 
 cc_binary {
diff --git a/benchmarks/spawn/include/spawn_benchmark.h b/benchmarks/spawn/include/spawn_benchmark.h
new file mode 100644
index 0000000..ae559f0
--- /dev/null
+++ b/benchmarks/spawn/include/spawn_benchmark.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <android-base/file.h>
+#include <benchmark/benchmark.h>
+
+void BM_spawn_test(benchmark::State& state, const char* const* argv);
+
+static inline std::string test_program(const char* name) {
+#if defined(__LP64__)
+  return android::base::GetExecutableDirectory() + "/" + name + "64";
+#else
+  return android::base::GetExecutableDirectory() + "/" + name + "32";
+#endif
+}
+
+#define SPAWN_BENCHMARK(name, ...)                                                    \
+    BENCHMARK_CAPTURE(BM_spawn_test, name, (const char*[]) { __VA_ARGS__, nullptr })  \
+        ->UseRealTime()                                                               \
+        ->Unit(benchmark::kMicrosecond)                                               \
diff --git a/benchmarks/spawn/spawn_benchmark.cpp b/benchmarks/spawn/spawn_benchmark.cpp
new file mode 100644
index 0000000..f2b5433
--- /dev/null
+++ b/benchmarks/spawn/spawn_benchmark.cpp
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "spawn_benchmark.h"
+
+#include <errno.h>
+#include <spawn.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include <android-base/stringprintf.h>
+
+extern char** environ;
+
+void BM_spawn_test(benchmark::State& state, const char* const* argv) {
+  for (auto _ : state) {
+    pid_t child = 0;
+    if (int spawn_err = posix_spawn(&child, argv[0], nullptr, nullptr, const_cast<char**>(argv),
+                                    environ)) {
+      state.SkipWithError(android::base::StringPrintf(
+          "posix_spawn of %s failed: %s", argv[0], strerror(spawn_err)).c_str());
+      break;
+    }
+
+    int wstatus = 0;
+    const pid_t wait_result = TEMP_FAILURE_RETRY(waitpid(child, &wstatus, 0));
+    if (wait_result != child) {
+      state.SkipWithError(android::base::StringPrintf(
+          "waitpid on pid %d for %s failed: %s",
+          static_cast<int>(child), argv[0], strerror(errno)).c_str());
+      break;
+    }
+    if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == 127) {
+      state.SkipWithError(android::base::StringPrintf("could not exec %s", argv[0]).c_str());
+      break;
+    }
+  }
+}
diff --git a/benchmarks/spawn/spawn_benchmarks.cpp b/benchmarks/spawn/spawn_benchmarks.cpp
index e8f7c17..931a8be 100644
--- a/benchmarks/spawn/spawn_benchmarks.cpp
+++ b/benchmarks/spawn/spawn_benchmarks.cpp
@@ -26,57 +26,7 @@
  * SUCH DAMAGE.
  */
 
-#include <errno.h>
-#include <spawn.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <unistd.h>
-
-#include <android-base/file.h>
-#include <android-base/stringprintf.h>
-#include <benchmark/benchmark.h>
-
-static std::string test_program(const char* name) {
-#if defined(__LP64__)
-  return android::base::GetExecutableDirectory() + "/" + name + "64";
-#else
-  return android::base::GetExecutableDirectory() + "/" + name + "32";
-#endif
-}
-
-extern char** environ;
-
-static void BM_spawn_test(benchmark::State& state, const char* const* argv) {
-  for (auto _ : state) {
-    pid_t child = 0;
-    if (int spawn_err = posix_spawn(&child, argv[0], nullptr, nullptr, const_cast<char**>(argv),
-                                    environ)) {
-      state.SkipWithError(android::base::StringPrintf(
-          "posix_spawn of %s failed: %s", argv[0], strerror(spawn_err)).c_str());
-      break;
-    }
-
-    int wstatus = 0;
-    const pid_t wait_result = TEMP_FAILURE_RETRY(waitpid(child, &wstatus, 0));
-    if (wait_result != child) {
-      state.SkipWithError(android::base::StringPrintf(
-          "waitpid on pid %d for %s failed: %s",
-          static_cast<int>(child), argv[0], strerror(errno)).c_str());
-      break;
-    }
-    if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == 127) {
-      state.SkipWithError(android::base::StringPrintf("could not exec %s", argv[0]).c_str());
-      break;
-    }
-  }
-}
-
-#define SPAWN_BENCHMARK(name, ...)                                                    \
-    BENCHMARK_CAPTURE(BM_spawn_test, name, (const char*[]) { __VA_ARGS__, nullptr })  \
-        ->UseRealTime()                                                               \
-        ->Unit(benchmark::kMicrosecond)                                               \
+#include "spawn_benchmark.h"
 
 SPAWN_BENCHMARK(noop, test_program("bench_noop").c_str());
 SPAWN_BENCHMARK(noop_nostl, test_program("bench_noop_nostl").c_str());
