diff --git a/libartpalette/Android.bp b/libartpalette/Android.bp
index 0a45b88..f25501d 100644
--- a/libartpalette/Android.bp
+++ b/libartpalette/Android.bp
@@ -21,40 +21,11 @@
     export_include_dirs: ["include"],
 }
 
-// libartpalette-system is the implementation of the abstraction layer. It is
-// only available as a shared library on Android.
-art_cc_library {
-    name: "libartpalette-system",
-    defaults: ["libartpalette_defaults"],
-    compile_multilib: "both",
-    target: {
-        android: {
-            srcs: ["system/palette_android.cc"],
-            header_libs: ["libbase_headers"],
-            shared_libs: [
-                "libbase",
-                "libcutils",
-                "liblog",
-                "libprocessgroup",
-                "libtombstoned_client",
-            ],
-        },
-        host: {
-            header_libs: ["libbase_headers"],
-            srcs: ["system/palette_fake.cc"],
-            shared_libs: ["libbase"],
-        },
-        darwin: {
-            enabled: false,
-        },
-        windows: {
-            enabled: false,
-        },
-    },
-    static: {
-        enabled: false,
-    },
-    version_script: "libartpalette.map.txt",
+cc_library_headers {
+    name: "libartpalette-headers",
+    export_include_dirs: ["include"],
+    host_supported: true,
+    visibility: ["//system/libartpalette"],
 }
 
 // libartpalette is the dynamic loader of the platform abstraction
diff --git a/libartpalette/system/palette_android.cc b/libartpalette/system/palette_android.cc
deleted file mode 100644
index f4c8206..0000000
--- a/libartpalette/system/palette_android.cc
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define ATRACE_TAG ATRACE_TAG_DALVIK
-
-#include "palette/palette.h"
-
-#include <errno.h>
-#include <sys/resource.h>
-#include <sys/time.h>
-#include <unistd.h>
-
-#include <mutex>
-
-#include <android-base/file.h>
-#include <android-base/logging.h>
-#include <android-base/macros.h>
-#include <cutils/ashmem.h>
-#include <cutils/sched_policy.h>
-#include <cutils/trace.h>
-#include <log/event_tag_map.h>
-#include <tombstoned/tombstoned.h>
-#include <utils/Thread.h>
-
-#include "palette_system.h"
-
-enum PaletteStatus PaletteGetVersion(int32_t* version) {
-  *version = art::palette::kPaletteVersion;
-  return PaletteStatus::kOkay;
-}
-
-// Conversion map for "nice" values.
-//
-// We use Android thread priority constants to be consistent with the rest
-// of the system.  In some cases adjacent entries may overlap.
-//
-static const int kNiceValues[art::palette::kNumManagedThreadPriorities] = {
-  ANDROID_PRIORITY_LOWEST,                // 1 (MIN_PRIORITY)
-  ANDROID_PRIORITY_BACKGROUND + 6,
-  ANDROID_PRIORITY_BACKGROUND + 3,
-  ANDROID_PRIORITY_BACKGROUND,
-  ANDROID_PRIORITY_NORMAL,                // 5 (NORM_PRIORITY)
-  ANDROID_PRIORITY_NORMAL - 2,
-  ANDROID_PRIORITY_NORMAL - 4,
-  ANDROID_PRIORITY_URGENT_DISPLAY + 3,
-  ANDROID_PRIORITY_URGENT_DISPLAY + 2,
-  ANDROID_PRIORITY_URGENT_DISPLAY         // 10 (MAX_PRIORITY)
-};
-
-enum PaletteStatus PaletteSchedSetPriority(int32_t tid, int32_t managed_priority) {
-  if (managed_priority < art::palette::kMinManagedThreadPriority ||
-      managed_priority > art::palette::kMaxManagedThreadPriority) {
-    return PaletteStatus::kInvalidArgument;
-  }
-  int new_nice = kNiceValues[managed_priority - art::palette::kMinManagedThreadPriority];
-
-  // TODO: b/18249098 The code below is broken. It uses getpriority() as a proxy for whether a
-  // thread is already in the SP_FOREGROUND cgroup. This is not necessarily true for background
-  // processes, where all threads are in the SP_BACKGROUND cgroup. This means that callers will
-  // have to call setPriority twice to do what they want :
-  //
-  //     Thread.setPriority(Thread.MIN_PRIORITY);  // no-op wrt to cgroups
-  //     Thread.setPriority(Thread.MAX_PRIORITY);  // will actually change cgroups.
-  if (new_nice >= ANDROID_PRIORITY_BACKGROUND) {
-    set_sched_policy(tid, SP_BACKGROUND);
-  } else if (getpriority(PRIO_PROCESS, tid) >= ANDROID_PRIORITY_BACKGROUND) {
-    set_sched_policy(tid, SP_FOREGROUND);
-  }
-
-  if (setpriority(PRIO_PROCESS, tid, new_nice) != 0) {
-    return PaletteStatus::kCheckErrno;
-  }
-  return PaletteStatus::kOkay;
-}
-
-enum PaletteStatus PaletteSchedGetPriority(int32_t tid, /*out*/int32_t* managed_priority) {
-  errno = 0;
-  int native_priority = getpriority(PRIO_PROCESS, tid);
-  if (native_priority == -1 && errno != 0) {
-    *managed_priority = art::palette::kNormalManagedThreadPriority;
-    return PaletteStatus::kCheckErrno;
-  }
-
-  for (int p = art::palette::kMinManagedThreadPriority;
-       p <= art::palette::kMaxManagedThreadPriority;
-       p = p + 1) {
-    int index = p - art::palette::kMinManagedThreadPriority;
-    if (native_priority >= kNiceValues[index]) {
-      *managed_priority = p;
-      return PaletteStatus::kOkay;
-    }
-  }
-  *managed_priority = art::palette::kMaxManagedThreadPriority;
-  return PaletteStatus::kOkay;
-}
-
-enum PaletteStatus PaletteWriteCrashThreadStacks(/*in*/const char* stacks, size_t stacks_len) {
-  android::base::unique_fd tombstone_fd;
-  android::base::unique_fd output_fd;
-
-  if (!tombstoned_connect(getpid(), &tombstone_fd, &output_fd, kDebuggerdJavaBacktrace)) {
-    // Failure here could be due to file descriptor resource exhaustion
-    // so write the stack trace message to the log in case it helps
-    // debug that.
-    LOG(INFO) << std::string_view(stacks, stacks_len);
-    // tombstoned_connect() logs failure reason.
-    return PaletteStatus::kFailedCheckLog;
-  }
-
-  PaletteStatus status = PaletteStatus::kOkay;
-  if (!android::base::WriteFully(output_fd, stacks, stacks_len)) {
-    PLOG(ERROR) << "Failed to write tombstoned output";
-    TEMP_FAILURE_RETRY(ftruncate(output_fd, 0));
-    status = PaletteStatus::kFailedCheckLog;
-  }
-
-  if (TEMP_FAILURE_RETRY(fdatasync(output_fd)) == -1 && errno != EINVAL) {
-    // Ignore EINVAL so we don't report failure if we just tried to flush a pipe
-    // or socket.
-    if (status == PaletteStatus::kOkay) {
-      PLOG(ERROR) << "Failed to fsync tombstoned output";
-      status = PaletteStatus::kFailedCheckLog;
-    }
-    TEMP_FAILURE_RETRY(ftruncate(output_fd, 0));
-    TEMP_FAILURE_RETRY(fdatasync(output_fd));
-  }
-
-  if (close(output_fd.release()) == -1 && errno != EINTR) {
-    if (status == PaletteStatus::kOkay) {
-      PLOG(ERROR) << "Failed to close tombstoned output";
-      status = PaletteStatus::kFailedCheckLog;
-    }
-  }
-
-  if (!tombstoned_notify_completion(tombstone_fd)) {
-    // tombstoned_notify_completion() logs failure.
-    status = PaletteStatus::kFailedCheckLog;
-  }
-
-  return status;
-}
-
-enum PaletteStatus PaletteTraceEnabled(/*out*/int32_t* enabled) {
-  *enabled = (ATRACE_ENABLED() != 0) ? 1 : 0;
-  return PaletteStatus::kOkay;
-}
-
-enum PaletteStatus PaletteTraceBegin(const char* name) {
-  ATRACE_BEGIN(name);
-  return PaletteStatus::kOkay;
-}
-
-enum PaletteStatus PaletteTraceEnd() {
-  ATRACE_END();
-  return PaletteStatus::kOkay;
-}
-
-enum PaletteStatus PaletteTraceIntegerValue(const char* name, int32_t value) {
-  ATRACE_INT(name, value);
-  return PaletteStatus::kOkay;
-}
-
-// Flag whether to use legacy ashmem or current (b/139855428)
-static std::atomic_bool g_assume_legacy_ashmemd(false);
-
-enum PaletteStatus PaletteAshmemCreateRegion(const char* name, size_t size, int* fd) {
-  if (g_assume_legacy_ashmemd.load(std::memory_order_acquire) == false) {
-    // Current platform behaviour which open ashmem fd in process (b/139855428)
-    *fd = ashmem_create_region(name, size);
-    if (*fd >= 0) {
-      return PaletteStatus::kOkay;
-    }
-  }
-
-  // Try legacy behavior just required for ART build bots which may be running tests on older
-  // platform builds.
-
-  // We implement our own ashmem creation, as the libcutils implementation does
-  // a binder call, and our only use of ashmem in ART is for zygote, which
-  // cannot communicate to binder.
-  *fd = TEMP_FAILURE_RETRY(open("/dev/ashmem", O_RDWR | O_CLOEXEC));
-  if (*fd == -1) {
-    return PaletteStatus::kCheckErrno;
-  }
-
-  if (TEMP_FAILURE_RETRY(ioctl(*fd, ASHMEM_SET_SIZE, size)) < 0) {
-    goto error;
-  }
-
-  if (name != nullptr) {
-    char buf[ASHMEM_NAME_LEN] = {0};
-    strlcpy(buf, name, sizeof(buf));
-    if (TEMP_FAILURE_RETRY(ioctl(*fd, ASHMEM_SET_NAME, buf)) < 0) {
-      goto error;
-    }
-  }
-
-  g_assume_legacy_ashmemd.store(true, std::memory_order_release);
-  return PaletteStatus::kOkay;
-
-error:
-  // Save errno before closing.
-  int save_errno = errno;
-  close(*fd);
-  errno = save_errno;
-  return PaletteStatus::kCheckErrno;
-}
-
-enum PaletteStatus PaletteAshmemSetProtRegion(int fd, int prot) {
-  if (!g_assume_legacy_ashmemd.load(std::memory_order_acquire)) {
-    if (ashmem_set_prot_region(fd, prot) < 0) {
-      return PaletteStatus::kCheckErrno;
-    }
-  } else if (TEMP_FAILURE_RETRY(ioctl(fd, ASHMEM_SET_PROT_MASK, prot)) < 0) {
-    // Legacy behavior just required for ART build bots which may be running tests on older
-    // platform builds.
-    return PaletteStatus::kCheckErrno;
-  }
-  return PaletteStatus::kOkay;
-}
diff --git a/tools/buildbot-build.sh b/tools/buildbot-build.sh
index fb171a4..b7b82cc 100755
--- a/tools/buildbot-build.sh
+++ b/tools/buildbot-build.sh
@@ -35,7 +35,7 @@
 fi
 
 java_libraries_dir=${out_dir}/target/common/obj/JAVA_LIBRARIES
-common_targets="vogar core-tests apache-harmony-jdwp-tests-hostdex jsr166-tests mockito-target"
+common_targets="vogar core-tests apache-harmony-jdwp-tests-hostdex jsr166-tests libartpalette-system mockito-target"
 mode="target"
 j_arg="-j$(nproc)"
 showcommands=
