Merge "Create directory for /data/misc/connectivityblobdb" into main
diff --git a/bootstat/bootstat.cpp b/bootstat/bootstat.cpp
index 2d55e5a..d402bf1 100644
--- a/bootstat/bootstat.cpp
+++ b/bootstat/bootstat.cpp
@@ -830,7 +830,7 @@
   return subReason;
 }
 
-bool addKernelPanicSubReason(const pstoreConsole& console, std::string& ret) {
+void addKernelPanicSubReason(const pstoreConsole& console, std::string& ret) {
   // Check for kernel panic types to refine information
   if ((console.rfind("SysRq : Trigger a crash") != std::string::npos) ||
       (console.rfind("PC is at sysrq_handle_crash+") != std::string::npos)) {
@@ -842,63 +842,61 @@
     if (pos != std::string::npos) {
       ret += "," + getSubreason(console, pos + strlen(sysrqSubreason), /* quoted */ true);
     }
-    return true;
+    return;
   }
   if (console.rfind("Unable to handle kernel NULL pointer dereference at virtual address") !=
       std::string::npos) {
     ret = "kernel_panic,null";
-    return true;
+    return;
   }
   if (console.rfind("Kernel BUG at ") != std::string::npos) {
     ret = "kernel_panic,bug";
-    return true;
+    return;
   }
 
   std::string panic("Kernel panic - not syncing: ");
   auto pos = console.rfind(panic);
-  if (pos != std::string::npos) {
-    static const std::vector<std::pair<const std::string, const std::string>> panicReasons = {
-        {"Out of memory", "oom"},
-        {"out of memory", "oom"},
-        {"Oh boy, that early out of memory", "oom"},  // omg
-        {"BUG!", "bug"},
-        {"hung_task: blocked tasks", "hung"},
-        {"audit: ", "audit"},
-        {"scheduling while atomic", "atomic"},
-        {"Attempted to kill init!", "init"},
-        {"Requested init", "init"},
-        {"No working init", "init"},
-        {"Could not decompress init", "init"},
-        {"RCU Stall", "hung,rcu"},
-        {"stack-protector", "stack"},
-        {"kernel stack overflow", "stack"},
-        {"Corrupt kernel stack", "stack"},
-        {"low stack detected", "stack"},
-        {"corrupted stack end", "stack"},
-        {"subsys-restart: Resetting the SoC - modem crashed.", "modem"},
-        {"subsys-restart: Resetting the SoC - adsp crashed.", "adsp"},
-        {"subsys-restart: Resetting the SoC - dsps crashed.", "dsps"},
-        {"subsys-restart: Resetting the SoC - wcnss crashed.", "wcnss"},
-    };
+  if (pos == std::string::npos) return;
 
-    ret = "kernel_panic";
-    for (auto& s : panicReasons) {
-      if (console.find(panic + s.first, pos) != std::string::npos) {
-        ret += "," + s.second;
-        return true;
-      }
+  static const std::vector<std::pair<const std::string, const std::string>> panicReasons = {
+      {"Out of memory", "oom"},
+      {"out of memory", "oom"},
+      {"Oh boy, that early out of memory", "oom"},  // omg
+      {"BUG!", "bug"},
+      {"hung_task: blocked tasks", "hung"},
+      {"audit: ", "audit"},
+      {"scheduling while atomic", "atomic"},
+      {"Attempted to kill init!", "init"},
+      {"Requested init", "init"},
+      {"No working init", "init"},
+      {"Could not decompress init", "init"},
+      {"RCU Stall", "hung,rcu"},
+      {"stack-protector", "stack"},
+      {"kernel stack overflow", "stack"},
+      {"Corrupt kernel stack", "stack"},
+      {"low stack detected", "stack"},
+      {"corrupted stack end", "stack"},
+      {"subsys-restart: Resetting the SoC - modem crashed.", "modem"},
+      {"subsys-restart: Resetting the SoC - adsp crashed.", "adsp"},
+      {"subsys-restart: Resetting the SoC - dsps crashed.", "dsps"},
+      {"subsys-restart: Resetting the SoC - wcnss crashed.", "wcnss"},
+  };
+
+  ret = "kernel_panic";
+  for (auto& s : panicReasons) {
+    if (console.find(panic + s.first, pos) != std::string::npos) {
+      ret += "," + s.second;
+      return;
     }
-    auto reason = getSubreason(console, pos + panic.length(), /* newline */ false);
-    if (reason.length() > 3) {
-      ret += "," + reason;
-    }
-    return true;
   }
-  return false;
+  auto reason = getSubreason(console, pos + panic.length(), /* newline */ false);
+  if (reason.length() > 3) {
+    ret += "," + reason;
+  }
 }
 
-bool addKernelPanicSubReason(const std::string& content, std::string& ret) {
-  return addKernelPanicSubReason(pstoreConsole(content), ret);
+void addKernelPanicSubReason(const std::string& content, std::string& ret) {
+  addKernelPanicSubReason(pstoreConsole(content), ret);
 }
 
 const char system_reboot_reason_property[] = "sys.boot.reason";
@@ -1079,12 +1077,7 @@
       }
 
       // Check for kernel panics, allowed to override reboot command.
-      if (!addKernelPanicSubReason(console, ret) &&
-          // check for long-press power down
-          ((console.rfind("Power held for ") != std::string::npos) ||
-           (console.rfind("charger: [") != std::string::npos))) {
-        ret = "cold";
-      }
+      (void)addKernelPanicSubReason(console, ret);
     }
 
     // TODO: use the HAL to get battery level (http://b/77725702).
diff --git a/debuggerd/Android.bp b/debuggerd/Android.bp
index 267571b..235fdfd 100644
--- a/debuggerd/Android.bp
+++ b/debuggerd/Android.bp
@@ -21,8 +21,11 @@
     local_include_dirs: ["include"],
     product_variables: {
         debuggable: {
-            cflags: ["-UANDROID_DEBUGGABLE", "-DANDROID_DEBUGGABLE=1"],
-        }
+            cflags: [
+                "-UANDROID_DEBUGGABLE",
+                "-DANDROID_DEBUGGABLE=1",
+            ],
+        },
     },
 }
 
@@ -32,9 +35,10 @@
     recovery_available: true,
     vendor_ramdisk_available: true,
     apex_available: [
+        "com.android.runtime",
         "com.android.virt",
         "//apex_available:platform",
-   ],
+    ],
 }
 
 cc_library_shared {
@@ -85,6 +89,7 @@
 
     export_header_lib_headers: ["libdebuggerd_common_headers"],
     export_include_dirs: ["tombstoned/include"],
+    apex_available: ["com.android.runtime"],
 }
 
 // Core implementation, linked into libdebuggerd_handler and the dynamic linker.
@@ -110,6 +115,9 @@
 
     export_header_lib_headers: ["libdebuggerd_common_headers"],
     export_include_dirs: ["include"],
+    apex_available: [
+        "com.android.runtime",
+    ],
 }
 
 // Implementation with a no-op fallback.
@@ -186,6 +194,41 @@
     export_include_dirs: ["include"],
 }
 
+cc_library {
+    name: "libdebuggerd_tombstone_proto_to_text",
+    defaults: ["debuggerd_defaults"],
+    ramdisk_available: true,
+    recovery_available: true,
+    vendor_ramdisk_available: true,
+
+    local_include_dirs: ["libdebuggerd/include"],
+    export_include_dirs: ["libdebuggerd/include"],
+
+    srcs: [
+        "libdebuggerd/tombstone_proto_to_text.cpp",
+    ],
+
+    header_libs: [
+        "bionic_libc_platform_headers",
+    ],
+
+    static_libs: [
+        "libbase",
+        "liblog_for_runtime_apex",
+        "libunwindstack",
+    ],
+
+    whole_static_libs: [
+        "libtombstone_proto",
+        "libprotobuf-cpp-lite",
+    ],
+
+    apex_available: [
+        "//apex_available:platform",
+        "com.android.runtime",
+    ],
+}
+
 cc_library_static {
     name: "libdebuggerd",
     defaults: ["debuggerd_defaults"],
@@ -199,7 +242,6 @@
         "libdebuggerd/open_files_list.cpp",
         "libdebuggerd/tombstone.cpp",
         "libdebuggerd/tombstone_proto.cpp",
-        "libdebuggerd/tombstone_proto_to_text.cpp",
         "libdebuggerd/utility.cpp",
     ],
 
@@ -217,7 +259,7 @@
     ],
 
     static_libs: [
-        "libdexfile_support",  // libunwindstack dependency
+        "libdexfile_support", // libunwindstack dependency
         "libunwindstack",
         "liblzma",
         "libbase",
@@ -225,6 +267,7 @@
     ],
 
     whole_static_libs: [
+        "libdebuggerd_tombstone_proto_to_text",
         "libasync_safe",
         "gwp_asan_crash_handler",
         "libtombstone_proto",
@@ -259,7 +302,7 @@
         },
         android: {
             runtime_libs: [
-                "libdexfile",           // libdexfile_support dependency
+                "libdexfile", // libdexfile_support dependency
             ],
         },
     },
@@ -276,6 +319,9 @@
             header_libs: ["scudo_headers"],
         },
     },
+    apex_available: [
+        "com.android.runtime",
+    ],
 }
 
 cc_binary {
@@ -309,7 +355,7 @@
         "libdebuggerd/test/elf_fake.cpp",
         "libdebuggerd/test/log_fake.cpp",
         "libdebuggerd/test/open_files_list_test.cpp",
-        "libdebuggerd/test/utility_test.cpp",
+        "libdebuggerd/test/tombstone_proto_to_text_test.cpp",
     ],
 
     target: {
@@ -325,6 +371,11 @@
         },
     },
 
+    sanitize: {
+        memtag_heap: true,
+        memtag_stack: true,
+    },
+
     shared_libs: [
         "libbase",
         "libcutils",
@@ -451,7 +502,7 @@
 
     header_libs: [
         "bionic_libc_platform_headers",
-        "libdebuggerd_common_headers"
+        "libdebuggerd_common_headers",
     ],
 
     static_libs: [
@@ -509,7 +560,6 @@
     },
 }
 
-
 // This installs the "other" architecture (so 32-bit on 64-bit device).
 prebuilt_etc {
     name: "crash_dump.policy_other",
diff --git a/debuggerd/TEST_MAPPING b/debuggerd/TEST_MAPPING
index 8633cb8..61d7155 100644
--- a/debuggerd/TEST_MAPPING
+++ b/debuggerd/TEST_MAPPING
@@ -14,5 +14,10 @@
     {
       "name": "debuggerd_test"
     }
+  ],
+  "postsubmit": [
+    {
+      "name": "CtsCrashDetailHostTestCases"
+    }
   ]
 }
diff --git a/debuggerd/client/debuggerd_client.cpp b/debuggerd/client/debuggerd_client.cpp
index bd1e91d..af1bb81 100644
--- a/debuggerd/client/debuggerd_client.cpp
+++ b/debuggerd/client/debuggerd_client.cpp
@@ -116,7 +116,6 @@
 
 bool debuggerd_trigger_dump(pid_t tid, DebuggerdDumpType dump_type, unsigned int timeout_ms,
                             unique_fd output_fd) {
-  pid_t pid = tid;
   if (dump_type == kDebuggerdJavaBacktrace) {
     // Java dumps always get sent to the tgid, so we need to resolve our tid to a tgid.
     android::procinfo::ProcessInfo procinfo;
@@ -125,10 +124,10 @@
       log_error(output_fd, 0, "failed to get process info: %s", error.c_str());
       return false;
     }
-    pid = procinfo.pid;
+    tid = procinfo.pid;
   }
 
-  LOG(INFO) << TAG "started dumping process " << pid;
+  LOG(INFO) << TAG "started dumping process " << tid;
 
   // Rather than try to deal with poll() all the way through the flow, we update
   // the socket timeout between each step (and only use poll() during the final
@@ -172,7 +171,7 @@
 
   InterceptRequest req = {
       .dump_type = dump_type,
-      .pid = pid,
+      .pid = tid,
   };
 
   // Create an intermediate pipe to pass to the other end.
@@ -235,8 +234,8 @@
   // Send the signal.
   const int signal = (dump_type == kDebuggerdJavaBacktrace) ? SIGQUIT : BIONIC_SIGNAL_DEBUGGER;
   sigval val = {.sival_int = (dump_type == kDebuggerdNativeBacktrace) ? 1 : 0};
-  if (sigqueue(pid, signal, val) != 0) {
-    log_error(output_fd, errno, "failed to send signal to pid %d", pid);
+  if (sigqueue(tid, signal, val) != 0) {
+    log_error(output_fd, errno, "failed to send signal to pid %d", tid);
     return false;
   }
 
@@ -299,7 +298,7 @@
     }
   }
 
-  LOG(INFO) << TAG "done dumping process " << pid;
+  LOG(INFO) << TAG "done dumping process " << tid;
 
   return true;
 }
diff --git a/debuggerd/crash_dump.cpp b/debuggerd/crash_dump.cpp
index 3563436..203b485 100644
--- a/debuggerd/crash_dump.cpp
+++ b/debuggerd/crash_dump.cpp
@@ -143,7 +143,7 @@
 }
 
 static bool activity_manager_notify(pid_t pid, int signal, const std::string& amfd_data,
-                                    bool recoverable_gwp_asan_crash) {
+                                    bool recoverable_crash) {
   ATRACE_CALL();
   android::base::unique_fd amfd(socket_local_client(
       "/data/system/ndebugsocket", ANDROID_SOCKET_NAMESPACE_FILESYSTEM, SOCK_STREAM));
@@ -169,7 +169,7 @@
   // Activity Manager protocol:
   //  - 32-bit network-byte-order: pid
   //  - 32-bit network-byte-order: signal number
-  //  - byte: recoverable_gwp_asan_crash
+  //  - byte: recoverable_crash
   //  - bytes: raw text of the dump
   //  - null terminator
 
@@ -185,10 +185,9 @@
     return false;
   }
 
-  uint8_t recoverable_gwp_asan_crash_byte = recoverable_gwp_asan_crash ? 1 : 0;
-  if (!android::base::WriteFully(amfd, &recoverable_gwp_asan_crash_byte,
-                                 sizeof(recoverable_gwp_asan_crash_byte))) {
-    PLOG(ERROR) << "AM recoverable_gwp_asan_crash_byte write failed";
+  uint8_t recoverable_crash_byte = recoverable_crash ? 1 : 0;
+  if (!android::base::WriteFully(amfd, &recoverable_crash_byte, sizeof(recoverable_crash_byte))) {
+    PLOG(ERROR) << "AM recoverable_crash_byte write failed";
     return false;
   }
 
@@ -280,11 +279,11 @@
 
 static void ReadCrashInfo(unique_fd& fd, siginfo_t* siginfo,
                           std::unique_ptr<unwindstack::Regs>* regs, ProcessInfo* process_info,
-                          bool* recoverable_gwp_asan_crash) {
+                          bool* recoverable_crash) {
   std::aligned_storage<sizeof(CrashInfo) + 1, alignof(CrashInfo)>::type buf;
   CrashInfo* crash_info = reinterpret_cast<CrashInfo*>(&buf);
   ssize_t rc = TEMP_FAILURE_RETRY(read(fd.get(), &buf, sizeof(buf)));
-  *recoverable_gwp_asan_crash = false;
+  *recoverable_crash = false;
   if (rc == -1) {
     PLOG(FATAL) << "failed to read target ucontext";
   } else {
@@ -317,10 +316,12 @@
       process_info->gwp_asan_state = crash_info->data.d.gwp_asan_state;
       process_info->gwp_asan_metadata = crash_info->data.d.gwp_asan_metadata;
       process_info->scudo_stack_depot = crash_info->data.d.scudo_stack_depot;
+      process_info->scudo_stack_depot_size = crash_info->data.d.scudo_stack_depot_size;
       process_info->scudo_region_info = crash_info->data.d.scudo_region_info;
       process_info->scudo_ring_buffer = crash_info->data.d.scudo_ring_buffer;
       process_info->scudo_ring_buffer_size = crash_info->data.d.scudo_ring_buffer_size;
-      *recoverable_gwp_asan_crash = crash_info->data.d.recoverable_gwp_asan_crash;
+      *recoverable_crash = crash_info->data.d.recoverable_crash;
+      process_info->crash_detail_page = crash_info->data.d.crash_detail_page;
       FALLTHROUGH_INTENDED;
     case 1:
     case 2:
@@ -485,7 +486,7 @@
   std::map<pid_t, ThreadInfo> thread_info;
   siginfo_t siginfo;
   std::string error;
-  bool recoverable_gwp_asan_crash = false;
+  bool recoverable_crash = false;
 
   {
     ATRACE_NAME("ptrace");
@@ -537,8 +538,7 @@
 
       if (thread == g_target_thread) {
         // Read the thread's registers along with the rest of the crash info out of the pipe.
-        ReadCrashInfo(input_pipe, &siginfo, &info.registers, &process_info,
-                      &recoverable_gwp_asan_crash);
+        ReadCrashInfo(input_pipe, &siginfo, &info.registers, &process_info, &recoverable_crash);
         info.siginfo = &siginfo;
         info.signo = info.siginfo->si_signo;
 
@@ -668,7 +668,7 @@
   if (fatal_signal) {
     // Don't try to notify ActivityManager if it just crashed, or we might hang until timeout.
     if (thread_info[target_process].thread_name != "system_server") {
-      activity_manager_notify(target_process, signo, amfd_data, recoverable_gwp_asan_crash);
+      activity_manager_notify(target_process, signo, amfd_data, recoverable_crash);
     }
   }
 
diff --git a/debuggerd/crasher/Android.bp b/debuggerd/crasher/Android.bp
index fe1689c..4c6a400 100644
--- a/debuggerd/crasher/Android.bp
+++ b/debuggerd/crasher/Android.bp
@@ -15,7 +15,7 @@
         "-fstack-protector-all",
         "-Wno-date-time",
     ],
-    tidy: false,  // crasher.cpp tests many memory access errors
+    tidy: false, // crasher.cpp tests many memory access errors
     srcs: ["crasher.cpp"],
     arch: {
         arm: {
diff --git a/debuggerd/debuggerd.cpp b/debuggerd/debuggerd.cpp
index 26726cf..0d4b91f 100644
--- a/debuggerd/debuggerd.cpp
+++ b/debuggerd/debuggerd.cpp
@@ -91,6 +91,15 @@
     }
   }
 
+  // unfreeze if pid is frozen.
+  const std::string freeze_file = android::base::StringPrintf(
+      "/sys/fs/cgroup/uid_%d/pid_%d/cgroup.freeze", proc_info.uid, proc_info.pid);
+  if (std::string freeze_status;
+      android::base::ReadFileToString(freeze_file, &freeze_status) && freeze_status[0] == '1') {
+    android::base::WriteStringToFile("0", freeze_file);
+    // we don't restore the frozen state as this is considered a benign change.
+  }
+
   unique_fd output_fd(fcntl(STDOUT_FILENO, F_DUPFD_CLOEXEC, 0));
   if (output_fd.get() == -1) {
     err(1, "failed to fcntl dup stdout");
diff --git a/debuggerd/debuggerd_test.cpp b/debuggerd/debuggerd_test.cpp
index a6d8226..526e2ca 100644
--- a/debuggerd/debuggerd_test.cpp
+++ b/debuggerd/debuggerd_test.cpp
@@ -21,6 +21,7 @@
 #include <linux/prctl.h>
 #include <malloc.h>
 #include <pthread.h>
+#include <setjmp.h>
 #include <stdlib.h>
 #include <sys/capability.h>
 #include <sys/mman.h>
@@ -37,6 +38,7 @@
 #include <string>
 #include <thread>
 
+#include <android/crash_detail.h>
 #include <android/dlext.h>
 #include <android/fdsan.h>
 #include <android/set_abort_message.h>
@@ -600,6 +602,54 @@
 #endif
 }
 
+__attribute__((noinline)) void mte_illegal_setjmp_helper(jmp_buf& jump_buf) {
+  // This frame is at least 8 bytes for storing and restoring the LR before the
+  // setjmp below. So this can never get an empty stack frame, even if we omit
+  // the frame pointer. So, the SP of this is always less (numerically) than the
+  // calling function frame.
+  setjmp(jump_buf);
+}
+
+TEST_F(CrasherTest, mte_illegal_setjmp) {
+  // This setjmp is illegal because it jumps back into a function that already returned.
+  // Quoting man 3 setjmp:
+  //     If the function which called setjmp() returns before longjmp() is
+  //     called, the behavior is undefined.  Some kind of subtle or
+  //     unsubtle chaos is sure to result.
+  // https://man7.org/linux/man-pages/man3/longjmp.3.html
+#if defined(__aarch64__)
+  if (!mte_supported()) {
+    GTEST_SKIP() << "Requires MTE";
+  }
+
+  int intercept_result;
+  unique_fd output_fd;
+  StartProcess([&]() {
+    SetTagCheckingLevelSync();
+    jmp_buf jump_buf;
+    mte_illegal_setjmp_helper(jump_buf);
+    longjmp(jump_buf, 1);
+  });
+
+  StartIntercept(&output_fd);
+  FinishCrasher();
+  AssertDeath(SIGABRT);
+  FinishIntercept(&intercept_result);
+
+  ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";
+
+  std::string result;
+  ConsumeFd(std::move(output_fd), &result);
+
+  // In our test-case, we have a NEGATIVE stack adjustment, which is being
+  // interpreted as unsigned integer, and thus is "too large".
+  // TODO(fmayer): fix the error message for this
+  ASSERT_MATCH(result, R"(memtag_handle_longjmp: stack adjustment too large)");
+#else
+  GTEST_SKIP() << "Requires aarch64";
+#endif
+}
+
 TEST_F(CrasherTest, mte_async) {
 #if defined(__aarch64__)
   if (!mte_supported()) {
@@ -939,6 +989,233 @@
   ASSERT_MATCH(result, R"(Abort message: 'x{4045}')");
 }
 
+static char g_crash_detail_value_changes[] = "crash_detail_value";
+static char g_crash_detail_value[] = "crash_detail_value";
+static char g_crash_detail_value2[] = "crash_detail_value2";
+
+inline crash_detail_t* _Nullable android_register_crash_detail_strs(const char* _Nonnull name,
+                                                                    const char* _Nonnull data) {
+  return android_crash_detail_register(name, strlen(name), data, strlen(data));
+}
+
+TEST_F(CrasherTest, crash_detail_single) {
+  int intercept_result;
+  unique_fd output_fd;
+  StartProcess([]() {
+    android_register_crash_detail_strs("CRASH_DETAIL_NAME", g_crash_detail_value);
+    abort();
+  });
+  StartIntercept(&output_fd);
+  FinishCrasher();
+  AssertDeath(SIGABRT);
+  FinishIntercept(&intercept_result);
+
+  ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";
+
+  std::string result;
+  ConsumeFd(std::move(output_fd), &result);
+  ASSERT_MATCH(result, R"(CRASH_DETAIL_NAME: 'crash_detail_value')");
+}
+
+TEST_F(CrasherTest, crash_detail_replace_data) {
+  int intercept_result;
+  unique_fd output_fd;
+  StartProcess([]() {
+    auto *cd = android_register_crash_detail_strs("CRASH_DETAIL_NAME", "original_data");
+    android_crash_detail_replace_data(cd, "new_data", strlen("new_data"));
+    abort();
+  });
+  StartIntercept(&output_fd);
+  FinishCrasher();
+  AssertDeath(SIGABRT);
+  FinishIntercept(&intercept_result);
+
+  ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";
+
+  std::string result;
+  ConsumeFd(std::move(output_fd), &result);
+  ASSERT_MATCH(result, R"(CRASH_DETAIL_NAME: 'new_data')");
+  // Ensure the old one no longer shows up, i.e. that we actually replaced
+  // it, not added a new one.
+  ASSERT_NOT_MATCH(result, R"(CRASH_DETAIL_NAME: 'original_data')");
+}
+
+TEST_F(CrasherTest, crash_detail_replace_name) {
+  int intercept_result;
+  unique_fd output_fd;
+  StartProcess([]() {
+    auto *cd = android_register_crash_detail_strs("old_name", g_crash_detail_value);
+    android_crash_detail_replace_name(cd, "new_name", strlen("new_name"));
+    abort();
+  });
+  StartIntercept(&output_fd);
+  FinishCrasher();
+  AssertDeath(SIGABRT);
+  FinishIntercept(&intercept_result);
+
+  ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";
+
+  std::string result;
+  ConsumeFd(std::move(output_fd), &result);
+  ASSERT_MATCH(result, R"(new_name: 'crash_detail_value')");
+  // Ensure the old one no longer shows up, i.e. that we actually replaced
+  // it, not added a new one.
+  ASSERT_NOT_MATCH(result, R"(old_name: 'crash_detail_value')");
+}
+
+TEST_F(CrasherTest, crash_detail_single_byte_name) {
+  int intercept_result;
+  unique_fd output_fd;
+  StartProcess([]() {
+    android_register_crash_detail_strs("CRASH_DETAIL_NAME\1", g_crash_detail_value);
+    abort();
+  });
+  StartIntercept(&output_fd);
+  FinishCrasher();
+  AssertDeath(SIGABRT);
+  FinishIntercept(&intercept_result);
+
+  ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";
+
+  std::string result;
+  ConsumeFd(std::move(output_fd), &result);
+  ASSERT_MATCH(result, R"(CRASH_DETAIL_NAME\\1: 'crash_detail_value')");
+}
+
+
+TEST_F(CrasherTest, crash_detail_single_bytes) {
+  int intercept_result;
+  unique_fd output_fd;
+  StartProcess([]() {
+    android_crash_detail_register("CRASH_DETAIL_NAME", strlen("CRASH_DETAIL_NAME"), "\1",
+                                  sizeof("\1"));
+    abort();
+  });
+  StartIntercept(&output_fd);
+  FinishCrasher();
+  AssertDeath(SIGABRT);
+  FinishIntercept(&intercept_result);
+
+  ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";
+
+  std::string result;
+  ConsumeFd(std::move(output_fd), &result);
+  ASSERT_MATCH(result, R"(CRASH_DETAIL_NAME: '\\1\\0')");
+}
+
+TEST_F(CrasherTest, crash_detail_mixed) {
+  int intercept_result;
+  unique_fd output_fd;
+  StartProcess([]() {
+    const char data[] = "helloworld\1\255\3";
+    android_register_crash_detail_strs("CRASH_DETAIL_NAME", data);
+    abort();
+  });
+  StartIntercept(&output_fd);
+  FinishCrasher();
+  AssertDeath(SIGABRT);
+  FinishIntercept(&intercept_result);
+
+  ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";
+
+  std::string result;
+  ConsumeFd(std::move(output_fd), &result);
+  ASSERT_MATCH(result, R"(CRASH_DETAIL_NAME: 'helloworld\\1\\255\\3')");
+}
+
+TEST_F(CrasherTest, crash_detail_many) {
+  int intercept_result;
+  unique_fd output_fd;
+  StartProcess([]() {
+    for (int i = 0; i < 1000; ++i) {
+      std::string name = "CRASH_DETAIL_NAME" + std::to_string(i);
+      std::string value = "CRASH_DETAIL_VALUE" + std::to_string(i);
+      auto* h = android_register_crash_detail_strs(name.data(), value.data());
+      android_crash_detail_unregister(h);
+    }
+
+    android_register_crash_detail_strs("FINAL_NAME", "FINAL_VALUE");
+    android_register_crash_detail_strs("FINAL_NAME2", "FINAL_VALUE2");
+    abort();
+  });
+  StartIntercept(&output_fd);
+  FinishCrasher();
+  AssertDeath(SIGABRT);
+  FinishIntercept(&intercept_result);
+
+  ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";
+
+  std::string result;
+  ConsumeFd(std::move(output_fd), &result);
+  ASSERT_NOT_MATCH(result, "CRASH_DETAIL_NAME");
+  ASSERT_NOT_MATCH(result, "CRASH_DETAIL_VALUE");
+  ASSERT_MATCH(result, R"(FINAL_NAME: 'FINAL_VALUE')");
+  ASSERT_MATCH(result, R"(FINAL_NAME2: 'FINAL_VALUE2')");
+}
+
+TEST_F(CrasherTest, crash_detail_single_changes) {
+  int intercept_result;
+  unique_fd output_fd;
+  StartProcess([]() {
+    android_register_crash_detail_strs("CRASH_DETAIL_NAME", g_crash_detail_value_changes);
+    g_crash_detail_value_changes[0] = 'C';
+    abort();
+  });
+  StartIntercept(&output_fd);
+  FinishCrasher();
+  AssertDeath(SIGABRT);
+  FinishIntercept(&intercept_result);
+
+  ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";
+
+  std::string result;
+  ConsumeFd(std::move(output_fd), &result);
+  ASSERT_MATCH(result, R"(CRASH_DETAIL_NAME: 'Crash_detail_value')");
+}
+
+TEST_F(CrasherTest, crash_detail_multiple) {
+  int intercept_result;
+  unique_fd output_fd;
+  StartProcess([]() {
+    android_register_crash_detail_strs("CRASH_DETAIL_NAME", g_crash_detail_value);
+    android_register_crash_detail_strs("CRASH_DETAIL_NAME2", g_crash_detail_value2);
+    abort();
+  });
+  StartIntercept(&output_fd);
+  FinishCrasher();
+  AssertDeath(SIGABRT);
+  FinishIntercept(&intercept_result);
+
+  ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";
+
+  std::string result;
+  ConsumeFd(std::move(output_fd), &result);
+  ASSERT_MATCH(result, R"(CRASH_DETAIL_NAME: 'crash_detail_value')");
+  ASSERT_MATCH(result, R"(CRASH_DETAIL_NAME2: 'crash_detail_value2')");
+}
+
+TEST_F(CrasherTest, crash_detail_remove) {
+  int intercept_result;
+  unique_fd output_fd;
+  StartProcess([]() {
+    auto* detail1 = android_register_crash_detail_strs("CRASH_DETAIL_NAME", g_crash_detail_value);
+    android_crash_detail_unregister(detail1);
+    android_register_crash_detail_strs("CRASH_DETAIL_NAME2", g_crash_detail_value2);
+    abort();
+  });
+  StartIntercept(&output_fd);
+  FinishCrasher();
+  AssertDeath(SIGABRT);
+  FinishIntercept(&intercept_result);
+
+  ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";
+
+  std::string result;
+  ConsumeFd(std::move(output_fd), &result);
+  ASSERT_NOT_MATCH(result, R"(CRASH_DETAIL_NAME: 'crash_detail_value')");
+  ASSERT_MATCH(result, R"(CRASH_DETAIL_NAME2: 'crash_detail_value2')");
+}
+
 TEST_F(CrasherTest, abort_message_newline_trimmed) {
   int intercept_result;
   unique_fd output_fd;
@@ -2221,28 +2498,10 @@
   ASSERT_MATCH(result, match_str);
 }
 
-TEST(tombstoned, proto) {
-  const pid_t self = getpid();
-  unique_fd tombstoned_socket, text_fd, proto_fd;
-  ASSERT_TRUE(
-      tombstoned_connect(self, &tombstoned_socket, &text_fd, &proto_fd, kDebuggerdTombstoneProto));
-
-  tombstoned_notify_completion(tombstoned_socket.get());
-
-  ASSERT_NE(-1, text_fd.get());
-  ASSERT_NE(-1, proto_fd.get());
-
-  struct stat text_st;
-  ASSERT_EQ(0, fstat(text_fd.get(), &text_st));
-
-  // Give tombstoned some time to link the files into place.
-  std::this_thread::sleep_for(100ms);
-
-  // Find the tombstone.
-  std::optional<std::string> tombstone_file;
+void CheckForTombstone(const struct stat& text_st, std::optional<std::string>& tombstone_file) {
+  static std::regex tombstone_re("tombstone_\\d+");
   std::unique_ptr<DIR, decltype(&closedir)> dir_h(opendir("/data/tombstones"), closedir);
   ASSERT_TRUE(dir_h != nullptr);
-  std::regex tombstone_re("tombstone_\\d+");
   dirent* entry;
   while ((entry = readdir(dir_h.get())) != nullptr) {
     if (!std::regex_match(entry->d_name, tombstone_re)) {
@@ -2260,8 +2519,38 @@
       break;
     }
   }
+}
 
-  ASSERT_TRUE(tombstone_file);
+TEST(tombstoned, proto) {
+  const pid_t self = getpid();
+  unique_fd tombstoned_socket, text_fd, proto_fd;
+  ASSERT_TRUE(
+      tombstoned_connect(self, &tombstoned_socket, &text_fd, &proto_fd, kDebuggerdTombstoneProto));
+
+  tombstoned_notify_completion(tombstoned_socket.get());
+
+  ASSERT_NE(-1, text_fd.get());
+  ASSERT_NE(-1, proto_fd.get());
+
+  struct stat text_st;
+  ASSERT_EQ(0, fstat(text_fd.get(), &text_st));
+
+  std::optional<std::string> tombstone_file;
+  // Allow up to 5 seconds for the tombstone to be written to the system.
+  const auto max_wait_time = std::chrono::seconds(5) * android::base::HwTimeoutMultiplier();
+  const auto start = std::chrono::high_resolution_clock::now();
+  while (true) {
+    std::this_thread::sleep_for(100ms);
+    CheckForTombstone(text_st, tombstone_file);
+    if (tombstone_file) {
+      break;
+    }
+    if (std::chrono::high_resolution_clock::now() - start > max_wait_time) {
+      break;
+    }
+  }
+
+  ASSERT_TRUE(tombstone_file) << "Timed out trying to find tombstone file.";
   std::string proto_path = tombstone_file.value() + ".pb";
 
   struct stat proto_fd_st;
@@ -2407,7 +2696,7 @@
   match_str += format_full_pointer(crash_uptr);
   ASSERT_MATCH(result, match_str);
 
-  ASSERT_MATCH(result, R"(\nmemory map \(.*\): \(fault address prefixed with --->)\n)");
+  ASSERT_MATCH(result, R"(\nmemory map \(.*\): \(fault address prefixed with --->\)\n)");
 
   // Verifies that the fault address error message is at the end of the
   // maps section. To do this, the check below looks for the start of the
@@ -2459,7 +2748,7 @@
   match_str += format_full_pointer(reinterpret_cast<uintptr_t>(middle_ptr));
   ASSERT_MATCH(result, match_str);
 
-  ASSERT_MATCH(result, R"(\nmemory map \(.*\): \(fault address prefixed with --->)\n)");
+  ASSERT_MATCH(result, R"(\nmemory map \(.*\): \(fault address prefixed with --->\)\n)");
 
   match_str = android::base::StringPrintf(
       R"(    %s.*\n--->Fault address falls at %s between mapped regions\n    %s)",
@@ -2497,7 +2786,7 @@
   match_str += format_full_pointer(reinterpret_cast<uintptr_t>(ptr));
   ASSERT_MATCH(result, match_str);
 
-  ASSERT_MATCH(result, R"(\nmemory map \(.*\): \(fault address prefixed with --->)\n)");
+  ASSERT_MATCH(result, R"(\nmemory map \(.*\): \(fault address prefixed with --->\)\n)");
 
   match_str = android::base::StringPrintf(R"(\n--->%s.*\n)", format_pointer(ptr).c_str());
   ASSERT_MATCH(result, match_str);
diff --git a/debuggerd/handler/debuggerd_handler.cpp b/debuggerd/handler/debuggerd_handler.cpp
index 01365f2..25031bf 100644
--- a/debuggerd/handler/debuggerd_handler.cpp
+++ b/debuggerd/handler/debuggerd_handler.cpp
@@ -275,10 +275,6 @@
   }
 }
 
-static pid_t __fork() {
-  return clone(nullptr, nullptr, 0, nullptr);
-}
-
 // Double-clone, with CLONE_FILES to share the file descriptor table for kcmp validation.
 // Returns 0 in the orphaned child, the pid of the orphan in the original process, or -1 on failure.
 static void create_vm_process() {
@@ -395,7 +391,9 @@
     ASSERT_SAME_OFFSET(scudo_region_info, scudo_region_info);
     ASSERT_SAME_OFFSET(scudo_ring_buffer, scudo_ring_buffer);
     ASSERT_SAME_OFFSET(scudo_ring_buffer_size, scudo_ring_buffer_size);
-    ASSERT_SAME_OFFSET(recoverable_gwp_asan_crash, recoverable_gwp_asan_crash);
+    ASSERT_SAME_OFFSET(scudo_stack_depot_size, scudo_stack_depot_size);
+    ASSERT_SAME_OFFSET(recoverable_crash, recoverable_crash);
+    ASSERT_SAME_OFFSET(crash_detail_page, crash_detail_page);
 #undef ASSERT_SAME_OFFSET
 
     iovs[3] = {.iov_base = &thread_info->process_info,
@@ -424,7 +422,7 @@
   }
 
   // Don't use fork(2) to avoid calling pthread_atfork handlers.
-  pid_t crash_dump_pid = __fork();
+  pid_t crash_dump_pid = _Fork();
   if (crash_dump_pid == -1) {
     async_safe_format_log(ANDROID_LOG_FATAL, "libc",
                           "failed to fork in debuggerd signal handler: %s", strerror(errno));
@@ -571,6 +569,7 @@
   }
 
   gwp_asan_callbacks_t gwp_asan_callbacks = {};
+  bool recoverable_gwp_asan_crash = false;
   if (g_callbacks.get_gwp_asan_callbacks != nullptr) {
     // GWP-ASan catches use-after-free and heap-buffer-overflow by using PROT_NONE
     // guard pages, which lead to SEGV. Normally, debuggerd prints a bug report
@@ -585,10 +584,30 @@
         gwp_asan_callbacks.debuggerd_gwp_asan_post_crash_report &&
         gwp_asan_callbacks.debuggerd_needs_gwp_asan_recovery(info->si_addr)) {
       gwp_asan_callbacks.debuggerd_gwp_asan_pre_crash_report(info->si_addr);
-      process_info.recoverable_gwp_asan_crash = true;
+      recoverable_gwp_asan_crash = true;
+      process_info.recoverable_crash = true;
     }
   }
 
+  if (info->si_signo == SIGSEGV &&
+      (info->si_code == SEGV_MTESERR || info->si_code == SEGV_MTEAERR) && is_permissive_mte()) {
+    process_info.recoverable_crash = true;
+    // If we are in permissive MTE mode, we do not crash, but instead disable MTE on this thread,
+    // and then let the failing instruction be retried. The second time should work (except
+    // if there is another non-MTE fault).
+    int tagged_addr_ctrl = prctl(PR_GET_TAGGED_ADDR_CTRL, 0, 0, 0, 0);
+    if (tagged_addr_ctrl < 0) {
+      fatal_errno("failed to PR_GET_TAGGED_ADDR_CTRL");
+    }
+    tagged_addr_ctrl = (tagged_addr_ctrl & ~PR_MTE_TCF_MASK) | PR_MTE_TCF_NONE;
+    if (prctl(PR_SET_TAGGED_ADDR_CTRL, tagged_addr_ctrl, 0, 0, 0) < 0) {
+      fatal_errno("failed to PR_SET_TAGGED_ADDR_CTRL");
+    }
+    async_safe_format_log(ANDROID_LOG_ERROR, "libc",
+                          "MTE ERROR DETECTED BUT RUNNING IN PERMISSIVE MODE. CONTINUING.");
+    pthread_mutex_unlock(&crash_mutex);
+  }
+
   // If sival_int is ~0, it means that the fallback handler has been called
   // once before and this function is being called again to dump the stack
   // of a specific thread. It is possible that the prctl call might return 1,
@@ -600,7 +619,7 @@
     // you can only set NO_NEW_PRIVS to 1, and the effect should be at worst a single missing
     // ANR trace.
     debuggerd_fallback_handler(info, ucontext, process_info.abort_msg);
-    if (no_new_privs && process_info.recoverable_gwp_asan_crash) {
+    if (no_new_privs && recoverable_gwp_asan_crash) {
       gwp_asan_callbacks.debuggerd_gwp_asan_post_crash_report(info->si_addr);
       return;
     }
@@ -677,29 +696,14 @@
     // If the signal is fatal, don't unlock the mutex to prevent other crashing threads from
     // starting to dump right before our death.
     pthread_mutex_unlock(&crash_mutex);
-  } else if (process_info.recoverable_gwp_asan_crash) {
-    gwp_asan_callbacks.debuggerd_gwp_asan_post_crash_report(info->si_addr);
+  } else if (process_info.recoverable_crash) {
+    if (recoverable_gwp_asan_crash) {
+      gwp_asan_callbacks.debuggerd_gwp_asan_post_crash_report(info->si_addr);
+    }
     pthread_mutex_unlock(&crash_mutex);
   }
 #ifdef __aarch64__
-  else if (info->si_signo == SIGSEGV &&
-           (info->si_code == SEGV_MTESERR || info->si_code == SEGV_MTEAERR) &&
-           is_permissive_mte()) {
-    // If we are in permissive MTE mode, we do not crash, but instead disable MTE on this thread,
-    // and then let the failing instruction be retried. The second time should work (except
-    // if there is another non-MTE fault).
-    int tagged_addr_ctrl = prctl(PR_GET_TAGGED_ADDR_CTRL, 0, 0, 0, 0);
-    if (tagged_addr_ctrl < 0) {
-      fatal_errno("failed to PR_GET_TAGGED_ADDR_CTRL");
-    }
-    tagged_addr_ctrl = (tagged_addr_ctrl & ~PR_MTE_TCF_MASK) | PR_MTE_TCF_NONE;
-    if (prctl(PR_SET_TAGGED_ADDR_CTRL, tagged_addr_ctrl, 0, 0, 0) < 0) {
-      fatal_errno("failed to PR_SET_TAGGED_ADDR_CTRL");
-    }
-    async_safe_format_log(ANDROID_LOG_ERROR, "libc",
-                          "MTE ERROR DETECTED BUT RUNNING IN PERMISSIVE MODE. CONTINUING.");
-    pthread_mutex_unlock(&crash_mutex);
-  } else if (info->si_signo == SIGSEGV && info->si_code == SEGV_MTEAERR && getppid() == 1) {
+  else if (info->si_signo == SIGSEGV && info->si_code == SEGV_MTEAERR && getppid() == 1) {
     // Back channel to init (see system/core/init/service.cpp) to signal that
     // this process crashed due to an ASYNC MTE fault and should be considered
     // for upgrade to SYNC mode. We are re-using the ART profiler signal, which
@@ -759,18 +763,7 @@
   debuggerd_register_handlers(&action);
 }
 
-// When debuggerd's signal handler is the first handler called, it's great at
-// handling the recoverable GWP-ASan mode. For apps, sigchain (from libart) is
-// always the first signal handler, and so the following function is what
-// sigchain must call before processing the signal. This allows for processing
-// of a potentially recoverable GWP-ASan crash. If the signal requires GWP-ASan
-// recovery, then dump a report (via the regular debuggerd hanndler), and patch
-// up the allocator, and allow the process to continue (indicated by returning
-// 'true'). If the crash has nothing to do with GWP-ASan, or recovery isn't
-// possible, return 'false'.
-bool debuggerd_handle_signal(int signal_number, siginfo_t* info, void* context) {
-  if (signal_number != SIGSEGV || !signal_has_si_addr(info)) return false;
-
+bool debuggerd_handle_gwp_asan_signal(int signal_number, siginfo_t* info, void* context) {
   if (g_callbacks.get_gwp_asan_callbacks == nullptr) return false;
   gwp_asan_callbacks_t gwp_asan_callbacks = g_callbacks.get_gwp_asan_callbacks();
   if (gwp_asan_callbacks.debuggerd_needs_gwp_asan_recovery == nullptr ||
@@ -808,3 +801,33 @@
   pthread_mutex_unlock(&first_crash_mutex);
   return true;
 }
+
+// When debuggerd's signal handler is the first handler called, it's great at
+// handling the recoverable GWP-ASan and permissive MTE modes. For apps,
+// sigchain (from libart) is always the first signal handler, and so the
+// following function is what sigchain must call before processing the signal.
+// This allows for processing of a potentially recoverable GWP-ASan or MTE
+// crash. If the signal requires recovery, then dump a report (via the regular
+// debuggerd hanndler), and patch up the allocator (in the case of GWP-ASan) or
+// disable MTE on the thread, and allow the process to continue (indicated by
+// returning 'true'). If the crash has nothing to do with GWP-ASan/MTE, or
+// recovery isn't possible, return 'false'.
+bool debuggerd_handle_signal(int signal_number, siginfo_t* info, void* context) {
+  if (signal_number != SIGSEGV) return false;
+  if (info->si_code == SEGV_MTEAERR || info->si_code == SEGV_MTESERR) {
+    if (!is_permissive_mte()) return false;
+    // Because permissive MTE disables MTE for the entire thread, we're less
+    // worried about getting a whole bunch of crashes in a row. ActivityManager
+    // doesn't like multiple native crashes for an app in a short period of time
+    // (see the comment about recoverable GWP-ASan in
+    // `debuggerd_handle_gwp_asan_signal`), but that shouldn't happen if MTE is
+    // disabled for the entire thread. This might need to be changed if there's
+    // some low-hanging bug that happens across multiple threads in quick
+    // succession.
+    debuggerd_signal_handler(signal_number, info, context);
+    return true;
+  }
+
+  if (!signal_has_si_addr(info)) return false;
+  return debuggerd_handle_gwp_asan_signal(signal_number, info, context);
+}
diff --git a/debuggerd/include/debuggerd/client.h b/debuggerd/include/debuggerd/client.h
index b7284b0..e7401cc 100644
--- a/debuggerd/include/debuggerd/client.h
+++ b/debuggerd/include/debuggerd/client.h
@@ -26,7 +26,7 @@
 
 // Trigger a dump of specified process to output_fd.
 // output_fd is consumed, timeout of 0 will wait forever.
-bool debuggerd_trigger_dump(pid_t pid, enum DebuggerdDumpType dump_type, unsigned int timeout_ms,
+bool debuggerd_trigger_dump(pid_t tid, enum DebuggerdDumpType dump_type, unsigned int timeout_ms,
                             android::base::unique_fd output_fd);
 
 int dump_backtrace_to_file(pid_t tid, enum DebuggerdDumpType dump_type, int output_fd);
diff --git a/debuggerd/include/debuggerd/handler.h b/debuggerd/include/debuggerd/handler.h
index ebb5372..954f049 100644
--- a/debuggerd/include/debuggerd/handler.h
+++ b/debuggerd/include/debuggerd/handler.h
@@ -33,6 +33,8 @@
 struct AllocationMetadata;
 };  // namespace gwp_asan
 
+struct crash_detail_page_t;
+
 // When updating this data structure, CrashInfoDataDynamic and the code in
 // ReadCrashInfo() must also be updated.
 struct __attribute__((packed)) debugger_process_info {
@@ -44,7 +46,9 @@
   const char* scudo_region_info;
   const char* scudo_ring_buffer;
   size_t scudo_ring_buffer_size;
-  bool recoverable_gwp_asan_crash;
+  size_t scudo_stack_depot_size;
+  bool recoverable_crash;
+  struct crash_detail_page_t* crash_detail_page;
 };
 
 // GWP-ASan calbacks to support the recoverable mode. Separate from the
diff --git a/debuggerd/libdebuggerd/include/libdebuggerd/types.h b/debuggerd/libdebuggerd/include/libdebuggerd/types.h
index 5a2a7ab..4d69658 100644
--- a/debuggerd/libdebuggerd/include/libdebuggerd/types.h
+++ b/debuggerd/libdebuggerd/include/libdebuggerd/types.h
@@ -51,8 +51,10 @@
   uintptr_t scudo_region_info = 0;
   uintptr_t scudo_ring_buffer = 0;
   size_t scudo_ring_buffer_size = 0;
+  size_t scudo_stack_depot_size = 0;
 
   bool has_fault_address = false;
   uintptr_t untagged_fault_address = 0;
   uintptr_t maybe_tagged_fault_address = 0;
+  uintptr_t crash_detail_page = 0;
 };
diff --git a/debuggerd/libdebuggerd/include/libdebuggerd/utility.h b/debuggerd/libdebuggerd/include/libdebuggerd/utility.h
index 198de37..26c2cd4 100644
--- a/debuggerd/libdebuggerd/include/libdebuggerd/utility.h
+++ b/debuggerd/libdebuggerd/include/libdebuggerd/utility.h
@@ -91,8 +91,6 @@
 void get_signal_sender(char* buf, size_t n, const siginfo_t*);
 const char* get_signame(const siginfo_t*);
 const char* get_sigcode(const siginfo_t*);
-std::string describe_tagged_addr_ctrl(long ctrl);
-std::string describe_pac_enabled_keys(long keys);
 
 // Number of bytes per MTE granule.
 constexpr size_t kTagGranuleSize = 16;
diff --git a/debuggerd/libdebuggerd/scudo.cpp b/debuggerd/libdebuggerd/scudo.cpp
index 837f406..3fa3bd0 100644
--- a/debuggerd/libdebuggerd/scudo.cpp
+++ b/debuggerd/libdebuggerd/scudo.cpp
@@ -41,8 +41,6 @@
     return;
   }
 
-  auto stack_depot = AllocAndReadFully(process_memory, process_info.scudo_stack_depot,
-                                       __scudo_get_stack_depot_size());
   auto region_info = AllocAndReadFully(process_memory, process_info.scudo_region_info,
                                        __scudo_get_region_info_size());
   std::unique_ptr<char[]> ring_buffer;
@@ -50,7 +48,12 @@
     ring_buffer = AllocAndReadFully(process_memory, process_info.scudo_ring_buffer,
                                     process_info.scudo_ring_buffer_size);
   }
-  if (!stack_depot || !region_info) {
+  std::unique_ptr<char[]> stack_depot;
+  if (process_info.scudo_stack_depot_size != 0) {
+    stack_depot = AllocAndReadFully(process_memory, process_info.scudo_stack_depot,
+                                    process_info.scudo_stack_depot_size);
+  }
+  if (!region_info) {
     return;
   }
 
@@ -78,7 +81,8 @@
   }
 
   __scudo_get_error_info(&error_info_, process_info.maybe_tagged_fault_address, stack_depot.get(),
-                         region_info.get(), ring_buffer.get(), memory.get(), memory_tags.get(),
+                         process_info.scudo_stack_depot_size, region_info.get(), ring_buffer.get(),
+                         process_info.scudo_ring_buffer_size, memory.get(), memory_tags.get(),
                          memory_begin, memory_end - memory_begin);
 }
 
diff --git a/debuggerd/libdebuggerd/test/tombstone_proto_to_text_test.cpp b/debuggerd/libdebuggerd/test/tombstone_proto_to_text_test.cpp
new file mode 100644
index 0000000..a4c08a4
--- /dev/null
+++ b/debuggerd/libdebuggerd/test/tombstone_proto_to_text_test.cpp
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2021 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.
+ */
+
+#include <gtest/gtest.h>
+#include <sys/prctl.h>
+
+#include <string>
+
+#include <android-base/test_utils.h>
+
+#include "libdebuggerd/tombstone.h"
+#include "tombstone.pb.h"
+
+using CallbackType = std::function<void(const std::string& line, bool should_log)>;
+
+class TombstoneProtoToTextTest : public ::testing::Test {
+ public:
+  void SetUp() {
+    tombstone_.reset(new Tombstone);
+
+    tombstone_->set_arch(Architecture::ARM64);
+    tombstone_->set_build_fingerprint("Test fingerprint");
+    tombstone_->set_timestamp("1970-01-01 00:00:00");
+    tombstone_->set_pid(100);
+    tombstone_->set_tid(100);
+    tombstone_->set_uid(0);
+    tombstone_->set_selinux_label("none");
+
+    Signal signal;
+    signal.set_number(SIGSEGV);
+    signal.set_name("SIGSEGV");
+    signal.set_code(0);
+    signal.set_code_name("none");
+
+    *tombstone_->mutable_signal_info() = signal;
+
+    Thread thread;
+    thread.set_id(100);
+    thread.set_name("main");
+    thread.set_tagged_addr_ctrl(0);
+    thread.set_pac_enabled_keys(0);
+
+    auto& threads = *tombstone_->mutable_threads();
+    threads[100] = thread;
+    main_thread_ = &threads[100];
+  }
+
+  void ProtoToString() {
+    text_ = "";
+    EXPECT_TRUE(
+        tombstone_proto_to_text(*tombstone_, [this](const std::string& line, bool should_log) {
+          if (should_log) {
+            text_ += "LOG ";
+          }
+          text_ += line + '\n';
+        }));
+  }
+
+  Thread* main_thread_;
+  std::string text_;
+  std::unique_ptr<Tombstone> tombstone_;
+};
+
+TEST_F(TombstoneProtoToTextTest, tagged_addr_ctrl) {
+  main_thread_->set_tagged_addr_ctrl(0);
+  ProtoToString();
+  EXPECT_MATCH(text_, "LOG tagged_addr_ctrl: 0000000000000000\\n");
+
+  main_thread_->set_tagged_addr_ctrl(PR_TAGGED_ADDR_ENABLE);
+  ProtoToString();
+  EXPECT_MATCH(text_, "LOG tagged_addr_ctrl: 0000000000000001 \\(PR_TAGGED_ADDR_ENABLE\\)\\n");
+
+  main_thread_->set_tagged_addr_ctrl(PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC |
+                                     (0xfffe << PR_MTE_TAG_SHIFT));
+  ProtoToString();
+  EXPECT_MATCH(text_,
+               "LOG tagged_addr_ctrl: 000000000007fff3 \\(PR_TAGGED_ADDR_ENABLE, PR_MTE_TCF_SYNC, "
+               "mask 0xfffe\\)\\n");
+
+  main_thread_->set_tagged_addr_ctrl(0xf0000000 | PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC |
+                                     PR_MTE_TCF_ASYNC | (0xfffe << PR_MTE_TAG_SHIFT));
+  ProtoToString();
+  EXPECT_MATCH(text_,
+               "LOG tagged_addr_ctrl: 00000000f007fff7 \\(PR_TAGGED_ADDR_ENABLE, PR_MTE_TCF_SYNC, "
+               "PR_MTE_TCF_ASYNC, mask 0xfffe, unknown 0xf0000000\\)\\n");
+}
+
+TEST_F(TombstoneProtoToTextTest, pac_enabled_keys) {
+  main_thread_->set_pac_enabled_keys(0);
+  ProtoToString();
+  EXPECT_MATCH(text_, "LOG pac_enabled_keys: 0000000000000000\\n");
+
+  main_thread_->set_pac_enabled_keys(PR_PAC_APIAKEY);
+  ProtoToString();
+  EXPECT_MATCH(text_, "LOG pac_enabled_keys: 0000000000000001 \\(PR_PAC_APIAKEY\\)\\n");
+
+  main_thread_->set_pac_enabled_keys(PR_PAC_APIAKEY | PR_PAC_APDBKEY);
+  ProtoToString();
+  EXPECT_MATCH(text_,
+               "LOG pac_enabled_keys: 0000000000000009 \\(PR_PAC_APIAKEY, PR_PAC_APDBKEY\\)\\n");
+
+  main_thread_->set_pac_enabled_keys(PR_PAC_APIAKEY | PR_PAC_APDBKEY | 0x1000);
+  ProtoToString();
+  EXPECT_MATCH(text_,
+               "LOG pac_enabled_keys: 0000000000001009 \\(PR_PAC_APIAKEY, PR_PAC_APDBKEY, unknown "
+               "0x1000\\)\\n");
+}
+
+TEST_F(TombstoneProtoToTextTest, crash_detail_string) {
+  auto* crash_detail = tombstone_->add_crash_details();
+  crash_detail->set_name("CRASH_DETAIL_NAME");
+  crash_detail->set_data("crash_detail_value");
+  ProtoToString();
+  EXPECT_MATCH(text_, "(CRASH_DETAIL_NAME: 'crash_detail_value')");
+}
+
+TEST_F(TombstoneProtoToTextTest, crash_detail_bytes) {
+  auto* crash_detail = tombstone_->add_crash_details();
+  crash_detail->set_name("CRASH_DETAIL_NAME");
+  crash_detail->set_data("helloworld\1\255\3");
+  ProtoToString();
+  EXPECT_MATCH(text_, R"(CRASH_DETAIL_NAME: 'helloworld\\1\\255\\3')");
+}
diff --git a/debuggerd/libdebuggerd/test/utility_test.cpp b/debuggerd/libdebuggerd/test/utility_test.cpp
deleted file mode 100644
index dad3380..0000000
--- a/debuggerd/libdebuggerd/test/utility_test.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2021 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.
- */
-
-#include <gtest/gtest.h>
-#include <sys/prctl.h>
-
-#include "libdebuggerd/utility.h"
-
-TEST(UtilityTest, describe_tagged_addr_ctrl) {
-  EXPECT_EQ("", describe_tagged_addr_ctrl(0));
-  EXPECT_EQ(" (PR_TAGGED_ADDR_ENABLE)", describe_tagged_addr_ctrl(PR_TAGGED_ADDR_ENABLE));
-  EXPECT_EQ(" (PR_TAGGED_ADDR_ENABLE, PR_MTE_TCF_SYNC, mask 0xfffe)",
-            describe_tagged_addr_ctrl(PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC |
-                                      (0xfffe << PR_MTE_TAG_SHIFT)));
-  EXPECT_EQ(
-      " (PR_TAGGED_ADDR_ENABLE, PR_MTE_TCF_SYNC, PR_MTE_TCF_ASYNC, mask 0xfffe, unknown "
-      "0xf0000000)",
-      describe_tagged_addr_ctrl(0xf0000000 | PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC |
-                                PR_MTE_TCF_ASYNC | (0xfffe << PR_MTE_TAG_SHIFT)));
-}
-
-TEST(UtilityTest, describe_pac_enabled_keys) {
-  EXPECT_EQ("", describe_pac_enabled_keys(0));
-  EXPECT_EQ(" (PR_PAC_APIAKEY)", describe_pac_enabled_keys(PR_PAC_APIAKEY));
-  EXPECT_EQ(" (PR_PAC_APIAKEY, PR_PAC_APDBKEY)",
-            describe_pac_enabled_keys(PR_PAC_APIAKEY | PR_PAC_APDBKEY));
-  EXPECT_EQ(" (PR_PAC_APIAKEY, PR_PAC_APDBKEY, unknown 0x1000)",
-            describe_pac_enabled_keys(PR_PAC_APIAKEY | PR_PAC_APDBKEY | 0x1000));
-}
diff --git a/debuggerd/libdebuggerd/tombstone_proto.cpp b/debuggerd/libdebuggerd/tombstone_proto.cpp
index 744bfab..74f9a8c 100644
--- a/debuggerd/libdebuggerd/tombstone_proto.cpp
+++ b/debuggerd/libdebuggerd/tombstone_proto.cpp
@@ -48,8 +48,10 @@
 #include <android-base/unique_fd.h>
 
 #include <android/log.h>
+#include <android/set_abort_message.h>
 #include <bionic/macros.h>
 #include <bionic/reserved_signals.h>
+#include <bionic/crash_detail_internal.h>
 #include <log/log.h>
 #include <log/log_read.h>
 #include <log/logprint.h>
@@ -94,6 +96,11 @@
 
 static std::optional<std::string> get_stack_overflow_cause(uint64_t fault_addr, uint64_t sp,
                                                            unwindstack::Maps* maps) {
+  // Under stack MTE the stack pointer and/or the fault address can be tagged.
+  // In order to calculate deltas between them, strip off the tags off both
+  // addresses.
+  fault_addr = untag_address(fault_addr);
+  sp = untag_address(sp);
   static constexpr uint64_t kMaxDifferenceBytes = 256;
   uint64_t difference;
   if (sp >= fault_addr) {
@@ -251,6 +258,46 @@
   }
 }
 
+static void dump_crash_details(Tombstone* tombstone,
+                               std::shared_ptr<unwindstack::Memory>& process_memory,
+                               const ProcessInfo& process_info) {
+  uintptr_t address = process_info.crash_detail_page;
+  while (address) {
+    struct crash_detail_page_t page;
+    if (!process_memory->ReadFully(address, &page, sizeof(page))) {
+      async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG, "failed to read crash detail page: %m");
+      break;
+    }
+    if (page.used > kNumCrashDetails) {
+      async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG, "crash detail: page corrupted");
+      break;
+    }
+    for (size_t i = 0; i < page.used; ++i) {
+      const crash_detail_t& crash_detail = page.crash_details[i];
+      if (!crash_detail.data) {
+        continue;
+      }
+      std::string name(crash_detail.name_size, '\0');
+      if (!process_memory->ReadFully(reinterpret_cast<uintptr_t>(crash_detail.name), name.data(),
+                                     crash_detail.name_size)) {
+        async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG, "crash detail: failed to read name: %m");
+        continue;
+      }
+      std::string data(crash_detail.data_size, '\0');
+      if (!process_memory->ReadFully(reinterpret_cast<uintptr_t>(crash_detail.data), data.data(),
+                                     crash_detail.data_size)) {
+        async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG,
+                              "crash detail: failed to read data for %s: %m", name.c_str());
+        continue;
+      }
+      auto* proto_detail = tombstone->add_crash_details();
+      proto_detail->set_name(name);
+      proto_detail->set_data(data);
+    }
+    address = reinterpret_cast<uintptr_t>(page.prev);
+  }
+}
+
 static void dump_abort_message(Tombstone* tombstone,
                                std::shared_ptr<unwindstack::Memory>& process_memory,
                                const ProcessInfo& process_info) {
@@ -698,7 +745,7 @@
   *result.mutable_signal_info() = sig;
 
   dump_abort_message(&result, unwinder->GetProcessMemory(), process_info);
-
+  dump_crash_details(&result, unwinder->GetProcessMemory(), process_info);
   // Dump the main thread, but save the memory around the registers.
   dump_thread(&result, unwinder, main_thread, /* memory_dump */ true);
 
diff --git a/debuggerd/libdebuggerd/tombstone_proto_to_text.cpp b/debuggerd/libdebuggerd/tombstone_proto_to_text.cpp
index e44dc10..cefa2d6 100644
--- a/debuggerd/libdebuggerd/tombstone_proto_to_text.cpp
+++ b/debuggerd/libdebuggerd/tombstone_proto_to_text.cpp
@@ -18,7 +18,9 @@
 
 #include <inttypes.h>
 
+#include <charconv>
 #include <functional>
+#include <limits>
 #include <set>
 #include <string>
 #include <unordered_set>
@@ -29,6 +31,7 @@
 #include <android-base/strings.h>
 #include <android-base/unique_fd.h>
 #include <bionic/macros.h>
+#include <sys/prctl.h>
 
 #include "tombstone.pb.h"
 
@@ -40,6 +43,42 @@
 #define CBS(...) CB(false, __VA_ARGS__)
 using CallbackType = std::function<void(const std::string& line, bool should_log)>;
 
+#define DESCRIBE_FLAG(flag) \
+  if (value & flag) {       \
+    desc += ", ";           \
+    desc += #flag;          \
+    value &= ~flag;         \
+  }
+
+static std::string describe_end(long value, std::string& desc) {
+  if (value) {
+    desc += StringPrintf(", unknown 0x%lx", value);
+  }
+  return desc.empty() ? "" : " (" + desc.substr(2) + ")";
+}
+
+static std::string describe_tagged_addr_ctrl(long value) {
+  std::string desc;
+  DESCRIBE_FLAG(PR_TAGGED_ADDR_ENABLE);
+  DESCRIBE_FLAG(PR_MTE_TCF_SYNC);
+  DESCRIBE_FLAG(PR_MTE_TCF_ASYNC);
+  if (value & PR_MTE_TAG_MASK) {
+    desc += StringPrintf(", mask 0x%04lx", (value & PR_MTE_TAG_MASK) >> PR_MTE_TAG_SHIFT);
+    value &= ~PR_MTE_TAG_MASK;
+  }
+  return describe_end(value, desc);
+}
+
+static std::string describe_pac_enabled_keys(long value) {
+  std::string desc;
+  DESCRIBE_FLAG(PR_PAC_APIAKEY);
+  DESCRIBE_FLAG(PR_PAC_APIBKEY);
+  DESCRIBE_FLAG(PR_PAC_APDAKEY);
+  DESCRIBE_FLAG(PR_PAC_APDBKEY);
+  DESCRIBE_FLAG(PR_PAC_APGAKEY);
+  return describe_end(value, desc);
+}
+
 static const char* abi_string(const Tombstone& tombstone) {
   switch (tombstone.arch()) {
     case Architecture::ARM32:
@@ -388,6 +427,27 @@
   }
 }
 
+static std::string oct_encode(const std::string& data) {
+  std::string oct_encoded;
+  oct_encoded.reserve(data.size());
+
+  // N.B. the unsigned here is very important, otherwise e.g. \255 would render as
+  // \-123 (and overflow our buffer).
+  for (unsigned char c : data) {
+    if (isprint(c)) {
+      oct_encoded += c;
+    } else {
+      std::string oct_digits("\\\0\0\0", 4);
+      // char is encodable in 3 oct digits
+      static_assert(std::numeric_limits<unsigned char>::max() <= 8 * 8 * 8);
+      auto [ptr, ec] = std::to_chars(oct_digits.data() + 1, oct_digits.data() + 4, c, 8);
+      oct_digits.resize(ptr - oct_digits.data());
+      oct_encoded += oct_digits;
+    }
+  }
+  return oct_encoded;
+}
+
 static void print_main_thread(CallbackType callback, const Tombstone& tombstone,
                               const Thread& thread) {
   print_thread_header(callback, tombstone, thread, true);
@@ -431,6 +491,12 @@
     CBL("Abort message: '%s'", tombstone.abort_message().c_str());
   }
 
+  for (const auto& crash_detail : tombstone.crash_details()) {
+    std::string oct_encoded_name = oct_encode(crash_detail.name());
+    std::string oct_encoded_data = oct_encode(crash_detail.data());
+    CBL("Extra crash detail: %s: '%s'", oct_encoded_name.c_str(), oct_encoded_data.c_str());
+  }
+
   print_thread_registers(callback, tombstone, thread, true);
   if (is_async_mte_crash) {
     CBL("Note: This crash is a delayed async MTE crash. Memory corruption has occurred");
diff --git a/debuggerd/libdebuggerd/utility.cpp b/debuggerd/libdebuggerd/utility.cpp
index 15f09b3..742ac7c 100644
--- a/debuggerd/libdebuggerd/utility.cpp
+++ b/debuggerd/libdebuggerd/utility.cpp
@@ -445,42 +445,6 @@
   return "?";
 }
 
-#define DESCRIBE_FLAG(flag) \
-  if (value & flag) {       \
-    desc += ", ";           \
-    desc += #flag;          \
-    value &= ~flag;         \
-  }
-
-static std::string describe_end(long value, std::string& desc) {
-  if (value) {
-    desc += StringPrintf(", unknown 0x%lx", value);
-  }
-  return desc.empty() ? "" : " (" + desc.substr(2) + ")";
-}
-
-std::string describe_tagged_addr_ctrl(long value) {
-  std::string desc;
-  DESCRIBE_FLAG(PR_TAGGED_ADDR_ENABLE);
-  DESCRIBE_FLAG(PR_MTE_TCF_SYNC);
-  DESCRIBE_FLAG(PR_MTE_TCF_ASYNC);
-  if (value & PR_MTE_TAG_MASK) {
-    desc += StringPrintf(", mask 0x%04lx", (value & PR_MTE_TAG_MASK) >> PR_MTE_TAG_SHIFT);
-    value &= ~PR_MTE_TAG_MASK;
-  }
-  return describe_end(value, desc);
-}
-
-std::string describe_pac_enabled_keys(long value) {
-  std::string desc;
-  DESCRIBE_FLAG(PR_PAC_APIAKEY);
-  DESCRIBE_FLAG(PR_PAC_APIBKEY);
-  DESCRIBE_FLAG(PR_PAC_APDAKEY);
-  DESCRIBE_FLAG(PR_PAC_APDBKEY);
-  DESCRIBE_FLAG(PR_PAC_APGAKEY);
-  return describe_end(value, desc);
-}
-
 void log_backtrace(log_t* log, unwindstack::AndroidUnwinder* unwinder,
                    unwindstack::AndroidUnwinderData& data, const char* prefix) {
   std::set<std::string> unreadable_elf_files;
diff --git a/debuggerd/proto/Android.bp b/debuggerd/proto/Android.bp
index 804f805..7b9e780 100644
--- a/debuggerd/proto/Android.bp
+++ b/debuggerd/proto/Android.bp
@@ -39,3 +39,16 @@
     recovery_available: true,
     vendor_ramdisk_available: true,
 }
+
+java_library_static {
+    name: "libtombstone_proto_java",
+    proto: {
+        type: "lite",
+    },
+    srcs: [
+        "tombstone.proto",
+    ],
+    jarjar_rules: "jarjar-rules.txt",
+    sdk_version: "current",
+    static_libs: ["libprotobuf-java-lite"],
+}
diff --git a/debuggerd/proto/jarjar-rules.txt b/debuggerd/proto/jarjar-rules.txt
new file mode 100644
index 0000000..66878a9
--- /dev/null
+++ b/debuggerd/proto/jarjar-rules.txt
@@ -0,0 +1 @@
+rule com.google.protobuf.** com.android.server.os.protobuf.@1
diff --git a/debuggerd/proto/tombstone.proto b/debuggerd/proto/tombstone.proto
index 49865a2..214cbfb 100644
--- a/debuggerd/proto/tombstone.proto
+++ b/debuggerd/proto/tombstone.proto
@@ -15,6 +15,11 @@
 // NOTE TO OEMS:
 // If you add custom fields to this proto, do not use numbers in the reserved range.
 
+message CrashDetail {
+  bytes name = 1;
+  bytes data = 2;
+}
+
 message Tombstone {
   Architecture arch = 1;
   string build_fingerprint = 2;
@@ -33,6 +38,7 @@
 
   Signal signal_info = 10;
   string abort_message = 14;
+  repeated CrashDetail crash_details = 21;
   repeated Cause causes = 15;
 
   map<uint32, Thread> threads = 16;
@@ -40,7 +46,7 @@
   repeated LogBuffer log_buffers = 18;
   repeated FD open_fds = 19;
 
-  reserved 21 to 999;
+  reserved 22 to 999;
 }
 
 enum Architecture {
diff --git a/debuggerd/protocol.h b/debuggerd/protocol.h
index 212d6dc..9af7377 100644
--- a/debuggerd/protocol.h
+++ b/debuggerd/protocol.h
@@ -99,7 +99,9 @@
   uintptr_t scudo_region_info;
   uintptr_t scudo_ring_buffer;
   size_t scudo_ring_buffer_size;
-  bool recoverable_gwp_asan_crash;
+  size_t scudo_stack_depot_size;
+  bool recoverable_crash;
+  uintptr_t crash_detail_page;
 };
 
 struct __attribute__((__packed__)) CrashInfo {
diff --git a/debuggerd/rust/tombstoned_client/Android.bp b/debuggerd/rust/tombstoned_client/Android.bp
index 2007f39..bf19bb7 100644
--- a/debuggerd/rust/tombstoned_client/Android.bp
+++ b/debuggerd/rust/tombstoned_client/Android.bp
@@ -8,7 +8,7 @@
         "wrapper.cpp",
     ],
     generated_sources: [
-        "libtombstoned_client_rust_bridge_code"
+        "libtombstoned_client_rust_bridge_code",
     ],
     header_libs: [
         "libbase_headers",
diff --git a/debuggerd/seccomp_policy/crash_dump.arm64.policy b/debuggerd/seccomp_policy/crash_dump.arm64.policy
index adf8738..c5d10d6 100644
--- a/debuggerd/seccomp_policy/crash_dump.arm64.policy
+++ b/debuggerd/seccomp_policy/crash_dump.arm64.policy
@@ -28,11 +28,11 @@
 rt_tgsigqueueinfo: 1
 prctl: arg0 == PR_GET_NO_NEW_PRIVS || arg0 == 0x53564d41 || arg0 == PR_PAC_RESET_KEYS || arg0 == 56 || arg0 == 61
 madvise: 1
-mprotect: arg2 in 0x1|0x2
+mprotect: arg2 in 0x1|0x2|0x20
 munmap: 1
 getuid: 1
 fstat: 1
-mmap: arg2 in 0x1|0x2
+mmap: arg2 in 0x1|0x2|0x20
 geteuid: 1
 getgid: 1
 getegid: 1
diff --git a/debuggerd/seccomp_policy/crash_dump.policy.def b/debuggerd/seccomp_policy/crash_dump.policy.def
index 972a575..dc751da 100644
--- a/debuggerd/seccomp_policy/crash_dump.policy.def
+++ b/debuggerd/seccomp_policy/crash_dump.policy.def
@@ -25,8 +25,8 @@
 faccessat: 1
 recvmsg: 1
 recvfrom: 1
-sysinfo: 1
 setsockopt: 1
+sysinfo: 1
 
 process_vm_readv: 1
 
@@ -53,20 +53,29 @@
 
 #if 0
 libminijail on vendor partitions older than P does not have constants from <sys/mman.h>.
-Define the values of PROT_READ and PROT_WRITE ourselves to maintain backwards compatibility.
+Define values for PROT_READ, PROT_WRITE and PROT_MTE ourselves to maintain backwards compatibility.
 #else
 #define PROT_READ 0x1
 #define PROT_WRITE 0x2
+#define PROT_MTE 0x20
 #endif
 
 madvise: 1
+#if defined(__aarch64__)
+mprotect: arg2 in PROT_READ|PROT_WRITE|PROT_MTE
+#else
 mprotect: arg2 in PROT_READ|PROT_WRITE
+#endif
 munmap: 1
 
 #if defined(__LP64__)
 getuid: 1
 fstat: 1
+#if defined(__aarch64__)
+mmap: arg2 in PROT_READ|PROT_WRITE|PROT_MTE
+#else
 mmap: arg2 in PROT_READ|PROT_WRITE
+#endif
 #else
 getuid32: 1
 fstat64: 1
diff --git a/debuggerd/test_permissive_mte/Android.bp b/debuggerd/test_permissive_mte/Android.bp
index d3f7520..0ad3243 100644
--- a/debuggerd/test_permissive_mte/Android.bp
+++ b/debuggerd/test_permissive_mte/Android.bp
@@ -17,22 +17,28 @@
 }
 
 cc_binary {
-  name: "mte_crash",
-  tidy: false,
-  srcs: ["mte_crash.cpp"],
-  sanitize: {
-    memtag_heap: true,
-    diag: {
-      memtag_heap: true,
+    name: "mte_crash",
+    tidy: false,
+    srcs: ["mte_crash.cpp"],
+    sanitize: {
+        memtag_heap: true,
+        diag: {
+            memtag_heap: true,
+        },
     },
-  },
 }
 
 java_test_host {
     name: "permissive_mte_test",
     libs: ["tradefed"],
-    static_libs: ["frameworks-base-hostutils", "cts-install-lib-host"],
-    srcs:  ["src/**/PermissiveMteTest.java", ":libtombstone_proto-src"],
+    static_libs: [
+        "frameworks-base-hostutils",
+        "cts-install-lib-host",
+    ],
+    srcs: [
+        "src/**/PermissiveMteTest.java",
+        ":libtombstone_proto-src",
+    ],
     data: [":mte_crash"],
     test_config: "AndroidTest.xml",
     test_suites: ["general-tests"],
diff --git a/debuggerd/tombstoned/tombstoned.cpp b/debuggerd/tombstoned/tombstoned.cpp
index cf7904f..75ae9f8 100644
--- a/debuggerd/tombstoned/tombstoned.cpp
+++ b/debuggerd/tombstoned/tombstoned.cpp
@@ -61,7 +61,6 @@
 
 struct CrashArtifact {
   unique_fd fd;
-  std::optional<std::string> temporary_path;
 
   static CrashArtifact devnull() {
     CrashArtifact result;
@@ -97,7 +96,7 @@
 class CrashQueue {
  public:
   CrashQueue(const std::string& dir_path, const std::string& file_name_prefix, size_t max_artifacts,
-             size_t max_concurrent_dumps, bool supports_proto)
+             size_t max_concurrent_dumps, bool supports_proto, bool world_readable)
       : file_name_prefix_(file_name_prefix),
         dir_path_(dir_path),
         dir_fd_(open(dir_path.c_str(), O_DIRECTORY | O_RDONLY | O_CLOEXEC)),
@@ -105,7 +104,8 @@
         next_artifact_(0),
         max_concurrent_dumps_(max_concurrent_dumps),
         num_concurrent_dumps_(0),
-        supports_proto_(supports_proto) {
+        supports_proto_(supports_proto),
+        world_readable_(world_readable) {
     if (dir_fd_ == -1) {
       PLOG(FATAL) << "failed to open directory: " << dir_path;
     }
@@ -128,14 +128,16 @@
   static CrashQueue* for_tombstones() {
     static CrashQueue queue("/data/tombstones", "tombstone_" /* file_name_prefix */,
                             GetIntProperty("tombstoned.max_tombstone_count", 32),
-                            1 /* max_concurrent_dumps */, true /* supports_proto */);
+                            1 /* max_concurrent_dumps */, true /* supports_proto */,
+                            true /* world_readable */);
     return &queue;
   }
 
   static CrashQueue* for_anrs() {
     static CrashQueue queue("/data/anr", "trace_" /* file_name_prefix */,
                             GetIntProperty("tombstoned.max_anr_count", 64),
-                            4 /* max_concurrent_dumps */, false /* supports_proto */);
+                            4 /* max_concurrent_dumps */, false /* supports_proto */,
+                            false /* world_readable */);
     return &queue;
   }
 
@@ -145,16 +147,15 @@
     std::optional<std::string> path;
     result.fd.reset(openat(dir_fd_, ".", O_WRONLY | O_APPEND | O_TMPFILE | O_CLOEXEC, 0660));
     if (result.fd == -1) {
-      // We might not have O_TMPFILE. Try creating with an arbitrary filename instead.
-      static size_t counter = 0;
-      std::string tmp_filename = StringPrintf(".temporary%zu", counter++);
-      result.fd.reset(openat(dir_fd_, tmp_filename.c_str(),
-                             O_WRONLY | O_APPEND | O_CREAT | O_TRUNC | O_CLOEXEC, 0660));
-      if (result.fd == -1) {
-        PLOG(FATAL) << "failed to create temporary tombstone in " << dir_path_;
-      }
+      PLOG(FATAL) << "failed to create temporary tombstone in " << dir_path_;
+    }
 
-      result.temporary_path = std::move(tmp_filename);
+    if (world_readable_) {
+      // We need to fchmodat after creating to avoid getting the umask applied.
+      std::string fd_path = StringPrintf("/proc/self/fd/%d", result.fd.get());
+      if (fchmodat(dir_fd_, fd_path.c_str(), 0664, 0) != 0) {
+        PLOG(ERROR) << "Failed to make tombstone world-readable";
+      }
     }
 
     return std::move(result);
@@ -266,6 +267,7 @@
   size_t num_concurrent_dumps_;
 
   bool supports_proto_;
+  bool world_readable_;
 
   std::deque<std::unique_ptr<Crash>> queued_requests_;
 
@@ -417,6 +419,7 @@
     return false;
   }
 
+  // This fd is created inside of dirfd in CrashQueue::create_temporary_file.
   std::string fd_path = StringPrintf("/proc/self/fd/%d", fd.get());
   rc = linkat(AT_FDCWD, fd_path.c_str(), dirfd.get(), path.c_str(), AT_SYMLINK_FOLLOW);
   if (rc != 0) {
@@ -471,20 +474,6 @@
       rename_tombstone_fd(crash->output.proto->fd, queue->dir_fd(), *paths.proto);
     }
   }
-
-  // If we don't have O_TMPFILE, we need to clean up after ourselves.
-  if (crash->output.text.temporary_path) {
-    rc = unlinkat(queue->dir_fd().get(), crash->output.text.temporary_path->c_str(), 0);
-    if (rc != 0) {
-      PLOG(ERROR) << "failed to unlink temporary tombstone at " << paths.text;
-    }
-  }
-  if (crash->output.proto && crash->output.proto->temporary_path) {
-    rc = unlinkat(queue->dir_fd().get(), crash->output.proto->temporary_path->c_str(), 0);
-    if (rc != 0) {
-      PLOG(ERROR) << "failed to unlink temporary proto tombstone";
-    }
-  }
 }
 
 static void crash_completed_cb(evutil_socket_t sockfd, short ev, void* arg) {
diff --git a/fastboot/Android.bp b/fastboot/Android.bp
index f85d1de..c0445f3 100644
--- a/fastboot/Android.bp
+++ b/fastboot/Android.bp
@@ -170,7 +170,7 @@
         "android.hardware.fastboot@1.1",
         "android.hardware.fastboot-V1-ndk",
         "android.hardware.health@2.0",
-        "android.hardware.health-V2-ndk",
+        "android.hardware.health-V3-ndk",
         "libasyncio",
         "libbase",
         "libbinder_ndk",
diff --git a/fastboot/constants.h b/fastboot/constants.h
index a803307..af4d1eb 100644
--- a/fastboot/constants.h
+++ b/fastboot/constants.h
@@ -82,3 +82,5 @@
 #define FB_VAR_TREBLE_ENABLED "treble-enabled"
 #define FB_VAR_MAX_FETCH_SIZE "max-fetch-size"
 #define FB_VAR_DMESG "dmesg"
+#define FB_VAR_BATTERY_SERIAL_NUMBER "battery-serial-number"
+#define FB_VAR_BATTERY_PART_STATUS "battery-part-status"
diff --git a/fastboot/device/commands.cpp b/fastboot/device/commands.cpp
index bd936ae..e522f4d 100644
--- a/fastboot/device/commands.cpp
+++ b/fastboot/device/commands.cpp
@@ -147,6 +147,8 @@
         {FB_VAR_SECURITY_PATCH_LEVEL, {GetSecurityPatchLevel, nullptr}},
         {FB_VAR_TREBLE_ENABLED, {GetTrebleEnabled, nullptr}},
         {FB_VAR_MAX_FETCH_SIZE, {GetMaxFetchSize, nullptr}},
+        {FB_VAR_BATTERY_SERIAL_NUMBER, {GetBatterySerialNumber, nullptr}},
+        {FB_VAR_BATTERY_PART_STATUS, {GetBatteryPartStatus, nullptr}},
 };
 
 static bool GetVarAll(FastbootDevice* device) {
diff --git a/fastboot/device/variables.cpp b/fastboot/device/variables.cpp
index 2847e35..77210ab 100644
--- a/fastboot/device/variables.cpp
+++ b/fastboot/device/variables.cpp
@@ -570,3 +570,79 @@
 
     return true;
 }
+
+bool GetBatterySerialNumber(FastbootDevice* device, const std::vector<std::string>&,
+                            std::string* message) {
+    auto health_hal = device->health_hal();
+    if (!health_hal) {
+        return false;
+    }
+
+    if (GetDeviceLockStatus()) {
+        return device->WriteFail("Device is locked");
+    }
+
+    *message = "unsupported";
+
+    int32_t version = 0;
+    auto res = health_hal->getInterfaceVersion(&version);
+    if (!res.isOk()) {
+        return device->WriteFail("Unable to query battery data");
+    }
+    if (version >= 3) {
+        using aidl::android::hardware::health::BatteryHealthData;
+
+        BatteryHealthData data;
+        auto res = health_hal->getBatteryHealthData(&data);
+        if (!res.isOk()) {
+            return device->WriteFail("Unable to query battery data");
+        }
+        if (data.batterySerialNumber) {
+            *message = *data.batterySerialNumber;
+        }
+    }
+    return true;
+}
+
+bool GetBatteryPartStatus(FastbootDevice* device, const std::vector<std::string>&,
+                          std::string* message) {
+    auto health_hal = device->health_hal();
+    if (!health_hal) {
+        return false;
+    }
+
+    using aidl::android::hardware::health::BatteryPartStatus;
+
+    BatteryPartStatus status = BatteryPartStatus::UNSUPPORTED;
+
+    int32_t version = 0;
+    auto res = health_hal->getInterfaceVersion(&version);
+    if (!res.isOk()) {
+        return device->WriteFail("Unable to query battery data");
+    }
+    if (version >= 3) {
+        using aidl::android::hardware::health::BatteryHealthData;
+
+        BatteryHealthData data;
+        auto res = health_hal->getBatteryHealthData(&data);
+        if (!res.isOk()) {
+            return device->WriteFail("Unable to query battery data");
+        }
+        status = data.batteryPartStatus;
+    }
+    switch (status) {
+        case BatteryPartStatus::UNSUPPORTED:
+            *message = "unsupported";
+            break;
+        case BatteryPartStatus::ORIGINAL:
+            *message = "original";
+            break;
+        case BatteryPartStatus::REPLACED:
+            *message = "replaced";
+            break;
+        default:
+            *message = "unknown";
+            break;
+    }
+    return true;
+}
diff --git a/fastboot/device/variables.h b/fastboot/device/variables.h
index 9a46786..99d1355 100644
--- a/fastboot/device/variables.h
+++ b/fastboot/device/variables.h
@@ -67,6 +67,10 @@
                    std::string* message);
 bool GetBatterySoCOk(FastbootDevice* device, const std::vector<std::string>& args,
                      std::string* message);
+bool GetBatterySerialNumber(FastbootDevice* device, const std::vector<std::string>& args,
+                            std::string* message);
+bool GetBatteryPartStatus(FastbootDevice* device, const std::vector<std::string>& args,
+                          std::string* message);
 bool GetSuperPartitionName(FastbootDevice* device, const std::vector<std::string>& args,
                            std::string* message);
 bool GetSnapshotUpdateStatus(FastbootDevice* device, const std::vector<std::string>& args,
diff --git a/fastboot/fastboot.cpp b/fastboot/fastboot.cpp
index ac2a20f..12a1ddc 100644
--- a/fastboot/fastboot.cpp
+++ b/fastboot/fastboot.cpp
@@ -402,7 +402,7 @@
         transport = open_device(device.c_str(), false, false);
 
         if (print) {
-            PrintDevice(device.c_str(), transport ? "offline" : "fastboot");
+            PrintDevice(device.c_str(), transport ? "fastboot" : "offline");
         }
 
         if (transport) {
@@ -571,7 +571,8 @@
             "                            Format a flash partition.\n"
             " set_active SLOT            Set the active slot.\n"
             " oem [COMMAND...]           Execute OEM-specific command.\n"
-            " gsi wipe|disable           Wipe or disable a GSI installation (fastbootd only).\n"
+            " gsi wipe|disable|status    Wipe, disable or show status of a GSI installation\n"
+            "                            (fastbootd only).\n"
             " wipe-super [SUPER_EMPTY]   Wipe the super partition. This will reset it to\n"
             "                            contain an empty set of default dynamic partitions.\n"
             " create-logical-partition NAME SIZE\n"
@@ -1675,7 +1676,7 @@
     }
     for (size_t i = 0; i < tasks->size(); i++) {
         if (auto flash_task = tasks->at(i)->AsFlashTask()) {
-            if (FlashTask::IsDynamicParitition(fp->source.get(), flash_task)) {
+            if (FlashTask::IsDynamicPartition(fp->source.get(), flash_task)) {
                 if (!loc) {
                     loc = i;
                 }
diff --git a/fastboot/task.cpp b/fastboot/task.cpp
index 25c5a6e..ea78a01 100644
--- a/fastboot/task.cpp
+++ b/fastboot/task.cpp
@@ -30,7 +30,7 @@
                      const bool apply_vbmeta, const FlashingPlan* fp)
     : pname_(pname), fname_(fname), slot_(slot), apply_vbmeta_(apply_vbmeta), fp_(fp) {}
 
-bool FlashTask::IsDynamicParitition(const ImageSource* source, const FlashTask* task) {
+bool FlashTask::IsDynamicPartition(const ImageSource* source, const FlashTask* task) {
     std::vector<char> contents;
     if (!source->ReadFile("super_empty.img", &contents)) {
         return false;
@@ -152,7 +152,7 @@
             continue;
         }
         auto flash_task = tasks[i + 2]->AsFlashTask();
-        if (!FlashTask::IsDynamicParitition(source, flash_task)) {
+        if (!FlashTask::IsDynamicPartition(source, flash_task)) {
             continue;
         }
         return true;
@@ -224,7 +224,7 @@
     auto remove_if_callback = [&](const auto& task) -> bool {
         if (auto flash_task = task->AsFlashTask()) {
             return helper->WillFlash(flash_task->GetPartitionAndSlot());
-        } else if (auto update_super_task = task->AsUpdateSuperTask()) {
+        } else if (task->AsUpdateSuperTask()) {
             return true;
         } else if (auto reboot_task = task->AsRebootTask()) {
             if (reboot_task->GetTarget() == "fastboot") {
diff --git a/fastboot/task.h b/fastboot/task.h
index a98c874..7a713cf 100644
--- a/fastboot/task.h
+++ b/fastboot/task.h
@@ -52,7 +52,7 @@
               const bool apply_vbmeta, const FlashingPlan* fp);
     virtual FlashTask* AsFlashTask() override { return this; }
 
-    static bool IsDynamicParitition(const ImageSource* source, const FlashTask* task);
+    static bool IsDynamicPartition(const ImageSource* source, const FlashTask* task);
     void Run() override;
     std::string ToString() const override;
     std::string GetPartition() const { return pname_; }
diff --git a/fastboot/task_test.cpp b/fastboot/task_test.cpp
index 9cde1a8..519d4ed 100644
--- a/fastboot/task_test.cpp
+++ b/fastboot/task_test.cpp
@@ -233,7 +233,7 @@
             << "size of fastboot-info task list: " << fastboot_info_tasks.size()
             << " size of hardcoded task list: " << hardcoded_tasks.size();
 }
-TEST_F(ParseTest, IsDynamicParitiontest) {
+TEST_F(ParseTest, IsDynamicPartitiontest) {
     if (!get_android_product_out()) {
         GTEST_SKIP();
     }
@@ -258,7 +258,7 @@
                 ParseFastbootInfoLine(fp.get(), android::base::Tokenize(test.first, " "));
         auto flash_task = task->AsFlashTask();
         ASSERT_FALSE(flash_task == nullptr);
-        ASSERT_EQ(FlashTask::IsDynamicParitition(fp->source.get(), flash_task), test.second);
+        ASSERT_EQ(FlashTask::IsDynamicPartition(fp->source.get(), flash_task), test.second);
     }
 }
 
@@ -354,11 +354,11 @@
                                 const std::vector<std::unique_ptr<Task>>& tasks) {
             bool contains_optimized_task = false;
             for (auto& task : tasks) {
-                if (auto optimized_task = task->AsOptimizedFlashSuperTask()) {
+                if (task->AsOptimizedFlashSuperTask()) {
                     contains_optimized_task = true;
                 }
                 if (auto flash_task = task->AsFlashTask()) {
-                    if (FlashTask::IsDynamicParitition(fp->source.get(), flash_task)) {
+                    if (FlashTask::IsDynamicPartition(fp->source.get(), flash_task)) {
                         return false;
                     }
                 }
diff --git a/fastboot/usb_linux.cpp b/fastboot/usb_linux.cpp
index 37bb304..03af8f7 100644
--- a/fastboot/usb_linux.cpp
+++ b/fastboot/usb_linux.cpp
@@ -83,7 +83,18 @@
 // be reliable.
 // 256KiB seems to work, but 1MiB bulk transfers lock up my z620 with a 3.13
 // kernel.
-#define MAX_USBFS_BULK_SIZE (16 * 1024)
+// 128KiB was experimentally found to be enough to saturate the bus at
+// SuperSpeed+, so we first try double that for writes. If the operation fails
+// due to a lack of contiguous regions (or an ancient kernel), try smaller sizes
+// until we find one that works (see LinuxUsbTransport::Write). Reads are less
+// performance critical so for now just use a known good size.
+#define MAX_USBFS_BULK_WRITE_SIZE (256 * 1024)
+#define MAX_USBFS_BULK_READ_SIZE (16 * 1024)
+
+// This size should pretty much always work (it's compatible with pre-3.3
+// kernels and it's what we used to use historically), so if it doesn't work
+// something has gone badly wrong.
+#define MIN_USBFS_BULK_WRITE_SIZE (16 * 1024)
 
 struct usb_handle
 {
@@ -108,6 +119,7 @@
   private:
     std::unique_ptr<usb_handle> handle_;
     const uint32_t ms_timeout_;
+    size_t max_usbfs_bulk_write_size_ = MAX_USBFS_BULK_WRITE_SIZE;
 
     DISALLOW_COPY_AND_ASSIGN(LinuxUsbTransport);
 };
@@ -269,6 +281,9 @@
         auto path = android::base::StringPrintf("/sys/bus/usb/devices/%s/%s:1.%d/interface",
                                                 sysfs_name, sysfs_name, ifc->bInterfaceNumber);
         if (android::base::ReadFileToString(path, &interface)) {
+            if (!interface.empty() && interface.back() == '\n') {
+                interface.pop_back();
+            }
             snprintf(info.interface, sizeof(info.interface), "%s", interface.c_str());
         }
 
@@ -404,34 +419,90 @@
 {
     unsigned char *data = (unsigned char*) _data;
     unsigned count = 0;
-    struct usbdevfs_bulktransfer bulk;
-    int n;
+    struct usbdevfs_urb urb[2] = {};
+    bool pending[2] = {};
 
     if (handle_->ep_out == 0 || handle_->desc == -1) {
         return -1;
     }
 
-    do {
-        int xfer;
-        xfer = (len > MAX_USBFS_BULK_SIZE) ? MAX_USBFS_BULK_SIZE : len;
+    auto submit_urb = [&](size_t i) {
+        while (true) {
+            int xfer = (len > max_usbfs_bulk_write_size_) ? max_usbfs_bulk_write_size_ : len;
 
-        bulk.ep = handle_->ep_out;
-        bulk.len = xfer;
-        bulk.data = data;
-        bulk.timeout = ms_timeout_;
+            urb[i].type = USBDEVFS_URB_TYPE_BULK;
+            urb[i].endpoint = handle_->ep_out;
+            urb[i].buffer_length = xfer;
+            urb[i].buffer = data;
+            urb[i].usercontext = (void *)i;
 
-        n = ioctl(handle_->desc, USBDEVFS_BULK, &bulk);
-        if(n != xfer) {
-            DBG("ERROR: n = %d, errno = %d (%s)\n",
-                n, errno, strerror(errno));
+            int n = ioctl(handle_->desc, USBDEVFS_SUBMITURB, &urb[i]);
+            if (n != 0) {
+                if (errno == ENOMEM && max_usbfs_bulk_write_size_ > MIN_USBFS_BULK_WRITE_SIZE) {
+                    max_usbfs_bulk_write_size_ /= 2;
+                    continue;
+                }
+                DBG("ioctl(USBDEVFS_SUBMITURB) failed\n");
+                return false;
+            }
+
+            pending[i] = true;
+            count += xfer;
+            len -= xfer;
+            data += xfer;
+
+            return true;
+        }
+    };
+
+    auto reap_urb = [&](size_t i) {
+        while (pending[i]) {
+            struct usbdevfs_urb *urbp;
+            int res = ioctl(handle_->desc, USBDEVFS_REAPURB, &urbp);
+            if (res != 0) {
+                DBG("ioctl(USBDEVFS_REAPURB) failed\n");
+                return false;
+            }
+            size_t done = (size_t)urbp->usercontext;
+            if (done >= 2 || !pending[done]) {
+                DBG("unexpected urb\n");
+                return false;
+            }
+            if (urbp->status != 0 || urbp->actual_length != urbp->buffer_length) {
+                DBG("urb returned error\n");
+                return false;
+            }
+            pending[done] = false;
+        }
+        return true;
+    };
+
+    if (!submit_urb(0)) {
+        return -1;
+    }
+    while (len > 0) {
+        if (!submit_urb(1)) {
             return -1;
         }
-
-        count += xfer;
-        len -= xfer;
-        data += xfer;
-    } while(len > 0);
-
+        if (!reap_urb(0)) {
+            return -1;
+        }
+        if (len <= 0) {
+            if (!reap_urb(1)) {
+                return -1;
+            }
+            return count;
+        }
+        if (!submit_urb(0)) {
+            return -1;
+        }
+        if (!reap_urb(1)) {
+            return -1;
+        }
+    }
+    if (!reap_urb(0)) {
+        return -1;
+    }
     return count;
 }
 
@@ -447,7 +518,7 @@
     }
 
     while (len > 0) {
-        int xfer = (len > MAX_USBFS_BULK_SIZE) ? MAX_USBFS_BULK_SIZE : len;
+        int xfer = (len > MAX_USBFS_BULK_READ_SIZE) ? MAX_USBFS_BULK_READ_SIZE : len;
 
         bulk.ep = handle_->ep_in;
         bulk.len = xfer;
diff --git a/fastboot/util.cpp b/fastboot/util.cpp
index e03012a..5966aea 100644
--- a/fastboot/util.cpp
+++ b/fastboot/util.cpp
@@ -31,7 +31,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sys/stat.h>
-#include <sys/time.h>
+#include <time.h>
 
 #include <android-base/parseint.h>
 #include <android-base/strings.h>
@@ -43,9 +43,9 @@
 static bool g_verbose = false;
 
 double now() {
-    struct timeval tv;
-    gettimeofday(&tv, NULL);
-    return (double)tv.tv_sec + (double)tv.tv_usec / 1000000;
+    struct timespec ts;
+    clock_gettime(CLOCK_MONOTONIC, &ts);
+    return (double)ts.tv_sec + (double)ts.tv_nsec / 1000000000;
 }
 
 void die(const char* fmt, ...) {
diff --git a/fs_mgr/TEST_MAPPING b/fs_mgr/TEST_MAPPING
index 324f50a..1989a5c 100644
--- a/fs_mgr/TEST_MAPPING
+++ b/fs_mgr/TEST_MAPPING
@@ -25,7 +25,7 @@
     {
       "name": "vab_legacy_tests"
     },
-    // TODO: b/279009697
+    // TODO(b/279009697):
     //{"name": "vabc_legacy_tests"},
     {
       "name": "cow_api_test"
@@ -42,12 +42,9 @@
       "name": "liblp_test"
     },
     {
-      "name": "vts_libsnapshot_test"
-    },
-    {
       "name": "vab_legacy_tests"
     },
-    // TODO: b/279009697
+    // TODO(b/279009697):
     //{"name": "vabc_legacy_tests"}
     {
       "name": "snapuserd_test"
diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp
index faea5eb..8c0c1ef 100644
--- a/fs_mgr/fs_mgr.cpp
+++ b/fs_mgr/fs_mgr.cpp
@@ -16,7 +16,6 @@
 
 #include "fs_mgr.h"
 
-#include <ctype.h>
 #include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
@@ -701,6 +700,29 @@
 }
 
 //
+// Mechanism to allow fsck to be triggered by setting ro.preventative_fsck
+// Introduced to address b/305658663
+// If the property value is not equal to the flag file contents, trigger
+// fsck and store the property value in the flag file
+// If we want to trigger again, simply change the property value
+//
+static bool check_if_preventative_fsck_needed(const FstabEntry& entry) {
+    const char* flag_file = "/metadata/vold/preventative_fsck";
+    if (entry.mount_point != "/data") return false;
+
+    // Don't error check - both default to empty string, which is OK
+    std::string prop = android::base::GetProperty("ro.preventative_fsck", "");
+    std::string flag;
+    android::base::ReadFileToString(flag_file, &flag);
+    if (prop == flag) return false;
+    // fsck is run immediately, so assume it runs or there is some deeper problem
+    if (!android::base::WriteStringToFile(prop, flag_file))
+        PERROR << "Failed to write file " << flag_file;
+    LINFO << "Run preventative fsck on /data";
+    return true;
+}
+
+//
 // Prepare the filesystem on the given block device to be mounted.
 //
 // If the "check" option was given in the fstab record, or it seems that the
@@ -750,7 +772,7 @@
         }
     }
 
-    if (entry.fs_mgr_flags.check ||
+    if (check_if_preventative_fsck_needed(entry) || entry.fs_mgr_flags.check ||
         (fs_stat & (FS_STAT_UNCLEAN_SHUTDOWN | FS_STAT_QUOTA_ENABLED))) {
         check_fs(blk_device, entry.fs_type, mount_point, &fs_stat);
     }
@@ -796,9 +818,13 @@
 // __mount(): wrapper around the mount() system call which also
 // sets the underlying block device to read-only if the mount is read-only.
 // See "man 2 mount" for return values.
-static int __mount(const std::string& source, const std::string& target, const FstabEntry& entry) {
+static int __mount(const std::string& source, const std::string& target, const FstabEntry& entry,
+                   bool read_only = false) {
     errno = 0;
     unsigned long mountflags = entry.flags;
+    if (read_only) {
+        mountflags |= MS_RDONLY;
+    }
     int ret = 0;
     int save_errno = 0;
     int gc_allowance = 0;
@@ -892,6 +918,10 @@
     return true;
 }
 
+static bool should_use_metadata_encryption(const FstabEntry& entry) {
+    return !entry.metadata_key_dir.empty() && entry.fs_mgr_flags.file_encryption;
+}
+
 // Tries to mount any of the consecutive fstab entries that match
 // the mountpoint of the one given by fstab[start_idx].
 //
@@ -899,8 +929,7 @@
 // attempted_idx: On return, will indicate which fstab entry
 //     succeeded. In case of failure, it will be the start_idx.
 // Sets errno to match the 1st mount failure on failure.
-static bool mount_with_alternatives(Fstab& fstab, int start_idx, int* end_idx,
-                                    int* attempted_idx) {
+static bool mount_with_alternatives(Fstab& fstab, int start_idx, int* end_idx, int* attempted_idx) {
     unsigned long i;
     int mount_errno = 0;
     bool mounted = false;
@@ -938,8 +967,15 @@
         }
 
         int retry_count = 2;
+        const auto read_only = should_use_metadata_encryption(fstab[i]);
+        if (read_only) {
+            LOG(INFO) << "Mount point " << fstab[i].blk_device << " @ " << fstab[i].mount_point
+                      << " uses metadata encryption, which means we need to unmount it later and "
+                         "call encryptFstab/encrypt_inplace. To avoid file operations before "
+                         "encryption, we will mount it as read-only first";
+        }
         while (retry_count-- > 0) {
-            if (!__mount(fstab[i].blk_device, fstab[i].mount_point, fstab[i])) {
+            if (!__mount(fstab[i].blk_device, fstab[i].mount_point, fstab[i], read_only)) {
                 *attempted_idx = i;
                 mounted = true;
                 if (i != start_idx) {
@@ -1031,10 +1067,6 @@
     return false;
 }
 
-static bool should_use_metadata_encryption(const FstabEntry& entry) {
-    return !entry.metadata_key_dir.empty() && entry.fs_mgr_flags.file_encryption;
-}
-
 // Check to see if a mountable volume has encryption requirements
 static int handle_encryptable(const FstabEntry& entry) {
     if (should_use_metadata_encryption(entry)) {
@@ -1244,17 +1276,27 @@
 };
 
 std::string fs_mgr_find_bow_device(const std::string& block_device) {
-    if (block_device.substr(0, 5) != "/dev/") {
-        LOG(ERROR) << "Expected block device, got " << block_device;
-        return std::string();
+    // handle symlink such as "/dev/block/mapper/userdata"
+    std::string real_path;
+    if (!android::base::Realpath(block_device, &real_path)) {
+        real_path = block_device;
     }
 
-    std::string sys_dir = std::string("/sys/") + block_device.substr(5);
-
+    struct stat st;
+    if (stat(real_path.c_str(), &st) < 0) {
+        PLOG(ERROR) << "stat failed: " << real_path;
+        return std::string();
+    }
+    if (!S_ISBLK(st.st_mode)) {
+        PLOG(ERROR) << real_path << " is not block device";
+        return std::string();
+    }
+    std::string sys_dir = android::base::StringPrintf("/sys/dev/block/%u:%u", major(st.st_rdev),
+                                                      minor(st.st_rdev));
     for (;;) {
         std::string name;
         if (!android::base::ReadFileToString(sys_dir + "/dm/name", &name)) {
-            PLOG(ERROR) << block_device << " is not dm device";
+            PLOG(ERROR) << real_path << " is not dm device";
             return std::string();
         }
 
@@ -1388,6 +1430,8 @@
         return {FS_MGR_MNTALL_FAIL, userdata_mounted};
     }
 
+    bool scratch_can_be_mounted = true;
+
     // Keep i int to prevent unsigned integer overflow from (i = top_idx - 1),
     // where top_idx is 0. It will give SIGABRT
     for (int i = 0; i < static_cast<int>(fstab->size()); i++) {
@@ -1506,6 +1550,7 @@
                 }
                 encryptable = status;
                 if (status == FS_MGR_MNTALL_DEV_NEEDS_METADATA_ENCRYPTION) {
+                    fs_mgr_set_blk_ro(attempted_entry.blk_device, false);
                     if (!call_vdc({"cryptfs", "encryptFstab", attempted_entry.blk_device,
                                    attempted_entry.mount_point, wiped ? "true" : "false",
                                    attempted_entry.fs_type, attempted_entry.zoned_device},
@@ -1520,6 +1565,9 @@
             if (current_entry.mount_point == "/data") {
                 userdata_mounted = true;
             }
+
+            MountOverlayfs(attempted_entry, &scratch_can_be_mounted);
+
             // Success!  Go get the next one.
             continue;
         }
@@ -1604,10 +1652,6 @@
 
     set_type_property(encryptable);
 
-#if ALLOW_ADBD_DISABLE_VERITY == 1  // "userdebug" build
-    fs_mgr_overlayfs_mount_all(fstab);
-#endif
-
     if (error_count) {
         return {FS_MGR_MNTALL_FAIL, userdata_mounted};
     } else {
@@ -1944,6 +1988,8 @@
                 if (retry_count <= 0) break;  // run check_fs only once
                 if (!first_mount_errno) first_mount_errno = errno;
                 mount_errors++;
+                PERROR << "Cannot mount filesystem on " << n_blk_device << " at " << mount_point
+                       << " with fstype " << fstab_entry.fs_type;
                 fs_stat |= FS_STAT_FULL_MOUNT_FAILED;
                 // try again after fsck
                 check_fs(n_blk_device, fstab_entry.fs_type, mount_point, &fs_stat);
diff --git a/fs_mgr/fs_mgr_format.cpp b/fs_mgr/fs_mgr_format.cpp
index 622f181..8e76150 100644
--- a/fs_mgr/fs_mgr_format.cpp
+++ b/fs_mgr/fs_mgr_format.cpp
@@ -136,6 +136,7 @@
     /* Format the partition using the calculated length */
 
     const auto size_str = std::to_string(dev_sz / getpagesize());
+    std::string block_size = std::to_string(getpagesize());
 
     std::vector<const char*> args = {"/system/bin/make_f2fs", "-g", "android"};
     if (needs_projid) {
@@ -154,6 +155,10 @@
         args.push_back("-O");
         args.push_back("extra_attr");
     }
+    args.push_back("-w");
+    args.push_back(block_size.c_str());
+    args.push_back("-b");
+    args.push_back(block_size.c_str());
     if (!zoned_device.empty()) {
         args.push_back("-c");
         args.push_back(zoned_device.c_str());
diff --git a/fs_mgr/fs_mgr_overlayfs_control.cpp b/fs_mgr/fs_mgr_overlayfs_control.cpp
index 50d8280..08ad80c 100644
--- a/fs_mgr/fs_mgr_overlayfs_control.cpp
+++ b/fs_mgr/fs_mgr_overlayfs_control.cpp
@@ -219,6 +219,35 @@
     return OverlayfsTeardownResult::Ok;
 }
 
+bool GetOverlaysActiveFlag() {
+    auto slot_number = fs_mgr_overlayfs_slot_number();
+    const auto super_device = kPhysicalDevice + fs_mgr_get_super_partition_name();
+
+    auto metadata = ReadMetadata(super_device, slot_number);
+    if (!metadata) {
+        return false;
+    }
+    return !!(metadata->header.flags & LP_HEADER_FLAG_OVERLAYS_ACTIVE);
+}
+
+bool SetOverlaysActiveFlag(bool flag) {
+    // Mark overlays as active in the partition table, to detect re-flash.
+    auto slot_number = fs_mgr_overlayfs_slot_number();
+    const auto super_device = kPhysicalDevice + fs_mgr_get_super_partition_name();
+    auto builder = MetadataBuilder::New(super_device, slot_number);
+    if (!builder) {
+        LERROR << "open " << super_device << " metadata";
+        return false;
+    }
+    builder->SetOverlaysActiveFlag(flag);
+    auto metadata = builder->Export();
+    if (!metadata || !UpdatePartitionTable(super_device, *metadata.get(), slot_number)) {
+        LERROR << "update super metadata";
+        return false;
+    }
+    return true;
+}
+
 OverlayfsTeardownResult fs_mgr_overlayfs_teardown_scratch(const std::string& overlay,
                                                           bool* change) {
     // umount and delete kScratchMountPoint storage if we have logical partitions
@@ -232,6 +261,10 @@
         return OverlayfsTeardownResult::Error;
     }
 
+    // Note: we don't care if SetOverlaysActiveFlag fails, since
+    // the overlays are removed no matter what.
+    SetOverlaysActiveFlag(false);
+
     bool was_mounted = fs_mgr_overlayfs_already_mounted(kScratchMountPoint, false);
     if (was_mounted) {
         fs_mgr_overlayfs_umount_scratch();
@@ -347,33 +380,6 @@
     return "";
 }
 
-// This returns the scratch device that was detected during early boot (first-
-// stage init). If the device was created later, for example during setup for
-// the adb remount command, it can return an empty string since it does not
-// query ImageManager. (Note that ImageManager in first-stage init will always
-// use device-mapper, since /data is not available to use loop devices.)
-static std::string GetBootScratchDevice() {
-    // Note: fs_mgr_is_dsu_running() always returns false in recovery or fastbootd.
-    if (fs_mgr_is_dsu_running()) {
-        return GetDsuScratchDevice();
-    }
-
-    auto& dm = DeviceMapper::Instance();
-
-    // If there is a scratch partition allocated in /data or on super, we
-    // automatically prioritize that over super_other or system_other.
-    // Some devices, for example, have a write-protected eMMC and the
-    // super partition cannot be used even if it exists.
-    std::string device;
-    auto partition_name = android::base::Basename(kScratchMountPoint);
-    if (dm.GetState(partition_name) != DmDeviceState::INVALID &&
-        dm.GetDmDevicePathByName(partition_name, &device)) {
-        return device;
-    }
-
-    return "";
-}
-
 bool MakeScratchFilesystem(const std::string& scratch_device) {
     // Force mkfs by design for overlay support of adb remount, simplify and
     // thus do not rely on fsck to correct problems that could creep in.
@@ -383,6 +389,8 @@
         fs_type = "f2fs";
         command = kMkF2fs + " -w "s;
         command += std::to_string(getpagesize());
+        command = kMkF2fs + " -b "s;
+        command += std::to_string(getpagesize());
         command += " -f -d1 -l" + android::base::Basename(kScratchMountPoint);
     } else if (!access(kMkExt4, X_OK) && fs_mgr_filesystem_available("ext4")) {
         fs_type = "ext4";
@@ -473,6 +481,7 @@
             }
         }
     }
+
     // land the update back on to the partition
     if (changed) {
         auto metadata = builder->Export();
@@ -617,6 +626,12 @@
         return false;
     }
 
+    if (!SetOverlaysActiveFlag(true)) {
+        LOG(ERROR) << "Failed to update dynamic partition data";
+        fs_mgr_overlayfs_teardown_scratch(kScratchMountPoint, nullptr);
+        return false;
+    }
+
     // If the partition exists, assume first that it can be mounted.
     if (partition_exists) {
         if (MountScratch(scratch_device)) {
@@ -881,21 +896,9 @@
         return;
     }
 
-    bool want_scratch = false;
-    for (const auto& entry : fs_mgr_overlayfs_candidate_list(*fstab)) {
-        if (fs_mgr_is_verity_enabled(entry)) {
-            continue;
-        }
-        if (fs_mgr_overlayfs_already_mounted(fs_mgr_mount_point(entry.mount_point))) {
-            continue;
-        }
-        want_scratch = true;
-        break;
-    }
-    if (!want_scratch) {
+    if (!GetOverlaysActiveFlag()) {
         return;
     }
-
     if (ScratchIsOnData()) {
         if (auto images = IImageManager::Open("remount", 0ms)) {
             images->MapAllImages(init);
@@ -919,9 +922,39 @@
     }
     if (auto images = IImageManager::Open("remount", 0ms)) {
         images->RemoveDisabledImages();
+        if (!GetOverlaysActiveFlag()) {
+            fs_mgr_overlayfs_teardown_scratch(kScratchMountPoint, nullptr);
+        }
     }
 }
 
+// This returns the scratch device that was detected during early boot (first-
+// stage init). If the device was created later, for example during setup for
+// the adb remount command, it can return an empty string since it does not
+// query ImageManager. (Note that ImageManager in first-stage init will always
+// use device-mapper, since /data is not available to use loop devices.)
+std::string GetBootScratchDevice() {
+    // Note: fs_mgr_is_dsu_running() always returns false in recovery or fastbootd.
+    if (fs_mgr_is_dsu_running()) {
+        return GetDsuScratchDevice();
+    }
+
+    auto& dm = DeviceMapper::Instance();
+
+    // If there is a scratch partition allocated in /data or on super, we
+    // automatically prioritize that over super_other or system_other.
+    // Some devices, for example, have a write-protected eMMC and the
+    // super partition cannot be used even if it exists.
+    std::string device;
+    auto partition_name = android::base::Basename(kScratchMountPoint);
+    if (dm.GetState(partition_name) != DmDeviceState::INVALID &&
+        dm.GetDmDevicePathByName(partition_name, &device)) {
+        return device;
+    }
+
+    return "";
+}
+
 void TeardownAllOverlayForMountPoint(const std::string& mount_point) {
     if (!OverlayfsTeardownAllowed()) {
         return;
diff --git a/fs_mgr/fs_mgr_overlayfs_control.h b/fs_mgr/fs_mgr_overlayfs_control.h
index b175101..3516c46 100644
--- a/fs_mgr/fs_mgr_overlayfs_control.h
+++ b/fs_mgr/fs_mgr_overlayfs_control.h
@@ -38,5 +38,7 @@
 
 void CleanupOldScratchFiles();
 
+std::string GetBootScratchDevice();
+
 }  // namespace fs_mgr
 }  // namespace android
diff --git a/fs_mgr/fs_mgr_overlayfs_mount.cpp b/fs_mgr/fs_mgr_overlayfs_mount.cpp
index ae7ed4c..a1ec63b 100644
--- a/fs_mgr/fs_mgr_overlayfs_mount.cpp
+++ b/fs_mgr/fs_mgr_overlayfs_mount.cpp
@@ -34,6 +34,7 @@
 #include <android-base/file.h>
 #include <android-base/macros.h>
 #include <android-base/properties.h>
+#include <android-base/scopeguard.h>
 #include <android-base/strings.h>
 #include <android-base/unique_fd.h>
 #include <ext4_utils/ext4_utils.h>
@@ -41,15 +42,14 @@
 #include <fs_mgr/file_wait.h>
 #include <fs_mgr_overlayfs.h>
 #include <fstab/fstab.h>
-#include <libdm/dm.h>
 #include <libgsi/libgsi.h>
 #include <storage_literals/storage_literals.h>
 
+#include "fs_mgr_overlayfs_control.h"
 #include "fs_mgr_overlayfs_mount.h"
 #include "fs_mgr_priv.h"
 
 using namespace std::literals;
-using namespace android::dm;
 using namespace android::fs_mgr;
 using namespace android::storage_literals;
 
@@ -58,6 +58,9 @@
 constexpr char kCacheMountPoint[] = "/cache";
 constexpr char kPhysicalDevice[] = "/dev/block/by-name/";
 
+// Mount tree to temporarily hold references to submounts.
+constexpr char kMoveMountTempDir[] = "/dev/remount";
+
 constexpr char kLowerdirOption[] = "lowerdir=";
 constexpr char kUpperdirOption[] = "upperdir=";
 constexpr char kWorkdirOption[] = "workdir=";
@@ -95,7 +98,12 @@
     if (mount_point.empty() || !android::base::Realpath(mount_point, &normalized_path)) {
         return "";
     }
-    return android::base::StringReplace(normalized_path, "/", "@", true);
+    std::string_view sv(normalized_path);
+    if (sv != "/") {
+        android::base::ConsumePrefix(&sv, "/");
+        android::base::ConsumeSuffix(&sv, "/");
+    }
+    return android::base::StringReplace(sv, "/", "@", true);
 }
 
 static bool fs_mgr_is_dir(const std::string& path) {
@@ -284,10 +292,6 @@
     if (ret) {
         PERROR << "__mount(target=" << mount_point
                << ",flag=" << (shared_flag ? "MS_SHARED" : "MS_PRIVATE") << ")=" << ret;
-        // If "/system" doesn't look like a mountpoint, retry with "/".
-        if (errno == EINVAL && mount_point == "/system") {
-            return fs_mgr_overlayfs_set_shared_mount("/", shared_flag);
-        }
         return false;
     }
     return true;
@@ -302,6 +306,25 @@
     return true;
 }
 
+static bool fs_mgr_overlayfs_mount(const std::string& mount_point, const std::string& options) {
+    auto report = "__mount(source=overlay,target="s + mount_point + ",type=overlay";
+    for (const auto& opt : android::base::Split(options, ",")) {
+        if (android::base::StartsWith(opt, kUpperdirOption)) {
+            report = report + "," + opt;
+            break;
+        }
+    }
+    report = report + ")=";
+    auto ret = mount("overlay", mount_point.c_str(), "overlay", MS_RDONLY | MS_NOATIME,
+                     options.c_str());
+    if (ret) {
+        PERROR << report << ret;
+    } else {
+        LINFO << report << ret;
+    }
+    return !ret;
+}
+
 struct mount_info {
     std::string mount_point;
     bool shared_flag;
@@ -374,24 +397,23 @@
     return info;
 }
 
-static bool fs_mgr_overlayfs_mount(const FstabEntry& entry) {
-    const auto mount_point = fs_mgr_mount_point(entry.mount_point);
-    const auto options = fs_mgr_get_overlayfs_options(entry);
+static bool fs_mgr_overlayfs_mount_one(const FstabEntry& fstab_entry) {
+    const auto mount_point = fs_mgr_mount_point(fstab_entry.mount_point);
+    const auto options = fs_mgr_get_overlayfs_options(fstab_entry);
     if (options.empty()) return false;
 
-    auto retval = true;
-
     struct MoveEntry {
         std::string mount_point;
         std::string dir;
         bool shared_flag;
     };
-
     std::vector<MoveEntry> moved_mounts;
-    auto parent_private = false;
-    auto parent_made_private = false;
-    auto dev_private = false;
-    auto dev_made_private = false;
+
+    bool retval = true;
+    bool move_dir_shared = true;
+    bool parent_shared = true;
+    bool root_shared = true;
+    bool root_made_private = false;
 
     // There could be multiple mount entries with the same mountpoint.
     // Group these entries together with stable_sort, and keep only the last entry of a group.
@@ -411,18 +433,32 @@
     // mountinfo is reversed twice, so still is in lexical sorted order.
 
     for (const auto& entry : mountinfo) {
-        if ((entry.mount_point == mount_point) && !entry.shared_flag) {
-            parent_private = true;
+        if (entry.mount_point == kMoveMountTempDir) {
+            move_dir_shared = entry.shared_flag;
         }
-        if ((entry.mount_point == "/dev") && !entry.shared_flag) {
-            dev_private = true;
+        if (entry.mount_point == mount_point ||
+            (mount_point == "/system" && entry.mount_point == "/")) {
+            parent_shared = entry.shared_flag;
         }
+        if (entry.mount_point == "/") {
+            root_shared = entry.shared_flag;
+        }
+    }
+
+    // Precondition is that kMoveMountTempDir is MS_PRIVATE, otherwise don't try to move any
+    // submount in to or out of it.
+    if (move_dir_shared) {
+        mountinfo.clear();
     }
 
     // Need to make the original mountpoint MS_PRIVATE, so that the overlayfs can be MS_MOVE.
     // This could happen if its parent mount is remounted later.
-    if (!parent_private) {
-        parent_made_private = fs_mgr_overlayfs_set_shared_mount(mount_point, false);
+    if (!fs_mgr_overlayfs_set_shared_mount(mount_point, false)) {
+        // If failed to set "/system" mount type, it might be due to "/system" not being a valid
+        // mountpoint after switch root. Retry with "/" in this case.
+        if (errno == EINVAL && mount_point == "/system") {
+            root_made_private = fs_mgr_overlayfs_set_shared_mount("/", false);
+        }
     }
 
     for (const auto& entry : mountinfo) {
@@ -440,8 +476,8 @@
         // mountinfo is in lexical order, so no need to worry about |entry| being a parent mount of
         // entries of |moved_mounts|.
 
-        // use as the bound directory in /dev.
-        MoveEntry new_entry{entry.mount_point, "/dev/TemporaryDir-XXXXXX", entry.shared_flag};
+        MoveEntry new_entry{entry.mount_point, kMoveMountTempDir + "/TemporaryDir-XXXXXX"s,
+                            entry.shared_flag};
         {
             AutoSetFsCreateCon createcon;
             auto new_context = fs_mgr_get_context(entry.mount_point);
@@ -475,32 +511,10 @@
         moved_mounts.push_back(std::move(new_entry));
     }
 
-    // hijack __mount() report format to help triage
-    auto report = "__mount(source=overlay,target="s + mount_point + ",type=overlay";
-    const auto opt_list = android::base::Split(options, ",");
-    for (const auto& opt : opt_list) {
-        if (android::base::StartsWith(opt, kUpperdirOption)) {
-            report = report + "," + opt;
-            break;
-        }
-    }
-    report = report + ")=";
-
-    auto ret = mount("overlay", mount_point.c_str(), "overlay", MS_RDONLY | MS_NOATIME,
-                     options.c_str());
-    if (ret) {
-        retval = false;
-        PERROR << report << ret;
-    } else {
-        LINFO << report << ret;
-    }
+    retval &= fs_mgr_overlayfs_mount(mount_point, options);
 
     // Move submounts back.
     for (const auto& entry : moved_mounts) {
-        if (!dev_private && !dev_made_private) {
-            dev_made_private = fs_mgr_overlayfs_set_shared_mount("/dev", false);
-        }
-
         if (!fs_mgr_overlayfs_move_mount(entry.dir, entry.mount_point)) {
             retval = false;
         } else if (entry.shared_flag &&
@@ -509,12 +523,13 @@
         }
         rmdir(entry.dir.c_str());
     }
-    if (dev_made_private) {
-        fs_mgr_overlayfs_set_shared_mount("/dev", true);
-    }
-    if (parent_made_private) {
+    // If the original (overridden) mount was MS_SHARED, then set the overlayfs mount to MS_SHARED.
+    if (parent_shared) {
         fs_mgr_overlayfs_set_shared_mount(mount_point, true);
     }
+    if (root_shared && root_made_private) {
+        fs_mgr_overlayfs_set_shared_mount("/", true);
+    }
 
     return retval;
 }
@@ -582,45 +597,6 @@
     return true;
 }
 
-// Note: The scratch partition of DSU is managed by gsid, and should be initialized during
-// first-stage-mount. Just check if the DM device for DSU scratch partition is created or not.
-static std::string GetDsuScratchDevice() {
-    auto& dm = DeviceMapper::Instance();
-    std::string device;
-    if (dm.GetState(android::gsi::kDsuScratch) != DmDeviceState::INVALID &&
-        dm.GetDmDevicePathByName(android::gsi::kDsuScratch, &device)) {
-        return device;
-    }
-    return "";
-}
-
-// This returns the scratch device that was detected during early boot (first-
-// stage init). If the device was created later, for example during setup for
-// the adb remount command, it can return an empty string since it does not
-// query ImageManager. (Note that ImageManager in first-stage init will always
-// use device-mapper, since /data is not available to use loop devices.)
-static std::string GetBootScratchDevice() {
-    // Note: fs_mgr_is_dsu_running() always returns false in recovery or fastbootd.
-    if (fs_mgr_is_dsu_running()) {
-        return GetDsuScratchDevice();
-    }
-
-    auto& dm = DeviceMapper::Instance();
-
-    // If there is a scratch partition allocated in /data or on super, we
-    // automatically prioritize that over super_other or system_other.
-    // Some devices, for example, have a write-protected eMMC and the
-    // super partition cannot be used even if it exists.
-    std::string device;
-    auto partition_name = android::base::Basename(kScratchMountPoint);
-    if (dm.GetState(partition_name) != DmDeviceState::INVALID &&
-        dm.GetDmDevicePathByName(partition_name, &device)) {
-        return device;
-    }
-
-    return "";
-}
-
 // NOTE: OverlayfsSetupAllowed() must be "stricter" than OverlayfsTeardownAllowed().
 // Setup is allowed only if teardown is also allowed.
 bool OverlayfsSetupAllowed(bool verbose) {
@@ -730,6 +706,25 @@
     if (!OverlayfsSetupAllowed()) {
         return false;
     }
+
+    // Ensure kMoveMountTempDir is standalone mount tree with 'private' propagation by bind mounting
+    // to itself and set to MS_PRIVATE.
+    // Otherwise mounts moved in to it would have their propagation type changed unintentionally.
+    // Section 5d, https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt
+    if (!fs_mgr_overlayfs_already_mounted(kMoveMountTempDir, false)) {
+        if (mkdir(kMoveMountTempDir, 0755) && errno != EEXIST) {
+            PERROR << "mkdir " << kMoveMountTempDir;
+        }
+        if (mount(kMoveMountTempDir, kMoveMountTempDir, nullptr, MS_BIND, nullptr)) {
+            PERROR << "bind mount " << kMoveMountTempDir;
+        }
+    }
+    fs_mgr_overlayfs_set_shared_mount(kMoveMountTempDir, false);
+    android::base::ScopeGuard umountDir([]() {
+        umount(kMoveMountTempDir);
+        rmdir(kMoveMountTempDir);
+    });
+
     auto ret = true;
     auto scratch_can_be_mounted = !fs_mgr_overlayfs_already_mounted(kScratchMountPoint, false);
     for (const auto& entry : fs_mgr_overlayfs_candidate_list(*fstab)) {
@@ -742,7 +737,7 @@
             scratch_can_be_mounted = false;
             TryMountScratch();
         }
-        ret &= fs_mgr_overlayfs_mount(entry);
+        ret &= fs_mgr_overlayfs_mount_one(entry);
     }
     return ret;
 }
@@ -785,3 +780,38 @@
     }
     return false;
 }
+
+namespace android {
+namespace fs_mgr {
+
+void MountOverlayfs(const FstabEntry& fstab_entry, bool* scratch_can_be_mounted) {
+    if (!OverlayfsSetupAllowed()) {
+        return;
+    }
+    const auto candidates = fs_mgr_overlayfs_candidate_list({fstab_entry});
+    if (candidates.empty()) {
+        return;
+    }
+    const auto& entry = candidates.front();
+    if (fs_mgr_is_verity_enabled(entry)) {
+        return;
+    }
+    const auto mount_point = fs_mgr_mount_point(entry.mount_point);
+    if (fs_mgr_overlayfs_already_mounted(mount_point)) {
+        return;
+    }
+    if (*scratch_can_be_mounted) {
+        *scratch_can_be_mounted = false;
+        if (!fs_mgr_overlayfs_already_mounted(kScratchMountPoint, false)) {
+            TryMountScratch();
+        }
+    }
+    const auto options = fs_mgr_get_overlayfs_options(entry);
+    if (options.empty()) {
+        return;
+    }
+    fs_mgr_overlayfs_mount(mount_point, options);
+}
+
+}  // namespace fs_mgr
+}  // namespace android
diff --git a/fs_mgr/fs_mgr_remount.cpp b/fs_mgr/fs_mgr_remount.cpp
index 7ba4d2b..79c0b6d 100644
--- a/fs_mgr/fs_mgr_remount.cpp
+++ b/fs_mgr/fs_mgr_remount.cpp
@@ -42,6 +42,7 @@
 #include <fstab/fstab.h>
 #include <libavb_user/libavb_user.h>
 #include <libgsi/libgsid.h>
+#include <private/android_filesystem_config.h>
 
 #include "fs_mgr_overlayfs_control.h"
 #include "fs_mgr_overlayfs_mount.h"
@@ -380,8 +381,8 @@
 
     // Now remount!
     for (const auto& mnt_point : {mount_point, entry.mount_point}) {
-        if (::mount(blk_device.c_str(), mnt_point.c_str(), entry.fs_type.c_str(), MS_REMOUNT,
-                    nullptr) == 0) {
+        if (::mount(blk_device.c_str(), mnt_point.c_str(), entry.fs_type.c_str(),
+                    MS_REMOUNT | MS_NOATIME, nullptr) == 0) {
             LOG(INFO) << "Remounted " << mnt_point << " as RW";
             return true;
         }
@@ -608,7 +609,19 @@
     }
 
     // Make sure we are root.
-    if (::getuid() != 0) {
+    if (const auto uid = ::getuid(); uid != AID_ROOT) {
+        // If requesting auto reboot, also try to auto gain root.
+        if (auto_reboot && uid == AID_SHELL && access("/system/xbin/su", F_OK) == 0) {
+            std::vector<char*> args{const_cast<char*>("/system/xbin/su"),
+                                    const_cast<char*>("root")};
+            for (int i = 0; i < argc; ++i) {
+                args.push_back(argv[i]);
+            }
+            args.push_back(nullptr);
+            LOG(INFO) << "Attempting to gain root with \"su root\"";
+            execv(args[0], args.data());
+            PLOG(ERROR) << "Failed to execute \"su root\"";
+        }
         LOG(ERROR) << "Not running as root. Try \"adb root\" first.";
         return EXIT_FAILURE;
     }
diff --git a/fs_mgr/fs_mgr_roots.cpp b/fs_mgr/fs_mgr_roots.cpp
index 2ad8125..a697fb3 100644
--- a/fs_mgr/fs_mgr_roots.cpp
+++ b/fs_mgr/fs_mgr_roots.cpp
@@ -115,8 +115,8 @@
         return true;
     }
 
-    static const std::vector<std::string> supported_fs{"ext4", "squashfs", "vfat", "f2fs", "erofs",
-                                                       "none"};
+    static const std::vector<std::string> supported_fs{"ext4", "squashfs", "vfat", "exfat", "f2fs",
+                                                       "erofs", "none"};
     if (std::find(supported_fs.begin(), supported_fs.end(), rec->fs_type) == supported_fs.end()) {
         LERROR << "unknown fs_type \"" << rec->fs_type << "\" for " << mount_point;
         return false;
diff --git a/fs_mgr/include/fs_mgr_overlayfs.h b/fs_mgr/include/fs_mgr_overlayfs.h
index bdaabbf..bf68b2c 100644
--- a/fs_mgr/include/fs_mgr_overlayfs.h
+++ b/fs_mgr/include/fs_mgr_overlayfs.h
@@ -30,6 +30,9 @@
 namespace android {
 namespace fs_mgr {
 
+// Mount the overlayfs override for |fstab_entry|.
+void MountOverlayfs(const FstabEntry& fstab_entry, bool* scratch_can_be_mounted);
+
 void MapScratchPartitionIfNeeded(Fstab* fstab,
                                  const std::function<bool(const std::set<std::string>&)>& init);
 
diff --git a/fs_mgr/libdm/dm.cpp b/fs_mgr/libdm/dm.cpp
index e261aa3..fee67fdf 100644
--- a/fs_mgr/libdm/dm.cpp
+++ b/fs_mgr/libdm/dm.cpp
@@ -39,6 +39,9 @@
 #ifndef DM_DEFERRED_REMOVE
 #define DM_DEFERRED_REMOVE (1 << 17)
 #endif
+#ifndef DM_IMA_MEASUREMENT_FLAG
+#define DM_IMA_MEASUREMENT_FLAG (1 << 19)
+#endif
 
 namespace android {
 namespace dm {
@@ -540,6 +543,10 @@
     return GetTable(name, 0, table);
 }
 
+bool DeviceMapper::GetTableStatusIma(const std::string& name, std::vector<TargetInfo>* table) {
+    return GetTable(name, DM_IMA_MEASUREMENT_FLAG, table);
+}
+
 bool DeviceMapper::GetTableInfo(const std::string& name, std::vector<TargetInfo>* table) {
     return GetTable(name, DM_STATUS_TABLE_FLAG, table);
 }
diff --git a/fs_mgr/libdm/dm_target.cpp b/fs_mgr/libdm/dm_target.cpp
index 90d91a0..1f6bd1a 100644
--- a/fs_mgr/libdm/dm_target.cpp
+++ b/fs_mgr/libdm/dm_target.cpp
@@ -61,6 +61,10 @@
     return block_device_ + " " + std::to_string(physical_sector_);
 }
 
+std::string DmTargetStripe::GetParameterString() const {
+    return "2 " + std::to_string(chunksize) + " " + block_device0_ + " 0 " + block_device1_ + " 0";
+}
+
 DmTargetVerity::DmTargetVerity(uint64_t start, uint64_t length, uint32_t version,
                                const std::string& block_device, const std::string& hash_device,
                                uint32_t data_block_size, uint32_t hash_block_size,
diff --git a/fs_mgr/libdm/dm_test.cpp b/fs_mgr/libdm/dm_test.cpp
index c522eaf..d043be6 100644
--- a/fs_mgr/libdm/dm_test.cpp
+++ b/fs_mgr/libdm/dm_test.cpp
@@ -181,6 +181,13 @@
     ASSERT_EQ(dm.GetState(dev.name()), DmDeviceState::ACTIVE);
 }
 
+TEST_F(DmTest, StripeArgs) {
+    DmTargetStripe target(0, 4096, 1024, "/dev/loop0", "/dev/loop1");
+    ASSERT_EQ(target.name(), "striped");
+    ASSERT_TRUE(target.Valid());
+    ASSERT_EQ(target.GetParameterString(), "2 1024 /dev/loop0 0 /dev/loop1 0");
+}
+
 TEST_F(DmTest, DmVerityArgsAvb2) {
     std::string device = "/dev/block/platform/soc/1da4000.ufshc/by-name/vendor_a";
     std::string algorithm = "sha1";
@@ -580,9 +587,18 @@
     ASSERT_TRUE(dm.GetDmDevicePathByName("libdm-test-dm-linear", &path));
     ASSERT_EQ(0, access(path.c_str(), F_OK));
 
+    std::string unique_path;
+    ASSERT_TRUE(dm.GetDeviceUniquePath("libdm-test-dm-linear", &unique_path));
+    ASSERT_EQ(0, access(unique_path.c_str(), F_OK));
+
     ASSERT_TRUE(dm.DeleteDevice("libdm-test-dm-linear", 5s));
     ASSERT_EQ(DmDeviceState::INVALID, dm.GetState("libdm-test-dm-linear"));
-    ASSERT_NE(0, access(path.c_str(), F_OK));
+    // Check that unique path of this device has been deleteted.
+    // Previously this test case used to check that dev node (i.e. /dev/block/dm-XX) has been
+    // deleted. However, this introduces a race condition, ueventd will remove the unique symlink
+    // (i.e. /dev/block/mapper/by-uuid/...) **before** removing the device node, while DeleteDevice
+    // API synchronizes on the unique symlink being deleted.
+    ASSERT_NE(0, access(unique_path.c_str(), F_OK));
     ASSERT_EQ(ENOENT, errno);
 }
 
diff --git a/fs_mgr/libdm/include/libdm/dm.h b/fs_mgr/libdm/include/libdm/dm.h
index 22c475f..fa97653 100644
--- a/fs_mgr/libdm/include/libdm/dm.h
+++ b/fs_mgr/libdm/include/libdm/dm.h
@@ -78,6 +78,7 @@
     virtual bool LoadTable(const std::string& name, const DmTable& table) = 0;
     virtual bool GetTableInfo(const std::string& name, std::vector<TargetInfo>* table) = 0;
     virtual bool GetTableStatus(const std::string& name, std::vector<TargetInfo>* table) = 0;
+    virtual bool GetTableStatusIma(const std::string& name, std::vector<TargetInfo>* table) = 0;
     virtual bool GetDmDevicePathByName(const std::string& name, std::string* path) = 0;
     virtual bool GetDeviceString(const std::string& name, std::string* dev) = 0;
     virtual bool DeleteDeviceIfExists(const std::string& name) = 0;
@@ -267,6 +268,12 @@
     // false.
     bool GetTableStatus(const std::string& name, std::vector<TargetInfo>* table) override;
 
+    // Query the status of a table, given a device name. The output vector will
+    // contain IMA TargetInfo for each target in the table. If the device does
+    // not exist, or there were too many targets, the call will fail and return
+    // false.
+    bool GetTableStatusIma(const std::string& name, std::vector<TargetInfo>* table) override;
+
     // Identical to GetTableStatus, except also retrives the active table for the device
     // mapper device from the kernel.
     bool GetTableInfo(const std::string& name, std::vector<TargetInfo>* table) override;
diff --git a/fs_mgr/libdm/include/libdm/dm_target.h b/fs_mgr/libdm/include/libdm/dm_target.h
index 09fe200..97f3c13 100644
--- a/fs_mgr/libdm/include/libdm/dm_target.h
+++ b/fs_mgr/libdm/include/libdm/dm_target.h
@@ -116,6 +116,24 @@
     uint64_t physical_sector_;
 };
 
+class DmTargetStripe final : public DmTarget {
+  public:
+    DmTargetStripe(uint64_t start, uint64_t length, uint64_t chunksize,
+                   const std::string& block_device0, const std::string& block_device1)
+        : DmTarget(start, length),
+          chunksize(chunksize),
+          block_device0_(block_device0),
+          block_device1_(block_device1) {}
+
+    std::string name() const override { return "striped"; }
+    std::string GetParameterString() const override;
+
+  private:
+    uint64_t chunksize;
+    std::string block_device0_;
+    std::string block_device1_;
+};
+
 class DmTargetVerity final : public DmTarget {
   public:
     DmTargetVerity(uint64_t start, uint64_t length, uint32_t version,
diff --git a/fs_mgr/libfiemap/image_manager.cpp b/fs_mgr/libfiemap/image_manager.cpp
index c416f4d..a5da6e3 100644
--- a/fs_mgr/libfiemap/image_manager.cpp
+++ b/fs_mgr/libfiemap/image_manager.cpp
@@ -531,11 +531,16 @@
     // If there is no intermediate device-mapper node, then partitions cannot be
     // opened writable due to sepolicy and exclusivity of having a mounted
     // filesystem. This should only happen on devices with no encryption, or
-    // devices with FBE and no metadata encryption. For these cases it suffices
-    // to perform normal file writes to /data/gsi (which is unencrypted).
+    // devices with FBE and no metadata encryption. For these cases we COULD
+    // perform normal writes to /data/gsi (which is unencrypted), but given that
+    // metadata encryption has been mandated since Android R, we don't actually
+    // support or test this.
     //
-    // Note: this is not gated on DeviceInfo, because the recovery-specific path
-    // must only be used in actual recovery.
+    // So, we validate here that /data is backed by device-mapper. This code
+    // isn't needed in recovery since there is no /data.
+    //
+    // If this logic sticks for a release, we can remove MapWithLoopDevice, as
+    // well as WrapUserdataIfNeeded in fs_mgr.
     std::string block_device;
     bool can_use_devicemapper;
     if (!FiemapWriter::GetBlockDeviceForFile(image_header, &block_device, &can_use_devicemapper)) {
@@ -543,21 +548,16 @@
         return false;
     }
 
-    if (can_use_devicemapper) {
-        if (!MapWithDmLinear(*partition_opener_.get(), name, timeout_ms, path)) {
-            return false;
-        }
-    } else if (!MapWithLoopDevice(name, timeout_ms, path)) {
-        return false;
-    }
-#else
-    // In recovery, we can *only* use device-mapper, since partitions aren't
-    // mounted. That also means we cannot call GetBlockDeviceForFile.
-    if (!MapWithDmLinear(*partition_opener_.get(), name, timeout_ms, path)) {
+    if (!can_use_devicemapper) {
+        LOG(ERROR) << "Cannot map image: /data must be mounted on top of device-mapper.";
         return false;
     }
 #endif
 
+    if (!MapWithDmLinear(*partition_opener_.get(), name, timeout_ms, path)) {
+        return false;
+    }
+
     // Set a property so we remember this is mapped.
     auto prop_name = GetStatusPropertyName(name);
     if (!android::base::SetProperty(prop_name, *path)) {
diff --git a/fs_mgr/libfs_avb/fs_avb.cpp b/fs_mgr/libfs_avb/fs_avb.cpp
index fb22423..be48de6 100644
--- a/fs_mgr/libfs_avb/fs_avb.cpp
+++ b/fs_mgr/libfs_avb/fs_avb.cpp
@@ -288,14 +288,82 @@
     return false;
 }
 
-AvbUniquePtr AvbHandle::LoadAndVerifyVbmeta(const FstabEntry& fstab_entry,
-                                            const std::vector<std::string>& preload_avb_key_blobs) {
+bool IsPublicKeyMatching(const FstabEntry& fstab_entry, const std::string& public_key_data,
+                         const std::vector<std::string>& preload_avb_key_blobs) {
     // At least one of the following should be provided for public key matching.
     if (preload_avb_key_blobs.empty() && fstab_entry.avb_keys.empty()) {
         LERROR << "avb_keys=/path/to/key(s) is missing for " << fstab_entry.mount_point;
-        return nullptr;
+        return false;
     }
 
+    // Expected key shouldn't be empty.
+    if (public_key_data.empty()) {
+        LERROR << "public key data shouldn't be empty for " << fstab_entry.mount_point;
+        return false;
+    }
+
+    // Performs key matching for preload_avb_key_blobs first, if it is present.
+    if (!preload_avb_key_blobs.empty()) {
+        if (std::find(preload_avb_key_blobs.begin(), preload_avb_key_blobs.end(),
+                      public_key_data) != preload_avb_key_blobs.end()) {
+            return true;
+        }
+    }
+
+    // Performs key matching for fstab_entry.avb_keys if necessary.
+    // Note that it is intentional to match both preload_avb_key_blobs and fstab_entry.avb_keys.
+    // Some keys might only be available before init chroots into /system, e.g., /avb/key1
+    // in the first-stage ramdisk, while other keys might only be available after the chroot,
+    // e.g., /system/etc/avb/key2.
+    // fstab_entry.avb_keys might be either a directory containing multiple keys,
+    // or a string indicating multiple keys separated by ':'.
+    std::vector<std::string> allowed_avb_keys;
+    auto list_avb_keys_in_dir = ListFiles(fstab_entry.avb_keys);
+    if (list_avb_keys_in_dir.ok()) {
+        std::sort(list_avb_keys_in_dir->begin(), list_avb_keys_in_dir->end());
+        allowed_avb_keys = *list_avb_keys_in_dir;
+    } else {
+        allowed_avb_keys = Split(fstab_entry.avb_keys, ":");
+    }
+    return ValidatePublicKeyBlob(public_key_data, allowed_avb_keys);
+}
+
+bool IsHashtreeDescriptorRootDigestMatching(const FstabEntry& fstab_entry,
+                                            const std::vector<VBMetaData>& vbmeta_images,
+                                            const std::string& ab_suffix,
+                                            const std::string& ab_other_suffix) {
+    // Read expected value of hashtree descriptor root digest from fstab_entry.
+    std::string root_digest_expected;
+    if (!ReadFileToString(fstab_entry.avb_hashtree_digest, &root_digest_expected)) {
+        LERROR << "Failed to load expected root digest for " << fstab_entry.mount_point;
+        return false;
+    }
+
+    // Read actual hashtree descriptor from vbmeta image.
+    std::string partition_name = DeriveAvbPartitionName(fstab_entry, ab_suffix, ab_other_suffix);
+    if (partition_name.empty()) {
+        LERROR << "Failed to find partition name for " << fstab_entry.mount_point;
+        return false;
+    }
+    std::unique_ptr<FsAvbHashtreeDescriptor> hashtree_descriptor =
+            android::fs_mgr::GetHashtreeDescriptor(partition_name, vbmeta_images);
+    if (!hashtree_descriptor) {
+        LERROR << "Not found hashtree descriptor for " << fstab_entry.mount_point;
+        return false;
+    }
+
+    // Performs hashtree descriptor root digest matching.
+    if (hashtree_descriptor->root_digest != root_digest_expected) {
+        LERROR << "root digest (" << hashtree_descriptor->root_digest
+               << ") is different from expected value (" << root_digest_expected << ")";
+        return false;
+    }
+
+    return true;
+}
+
+AvbUniquePtr AvbHandle::LoadAndVerifyVbmeta(const FstabEntry& fstab_entry,
+                                            const std::vector<std::string>& preload_avb_key_blobs) {
     // Binds allow_verification_error and rollback_protection to device unlock state.
     bool allow_verification_error = IsAvbPermissive();
     bool rollback_protection = !allow_verification_error;
@@ -333,40 +401,24 @@
             return nullptr;
     }
 
-    bool public_key_match = false;
-    // Performs key matching for preload_avb_key_blobs first, if it is present.
-    if (!public_key_data.empty() && !preload_avb_key_blobs.empty()) {
-        if (std::find(preload_avb_key_blobs.begin(), preload_avb_key_blobs.end(),
-                      public_key_data) != preload_avb_key_blobs.end()) {
-            public_key_match = true;
+    // Verify vbmeta image checking by either public key or hashtree descriptor root digest.
+    if (!preload_avb_key_blobs.empty() || !fstab_entry.avb_keys.empty()) {
+        if (!IsPublicKeyMatching(fstab_entry, public_key_data, preload_avb_key_blobs)) {
+            avb_handle->status_ = AvbHandleStatus::kVerificationError;
+            LWARNING << "Found unknown public key used to sign " << fstab_entry.mount_point;
+            if (!allow_verification_error) {
+                LERROR << "Unknown public key is not allowed";
+                return nullptr;
+            }
         }
-    }
-    // Performs key matching for fstab_entry.avb_keys if necessary.
-    // Note that it is intentional to match both preload_avb_key_blobs and fstab_entry.avb_keys.
-    // Some keys might only be availble before init chroots into /system, e.g., /avb/key1
-    // in the first-stage ramdisk, while other keys might only be available after the chroot,
-    // e.g., /system/etc/avb/key2.
-    if (!public_key_data.empty() && !public_key_match) {
-        // fstab_entry.avb_keys might be either a directory containing multiple keys,
-        // or a string indicating multiple keys separated by ':'.
-        std::vector<std::string> allowed_avb_keys;
-        auto list_avb_keys_in_dir = ListFiles(fstab_entry.avb_keys);
-        if (list_avb_keys_in_dir.ok()) {
-            std::sort(list_avb_keys_in_dir->begin(), list_avb_keys_in_dir->end());
-            allowed_avb_keys = *list_avb_keys_in_dir;
-        } else {
-            allowed_avb_keys = Split(fstab_entry.avb_keys, ":");
-        }
-        if (ValidatePublicKeyBlob(public_key_data, allowed_avb_keys)) {
-            public_key_match = true;
-        }
-    }
-
-    if (!public_key_match) {
+    } else if (!IsHashtreeDescriptorRootDigestMatching(fstab_entry, avb_handle->vbmeta_images_,
+                                                       avb_handle->slot_suffix_,
+                                                       avb_handle->other_slot_suffix_)) {
         avb_handle->status_ = AvbHandleStatus::kVerificationError;
-        LWARNING << "Found unknown public key used to sign " << fstab_entry.mount_point;
+        LWARNING << "Found unknown hashtree descriptor root digest used on "
+                 << fstab_entry.mount_point;
         if (!allow_verification_error) {
-            LERROR << "Unknown public key is not allowed";
+            LERROR << "Verification based on root digest failed. Vbmeta image is not allowed.";
             return nullptr;
         }
     }
diff --git a/fs_mgr/libfstab/fstab.cpp b/fs_mgr/libfstab/fstab.cpp
index 32460b1..6fa22fe 100644
--- a/fs_mgr/libfstab/fstab.cpp
+++ b/fs_mgr/libfstab/fstab.cpp
@@ -286,6 +286,10 @@
             }
         } else if (StartsWith(flag, "avb_keys=")) {  // must before the following "avb"
             entry->avb_keys = arg;
+        } else if (StartsWith(flag, "avb_hashtree_digest=")) {
+            // "avb_hashtree_digest" must before the following "avb"
+            // The path where hex-encoded hashtree descriptor root digest is located.
+            entry->avb_hashtree_digest = arg;
         } else if (StartsWith(flag, "avb")) {
             entry->fs_mgr_flags.avb = true;
             entry->vbmeta_partition = arg;
@@ -716,7 +720,7 @@
     if (!ReadFstabFromFileCommon(path, fstab)) {
         return false;
     }
-    if (path != kProcMountsPath) {
+    if (path != kProcMountsPath && !InRecovery()) {
         if (!access(android::gsi::kGsiBootedIndicatorFile, F_OK)) {
             std::string dsu_slot;
             if (!android::gsi::GetActiveDsu(&dsu_slot)) {
diff --git a/fs_mgr/libfstab/include/fstab/fstab.h b/fs_mgr/libfstab/include/fstab/fstab.h
index 09471f0..5e4019c 100644
--- a/fs_mgr/libfstab/include/fstab/fstab.h
+++ b/fs_mgr/libfstab/include/fstab/fstab.h
@@ -57,6 +57,7 @@
     uint64_t zram_backingdev_size = 0;
     std::string avb_keys;
     std::string lowerdir;
+    std::string avb_hashtree_digest;
 
     struct FsMgrFlags {
         bool wait : 1;
diff --git a/fs_mgr/liblp/builder.cpp b/fs_mgr/liblp/builder.cpp
index 6cb2c51..4e6e97b 100644
--- a/fs_mgr/liblp/builder.cpp
+++ b/fs_mgr/liblp/builder.cpp
@@ -1211,6 +1211,15 @@
     header_.flags |= LP_HEADER_FLAG_VIRTUAL_AB_DEVICE;
 }
 
+void MetadataBuilder::SetOverlaysActiveFlag(bool flag) {
+    RequireExpandedMetadataHeader();
+    if (flag) {
+        header_.flags |= LP_HEADER_FLAG_OVERLAYS_ACTIVE;
+    } else {
+        header_.flags &= ~LP_HEADER_FLAG_OVERLAYS_ACTIVE;
+    }
+}
+
 bool MetadataBuilder::IsABDevice() {
     return !IPropertyFetcher::GetInstance()->GetProperty("ro.boot.slot_suffix", "").empty();
 }
diff --git a/fs_mgr/liblp/include/liblp/builder.h b/fs_mgr/liblp/include/liblp/builder.h
index 54f31bc..957b96b 100644
--- a/fs_mgr/liblp/include/liblp/builder.h
+++ b/fs_mgr/liblp/include/liblp/builder.h
@@ -346,6 +346,8 @@
     void SetAutoSlotSuffixing();
     // Set the LP_HEADER_FLAG_VIRTUAL_AB_DEVICE flag.
     void SetVirtualABDeviceFlag();
+    // Set or unset the LP_HEADER_FLAG_OVERLAYS_ACTIVE flag.
+    void SetOverlaysActiveFlag(bool flag);
 
     bool GetBlockDeviceInfo(const std::string& partition_name, BlockDeviceInfo* info) const;
     bool UpdateBlockDeviceInfo(const std::string& partition_name, const BlockDeviceInfo& info);
diff --git a/fs_mgr/liblp/include/liblp/metadata_format.h b/fs_mgr/liblp/include/liblp/metadata_format.h
index 41d8b0c..8d77097 100644
--- a/fs_mgr/liblp/include/liblp/metadata_format.h
+++ b/fs_mgr/liblp/include/liblp/metadata_format.h
@@ -240,6 +240,9 @@
  */
 #define LP_HEADER_FLAG_VIRTUAL_AB_DEVICE 0x1
 
+/* This device has overlays activated via "adb remount". */
+#define LP_HEADER_FLAG_OVERLAYS_ACTIVE 0x2
+
 /* This struct defines a logical partition entry, similar to what would be
  * present in a GUID Partition Table.
  */
diff --git a/fs_mgr/liblp/super_layout_builder.cpp b/fs_mgr/liblp/super_layout_builder.cpp
index 5349e41..fd7416b 100644
--- a/fs_mgr/liblp/super_layout_builder.cpp
+++ b/fs_mgr/liblp/super_layout_builder.cpp
@@ -17,6 +17,8 @@
 
 #include <liblp/liblp.h>
 
+#include <algorithm>
+
 #include "images.h"
 #include "utility.h"
 #include "writer.h"
diff --git a/fs_mgr/liblp/utility.cpp b/fs_mgr/liblp/utility.cpp
index d8e171b..70c7b79 100644
--- a/fs_mgr/liblp/utility.cpp
+++ b/fs_mgr/liblp/utility.cpp
@@ -25,6 +25,7 @@
 #include <sys/ioctl.h>
 #endif
 
+#include <algorithm>
 #include <map>
 #include <string>
 #include <vector>
diff --git a/fs_mgr/libsnapshot/Android.bp b/fs_mgr/libsnapshot/Android.bp
index a8a7716..5ceaf28 100644
--- a/fs_mgr/libsnapshot/Android.bp
+++ b/fs_mgr/libsnapshot/Android.bp
@@ -108,7 +108,7 @@
     ],
     srcs: [":libsnapshot_sources"],
     static_libs: [
-        "libfs_mgr_binder"
+        "libfs_mgr_binder",
     ],
 }
 
@@ -128,12 +128,12 @@
     static_libs: [
         "libc++fs",
         "libsnapshot_cow",
-    ]
+    ],
 }
 
 cc_library_static {
     name: "libsnapshot_init",
-    native_coverage : true,
+    native_coverage: true,
     defaults: ["libsnapshot_defaults"],
     srcs: [":libsnapshot_sources"],
     ramdisk_available: true,
@@ -204,6 +204,10 @@
         "libsnapshot_cow/writer_v2.cpp",
         "libsnapshot_cow/writer_v3.cpp",
     ],
+
+    header_libs: [
+        "libstorage_literals_headers",
+    ],
     export_include_dirs: ["include"],
     host_supported: true,
     recovery_available: true,
@@ -243,7 +247,10 @@
 
 cc_defaults {
     name: "libsnapshot_test_defaults",
-    defaults: ["libsnapshot_defaults", "libsnapshot_cow_defaults"],
+    defaults: [
+        "libsnapshot_defaults",
+        "libsnapshot_cow_defaults",
+    ],
     srcs: [
         "partition_cow_creator_test.cpp",
         "snapshot_metadata_updater_test.cpp",
@@ -283,10 +290,13 @@
 
 cc_test {
     name: "vts_libsnapshot_test",
-    defaults: ["libsnapshot_test_defaults", "libsnapshot_hal_deps"],
+    defaults: [
+        "libsnapshot_test_defaults",
+        "libsnapshot_hal_deps",
+    ],
     test_suites: [
         "vts",
-        "device-tests"
+        "device-tests",
     ],
     test_options: {
         min_shipping_api_level: 30,
@@ -295,12 +305,15 @@
 
 cc_test {
     name: "vab_legacy_tests",
-    defaults: ["libsnapshot_test_defaults", "libsnapshot_hal_deps"],
+    defaults: [
+        "libsnapshot_test_defaults",
+        "libsnapshot_hal_deps",
+    ],
     cppflags: [
         "-DLIBSNAPSHOT_TEST_VAB_LEGACY",
     ],
     test_suites: [
-        "device-tests"
+        "device-tests",
     ],
     test_options: {
         // Legacy VAB launched in Android R.
@@ -310,12 +323,15 @@
 
 cc_test {
     name: "vabc_legacy_tests",
-    defaults: ["libsnapshot_test_defaults", "libsnapshot_hal_deps"],
+    defaults: [
+        "libsnapshot_test_defaults",
+        "libsnapshot_hal_deps",
+    ],
     cppflags: [
         "-DLIBSNAPSHOT_TEST_VABC_LEGACY",
     ],
     test_suites: [
-        "device-tests"
+        "device-tests",
     ],
     test_options: {
         // Legacy VABC launched in Android S.
@@ -343,7 +359,10 @@
 
 cc_binary {
     name: "snapshotctl",
-    defaults: ["libsnapshot_cow_defaults", "libsnapshot_hal_deps"],
+    defaults: [
+        "libsnapshot_cow_defaults",
+        "libsnapshot_hal_deps",
+    ],
     srcs: [
         "snapshotctl.cpp",
     ],
@@ -412,8 +431,11 @@
         "libgtest",
         "libsnapshot_cow",
     ],
+    header_libs: [
+        "libstorage_literals_headers",
+    ],
     test_suites: [
-        "device-tests"
+        "device-tests",
     ],
     test_options: {
         min_shipping_api_level: 30,
diff --git a/fs_mgr/libsnapshot/android/snapshot/snapshot.proto b/fs_mgr/libsnapshot/android/snapshot/snapshot.proto
index fa04c43..f2f7fc1 100644
--- a/fs_mgr/libsnapshot/android/snapshot/snapshot.proto
+++ b/fs_mgr/libsnapshot/android/snapshot/snapshot.proto
@@ -103,7 +103,7 @@
     // The old partition size (if none existed, this will be zero).
     uint64 old_partition_size = 10;
 
-    // Compression algorithm (none, gz, or brotli).
+    // Compression algorithm (none, gz, lz4, zstd, or brotli).
     string compression_algorithm = 11;
 
     // Estimated COW size from OTA manifest.
@@ -114,6 +114,12 @@
 
     // Enable batching for COW writes
     bool batched_writes = 14;
+
+    // Size of v3 operation buffer. Needs to be determined during writer initialization
+    uint64 estimated_ops_buffer_size = 15;
+
+    // Max bytes to be compressed at once (4k, 8k, 16k, 32k, 64k, 128k)
+    uint64 compression_factor = 16;
 }
 
 // Next: 8
@@ -250,4 +256,7 @@
 
     // Whether this update attempt used io_uring.
     bool iouring_used = 13;
+
+    // Size of v3 operation buffer. Needs to be determined during writer initialization
+    uint64 estimated_op_count_max = 14;
 }
diff --git a/fs_mgr/libsnapshot/include/libsnapshot/cow_compress.h b/fs_mgr/libsnapshot/include/libsnapshot/cow_compress.h
index 8191d61..ac04245 100644
--- a/fs_mgr/libsnapshot/include/libsnapshot/cow_compress.h
+++ b/fs_mgr/libsnapshot/include/libsnapshot/cow_compress.h
@@ -17,6 +17,7 @@
 #pragma once
 
 #include <memory>
+#include <vector>
 #include "libsnapshot/cow_format.h"
 
 namespace android {
@@ -40,8 +41,7 @@
 
     uint32_t GetCompressionLevel() const { return compression_level_; }
     uint32_t GetBlockSize() const { return block_size_; }
-    [[nodiscard]] virtual std::basic_string<uint8_t> Compress(const void* data,
-                                                              size_t length) const = 0;
+    [[nodiscard]] virtual std::vector<uint8_t> Compress(const void* data, size_t length) const = 0;
 
   private:
     uint32_t compression_level_;
diff --git a/fs_mgr/libsnapshot/include/libsnapshot/cow_format.h b/fs_mgr/libsnapshot/include/libsnapshot/cow_format.h
index 75467cb..6865b19 100644
--- a/fs_mgr/libsnapshot/include/libsnapshot/cow_format.h
+++ b/fs_mgr/libsnapshot/include/libsnapshot/cow_format.h
@@ -16,8 +16,10 @@
 
 #include <stdint.h>
 
+#include <limits>
 #include <optional>
 #include <string_view>
+#include <type_traits>
 
 namespace android {
 namespace snapshot {
@@ -32,7 +34,7 @@
 static constexpr uint32_t kCowVersionManifest = 2;
 
 static constexpr uint32_t kMinCowVersion = 1;
-static constexpr uint32_t kMaxCowVersion = 2;
+static constexpr uint32_t kMaxCowVersion = 3;
 
 // Normally, this should be kMaxCowVersion. When a new version is under testing
 // it may be the previous value of kMaxCowVersion.
@@ -99,30 +101,52 @@
     // monotonically increasing value used by update_engine
     uint64_t label;
     // Index of last CowOperation guaranteed to be resumable
-    uint32_t op_index;
+    uint64_t op_index;
 } __attribute__((packed));
 
 static constexpr uint8_t kNumResumePoints = 4;
 
 struct CowHeaderV3 : public CowHeader {
-    // Location of sequence buffer in COW.
-    uint64_t sequence_buffer_offset;
-    // number of currently written resume points
+    // Number of sequence data stored (each of which is a 32 bit integer)
+    uint64_t sequence_data_count;
+    // Number of currently written resume points &&
     uint32_t resume_point_count;
-    // Size, in bytes, of the CowResumePoint buffer.
+    // Number of max resume points that can be written
     uint32_t resume_point_max;
     // Number of CowOperationV3 structs in the operation buffer, currently and total
     // region size.
-    uint32_t op_count;
-    uint32_t op_count_max;
+    uint64_t op_count;
+    uint64_t op_count_max;
     // Compression Algorithm
     uint32_t compression_algorithm;
+    // Max compression size supported
+    uint32_t max_compression_size;
 } __attribute__((packed));
 
+enum class CowOperationType : uint8_t {
+    kCowCopyOp = 1,
+    kCowReplaceOp = 2,
+    kCowZeroOp = 3,
+    kCowLabelOp = 4,
+    kCowClusterOp = 5,
+    kCowXorOp = 6,
+    kCowSequenceOp = 7,
+    kCowFooterOp = std::numeric_limits<uint8_t>::max(),
+};
+
+static constexpr CowOperationType kCowCopyOp = CowOperationType::kCowCopyOp;
+static constexpr CowOperationType kCowReplaceOp = CowOperationType::kCowReplaceOp;
+static constexpr CowOperationType kCowZeroOp = CowOperationType::kCowZeroOp;
+static constexpr CowOperationType kCowLabelOp = CowOperationType::kCowLabelOp;
+static constexpr CowOperationType kCowClusterOp = CowOperationType::kCowClusterOp;
+static constexpr CowOperationType kCowXorOp = CowOperationType::kCowXorOp;
+static constexpr CowOperationType kCowSequenceOp = CowOperationType::kCowSequenceOp;
+static constexpr CowOperationType kCowFooterOp = CowOperationType::kCowFooterOp;
+
 // This structure is the same size of a normal Operation, but is repurposed for the footer.
 struct CowFooterOperation {
     // The operation code (always kCowFooterOp).
-    uint8_t type;
+    CowOperationType type;
 
     // If this operation reads from the data section of the COW, this contains
     // the compression type of that data (see constants below).
@@ -141,7 +165,7 @@
 // V2 version of COW. On disk format for older devices
 struct CowOperationV2 {
     // The operation code (see the constants and structures below).
-    uint8_t type;
+    CowOperationType type;
 
     // If this operation reads from the data section of the COW, this contains
     // the compression type of that data (see constants below).
@@ -173,18 +197,29 @@
     uint64_t source;
 } __attribute__((packed));
 
+static constexpr uint64_t kCowOpSourceInfoDataMask = (1ULL << 48) - 1;
+static constexpr uint64_t kCowOpSourceInfoTypeBit = 60;
+static constexpr uint64_t kCowOpSourceInfoTypeNumBits = 4;
+static constexpr uint64_t kCowOpSourceInfoTypeMask = (1ULL << kCowOpSourceInfoTypeNumBits) - 1;
+
+static constexpr uint64_t kCowOpSourceInfoCompressionBit = 57;
+static constexpr uint64_t kCowOpSourceInfoCompressionNumBits = 3;
+static constexpr uint64_t kCowOpSourceInfoCompressionMask =
+        ((1ULL << kCowOpSourceInfoCompressionNumBits) - 1);
+
 // The on disk format of cow (currently ==  CowOperation)
 struct CowOperationV3 {
-    // The operation code (see the constants and structures below).
-    uint8_t type;
-
     // If this operation reads from the data section of the COW, this contains
     // the length.
-    uint16_t data_length;
+    uint32_t data_length;
 
     // The block of data in the new image that this operation modifies.
     uint32_t new_block;
 
+    // source_info with have the following layout
+    // |--- 4 bits -- | --------- 3 bits ------ | --- 9 bits --- | --- 48 bits ---|
+    // |--- type ---  | -- compression factor --| --- unused --- | --- source --- |
+    //
     // The value of |source| depends on the operation code.
     //
     // CopyOp: a 32-bit block location in the source image.
@@ -196,20 +231,59 @@
     // For ops other than Label:
     //  Bits 47-62 are reserved and must be zero.
     // A block is compressed if it’s data is < block_sz
-    uint64_t source_info;
+    //
+    // Bits [57-59] represents the compression factor.
+    //
+    //       Compression - factor
+    // ==========================
+    // 000 -  4k
+    // 001 -  8k
+    // 010 -  16k
+    // ...
+    // 110 -  256k
+    //
+    uint64_t source_info_;
+    constexpr uint64_t source() const { return source_info_ & kCowOpSourceInfoDataMask; }
+    constexpr void set_source(uint64_t source) {
+        // Clear the first 48 bit first
+        source_info_ &= ~kCowOpSourceInfoDataMask;
+        // Set the actual source field
+        source_info_ |= source & kCowOpSourceInfoDataMask;
+    }
+    constexpr CowOperationType type() const {
+        // this is a mask to grab the first 4 bits of a 64 bit integer
+        const auto type = (source_info_ >> kCowOpSourceInfoTypeBit) & kCowOpSourceInfoTypeMask;
+        return static_cast<CowOperationType>(type);
+    }
+    constexpr void set_type(CowOperationType type) {
+        // Clear the top 4 bits first
+        source_info_ &= ((1ULL << kCowOpSourceInfoTypeBit) - 1);
+        // set the actual type bits
+        source_info_ |= (static_cast<uint64_t>(type) & kCowOpSourceInfoTypeMask)
+                        << kCowOpSourceInfoTypeBit;
+    }
+    constexpr void set_compression_bits(uint8_t compression_factor) {
+        // Clear the 3 bits from bit 57 - [57-59]
+        source_info_ &= ~(kCowOpSourceInfoCompressionMask << kCowOpSourceInfoCompressionBit);
+        // Set the actual compression factor
+        source_info_ |=
+                (static_cast<uint64_t>(compression_factor) & kCowOpSourceInfoCompressionMask)
+                << kCowOpSourceInfoCompressionBit;
+    }
+    constexpr uint8_t compression_bits() const {
+        // Grab the 3 bits from [57-59]
+        const auto compression_factor =
+                (source_info_ >> kCowOpSourceInfoCompressionBit) & kCowOpSourceInfoCompressionMask;
+        return static_cast<uint8_t>(compression_factor);
+    }
 } __attribute__((packed));
 
+// Ensure that getters/setters added to CowOperationV3 does not increases size
+// of CowOperationV3 struct(no virtual method tables added).
+static_assert(std::is_trivially_copyable_v<CowOperationV3>);
+static_assert(std::is_standard_layout_v<CowOperationV3>);
 static_assert(sizeof(CowOperationV2) == sizeof(CowFooterOperation));
 
-static constexpr uint8_t kCowCopyOp = 1;
-static constexpr uint8_t kCowReplaceOp = 2;
-static constexpr uint8_t kCowZeroOp = 3;
-static constexpr uint8_t kCowLabelOp = 4;
-static constexpr uint8_t kCowClusterOp = 5;
-static constexpr uint8_t kCowXorOp = 6;
-static constexpr uint8_t kCowSequenceOp = 7;
-static constexpr uint8_t kCowFooterOp = -1;
-
 enum CowCompressionAlgorithm : uint8_t {
     kCowCompressNone = 0,
     kCowCompressGz = 1,
@@ -226,25 +300,23 @@
 static constexpr uint8_t kCowReadAheadInProgress = 1;
 static constexpr uint8_t kCowReadAheadDone = 2;
 
-static constexpr uint64_t kCowOpSourceInfoDataMask = (1ULL << 48) - 1;
-
-static inline uint64_t GetCowOpSourceInfoData(const CowOperation& op) {
-    return op.source_info & kCowOpSourceInfoDataMask;
-}
-
-static constexpr off_t GetOpOffset(uint32_t op_index, const CowHeaderV3 header) {
-    return header.prefix.header_size + header.buffer_size +
-           (header.resume_point_max * sizeof(ResumePoint)) + (op_index * sizeof(CowOperationV3));
-}
-static constexpr off_t GetDataOffset(const CowHeaderV3 header) {
-    return header.prefix.header_size + header.buffer_size +
-           (header.resume_point_max * sizeof(ResumePoint)) +
-           header.op_count_max * sizeof(CowOperation);
-}
-static constexpr off_t GetResumeOffset(const CowHeaderV3 header) {
+static constexpr off_t GetSequenceOffset(const CowHeaderV3& header) {
     return header.prefix.header_size + header.buffer_size;
 }
 
+static constexpr off_t GetResumeOffset(const CowHeaderV3& header) {
+    return GetSequenceOffset(header) + (header.sequence_data_count * sizeof(uint32_t));
+}
+
+static constexpr off_t GetOpOffset(uint32_t op_index, const CowHeaderV3& header) {
+    return GetResumeOffset(header) + (header.resume_point_max * sizeof(ResumePoint)) +
+           (op_index * sizeof(CowOperationV3));
+}
+
+static constexpr off_t GetDataOffset(const CowHeaderV3& header) {
+    return GetOpOffset(header.op_count_max, header);
+}
+
 struct CowFooter {
     CowFooterOperation op;
     uint8_t unused[64];
@@ -268,10 +340,12 @@
 
 std::ostream& operator<<(std::ostream& os, CowOperationV2 const& arg);
 
-std::ostream& operator<<(std::ostream& os, CowOperation const& arg);
+std::ostream& operator<<(std::ostream& os, CowOperationV3 const& arg);
 
 std::ostream& operator<<(std::ostream& os, ResumePoint const& arg);
 
+std::ostream& operator<<(std::ostream& os, CowOperationType cow_type);
+
 int64_t GetNextOpOffset(const CowOperationV2& op, uint32_t cluster_size);
 int64_t GetNextDataOffset(const CowOperationV2& op, uint32_t cluster_size);
 
@@ -283,5 +357,11 @@
 // Convert compression name to internal value.
 std::optional<CowCompressionAlgorithm> CompressionAlgorithmFromString(std::string_view name);
 
+// Return block size used for compression
+size_t CowOpCompressionSize(const CowOperation* op, size_t block_size);
+
+// Return the relative offset of the I/O block which the CowOperation
+// multi-block compression
+bool GetBlockOffset(const CowOperation* op, uint64_t io_block, size_t block_size, off_t* offset);
 }  // namespace snapshot
 }  // namespace android
diff --git a/fs_mgr/libsnapshot/include/libsnapshot/cow_reader.h b/fs_mgr/libsnapshot/include/libsnapshot/cow_reader.h
index c87b32d..3f49c69 100644
--- a/fs_mgr/libsnapshot/include/libsnapshot/cow_reader.h
+++ b/fs_mgr/libsnapshot/include/libsnapshot/cow_reader.h
@@ -16,8 +16,6 @@
 
 #include <stdint.h>
 
-#include <deque>
-#include <functional>
 #include <memory>
 #include <optional>
 #include <unordered_map>
@@ -164,11 +162,20 @@
     // Creates a clone of the current CowReader without the file handlers
     std::unique_ptr<CowReader> CloneCowReader();
 
+    // Get the max compression size
+    uint32_t GetMaxCompressionSize();
+
     void UpdateMergeOpsCompleted(int num_merge_ops) { header_.num_merge_ops += num_merge_ops; }
 
   private:
     bool ParseV2(android::base::borrowed_fd fd, std::optional<uint64_t> label);
     bool PrepMergeOps();
+    // sequence data is stored as an operation with actual data residing in the data offset.
+    bool GetSequenceDataV2(std::vector<uint32_t>* merge_op_blocks, std::vector<int>* other_ops,
+                           std::unordered_map<uint32_t, int>* block_map);
+    // v3 of the cow writes sequence data within its own separate sequence buffer.
+    bool GetSequenceData(std::vector<uint32_t>* merge_op_blocks, std::vector<int>* other_ops,
+                         std::unordered_map<uint32_t, int>* block_map);
     uint64_t FindNumCopyops();
     uint8_t GetCompressionType();
 
diff --git a/fs_mgr/libsnapshot/include/libsnapshot/cow_writer.h b/fs_mgr/libsnapshot/include/libsnapshot/cow_writer.h
index 5b1e56c..651083f 100644
--- a/fs_mgr/libsnapshot/include/libsnapshot/cow_writer.h
+++ b/fs_mgr/libsnapshot/include/libsnapshot/cow_writer.h
@@ -33,7 +33,10 @@
 
 namespace android {
 namespace snapshot {
-
+struct CowSizeInfo {
+    uint64_t cow_size;
+    uint64_t op_count_max;
+};
 struct CowOptions {
     uint32_t block_size = 4096;
     std::string compression;
@@ -50,13 +53,16 @@
     uint64_t num_merge_ops = 0;
 
     // Number of threads for compression
-    int num_compress_threads = 0;
+    uint16_t num_compress_threads = 0;
 
     // Batch write cluster ops
     bool batch_write = false;
 
     // Size of the cow operation buffer; used in v3 only.
-    uint32_t op_count_max = 0;
+    uint64_t op_count_max = 0;
+
+    // Compression factor
+    uint64_t compression_factor = 4096;
 };
 
 // Interface for writing to a snapuserd COW. All operations are ordered; merges
@@ -92,8 +98,9 @@
     // to ensure that the correct headers and footers are written.
     virtual bool Finalize() = 0;
 
-    // Return number of bytes the cow image occupies on disk.
-    virtual uint64_t GetCowSize() = 0;
+    // Return number of bytes the cow image occupies on disk + the size of sequence && ops buffer
+    // The latter two fields are used in v3 cow format and left as 0 for v2 cow format
+    virtual CowSizeInfo GetCowSizeInfo() const = 0;
 
     virtual uint32_t GetBlockSize() const = 0;
     virtual std::optional<uint32_t> GetMaxBlocks() const = 0;
@@ -112,36 +119,38 @@
 
 class CompressWorker {
   public:
-    CompressWorker(std::unique_ptr<ICompressor>&& compressor, uint32_t block_size);
+    CompressWorker(std::unique_ptr<ICompressor>&& compressor);
     bool RunThread();
-    void EnqueueCompressBlocks(const void* buffer, size_t num_blocks);
-    bool GetCompressedBuffers(std::vector<std::basic_string<uint8_t>>* compressed_buf);
+    void EnqueueCompressBlocks(const void* buffer, size_t block_size, size_t num_blocks);
+    bool GetCompressedBuffers(std::vector<std::vector<uint8_t>>* compressed_buf);
     void Finalize();
     static uint32_t GetDefaultCompressionLevel(CowCompressionAlgorithm compression);
 
     static bool CompressBlocks(ICompressor* compressor, size_t block_size, const void* buffer,
                                size_t num_blocks,
-                               std::vector<std::basic_string<uint8_t>>* compressed_data);
+                               std::vector<std::vector<uint8_t>>* compressed_data);
 
   private:
     struct CompressWork {
         const void* buffer;
         size_t num_blocks;
+        size_t block_size;
         bool compression_status = false;
-        std::vector<std::basic_string<uint8_t>> compressed_data;
+        std::vector<std::vector<uint8_t>> compressed_data;
     };
 
     std::unique_ptr<ICompressor> compressor_;
-    uint32_t block_size_;
 
     std::queue<CompressWork> work_queue_;
     std::queue<CompressWork> compressed_queue_;
     std::mutex lock_;
     std::condition_variable cv_;
     bool stopped_ = false;
+    size_t total_submitted_ = 0;
+    size_t total_processed_ = 0;
 
-    bool CompressBlocks(const void* buffer, size_t num_blocks,
-                        std::vector<std::basic_string<uint8_t>>* compressed_data);
+    bool CompressBlocks(const void* buffer, size_t num_blocks, size_t block_size,
+                        std::vector<std::vector<uint8_t>>* compressed_data);
 };
 
 // Create an ICowWriter not backed by any file. This is useful for estimating
diff --git a/fs_mgr/libsnapshot/include/libsnapshot/mock_cow_writer.h b/fs_mgr/libsnapshot/include/libsnapshot/mock_cow_writer.h
index c58c654..8491fb0 100644
--- a/fs_mgr/libsnapshot/include/libsnapshot/mock_cow_writer.h
+++ b/fs_mgr/libsnapshot/include/libsnapshot/mock_cow_writer.h
@@ -24,8 +24,7 @@
     using FileDescriptor = chromeos_update_engine::FileDescriptor;
 
     MOCK_METHOD(bool, Finalize, (), (override));
-
-    MOCK_METHOD(uint64_t, GetCowSize, (), (override));
+    MOCK_METHOD(CowSizeInfo, GetCowSizeInfo, (), (const, override));
 
     MOCK_METHOD(bool, AddCopy, (uint64_t, uint64_t, uint64_t), (override));
     MOCK_METHOD(bool, AddRawBlocks, (uint64_t, const void*, size_t), (override));
diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h
index 08a79ba..d102863 100644
--- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h
+++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h
@@ -826,6 +826,9 @@
     bool DeleteDeviceIfExists(const std::string& name,
                               const std::chrono::milliseconds& timeout_ms = {});
 
+    // Set read-ahead size during OTA
+    void SetReadAheadSize(const std::string& entry_block_device, off64_t size_kb);
+
     android::dm::IDeviceMapper& dm_;
     std::unique_ptr<IDeviceInfo> device_;
     std::string metadata_dir_;
diff --git a/fs_mgr/libsnapshot/include_test/libsnapshot/test_helpers.h b/fs_mgr/libsnapshot/include_test/libsnapshot/test_helpers.h
index 5e9f049..90813fe 100644
--- a/fs_mgr/libsnapshot/include_test/libsnapshot/test_helpers.h
+++ b/fs_mgr/libsnapshot/include_test/libsnapshot/test_helpers.h
@@ -155,6 +155,9 @@
     virtual bool GetTableStatus(const std::string& name, std::vector<TargetInfo>* table) {
         return impl_.GetTableStatus(name, table);
     }
+    virtual bool GetTableStatusIma(const std::string& name, std::vector<TargetInfo>* table) {
+        return impl_.GetTableStatusIma(name, table);
+    }
     virtual bool GetDmDevicePathByName(const std::string& name, std::string* path) {
         return impl_.GetDmDevicePathByName(name, path);
     }
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp
index abc7d33..0205f50 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp
@@ -20,6 +20,7 @@
 #include <limits>
 #include <memory>
 #include <queue>
+#include <vector>
 
 #include <android-base/file.h>
 #include <android-base/logging.h>
@@ -103,9 +104,9 @@
     GzCompressor(uint32_t compression_level, const uint32_t block_size)
         : ICompressor(compression_level, block_size){};
 
-    std::basic_string<uint8_t> Compress(const void* data, size_t length) const override {
+    std::vector<uint8_t> Compress(const void* data, size_t length) const override {
         const auto bound = compressBound(length);
-        std::basic_string<uint8_t> buffer(bound, '\0');
+        std::vector<uint8_t> buffer(bound, '\0');
 
         uLongf dest_len = bound;
         auto rv = compress2(buffer.data(), &dest_len, reinterpret_cast<const Bytef*>(data), length,
@@ -124,13 +125,13 @@
     Lz4Compressor(uint32_t compression_level, const uint32_t block_size)
         : ICompressor(compression_level, block_size){};
 
-    std::basic_string<uint8_t> Compress(const void* data, size_t length) const override {
+    std::vector<uint8_t> Compress(const void* data, size_t length) const override {
         const auto bound = LZ4_compressBound(length);
         if (!bound) {
             LOG(ERROR) << "LZ4_compressBound returned 0";
             return {};
         }
-        std::basic_string<uint8_t> buffer(bound, '\0');
+        std::vector<uint8_t> buffer(bound, '\0');
 
         const auto compressed_size =
                 LZ4_compress_default(static_cast<const char*>(data),
@@ -156,13 +157,13 @@
     BrotliCompressor(uint32_t compression_level, const uint32_t block_size)
         : ICompressor(compression_level, block_size){};
 
-    std::basic_string<uint8_t> Compress(const void* data, size_t length) const override {
+    std::vector<uint8_t> Compress(const void* data, size_t length) const override {
         const auto bound = BrotliEncoderMaxCompressedSize(length);
         if (!bound) {
             LOG(ERROR) << "BrotliEncoderMaxCompressedSize returned 0";
             return {};
         }
-        std::basic_string<uint8_t> buffer(bound, '\0');
+        std::vector<uint8_t> buffer(bound, '\0');
 
         size_t encoded_size = bound;
         auto rv = BrotliEncoderCompress(
@@ -186,8 +187,8 @@
         ZSTD_CCtx_setParameter(zstd_context_.get(), ZSTD_c_windowLog, log2(GetBlockSize()));
     };
 
-    std::basic_string<uint8_t> Compress(const void* data, size_t length) const override {
-        std::basic_string<uint8_t> buffer(ZSTD_compressBound(length), '\0');
+    std::vector<uint8_t> Compress(const void* data, size_t length) const override {
+        std::vector<uint8_t> buffer(ZSTD_compressBound(length), '\0');
         const auto compressed_size =
                 ZSTD_compress2(zstd_context_.get(), buffer.data(), buffer.size(), data, length);
         if (compressed_size <= 0) {
@@ -208,14 +209,14 @@
     std::unique_ptr<ZSTD_CCtx, decltype(&ZSTD_freeCCtx)> zstd_context_;
 };
 
-bool CompressWorker::CompressBlocks(const void* buffer, size_t num_blocks,
-                                    std::vector<std::basic_string<uint8_t>>* compressed_data) {
-    return CompressBlocks(compressor_.get(), block_size_, buffer, num_blocks, compressed_data);
+bool CompressWorker::CompressBlocks(const void* buffer, size_t num_blocks, size_t block_size,
+                                    std::vector<std::vector<uint8_t>>* compressed_data) {
+    return CompressBlocks(compressor_.get(), block_size, buffer, num_blocks, compressed_data);
 }
 
 bool CompressWorker::CompressBlocks(ICompressor* compressor, size_t block_size, const void* buffer,
                                     size_t num_blocks,
-                                    std::vector<std::basic_string<uint8_t>>* compressed_data) {
+                                    std::vector<std::vector<uint8_t>>* compressed_data) {
     const uint8_t* iter = reinterpret_cast<const uint8_t*>(buffer);
     while (num_blocks) {
         auto data = compressor->Compress(iter, block_size);
@@ -223,7 +224,7 @@
             PLOG(ERROR) << "CompressBlocks: Compression failed";
             return false;
         }
-        if (data.size() > std::numeric_limits<uint16_t>::max()) {
+        if (data.size() > std::numeric_limits<uint32_t>::max()) {
             LOG(ERROR) << "Compressed block is too large: " << data.size();
             return false;
         }
@@ -254,7 +255,8 @@
         }
 
         // Compress blocks
-        bool ret = CompressBlocks(blocks.buffer, blocks.num_blocks, &blocks.compressed_data);
+        bool ret = CompressBlocks(blocks.buffer, blocks.num_blocks, blocks.block_size,
+                                  &blocks.compressed_data);
         blocks.compression_status = ret;
         {
             std::lock_guard<std::mutex> lock(lock_);
@@ -273,35 +275,31 @@
     return true;
 }
 
-void CompressWorker::EnqueueCompressBlocks(const void* buffer, size_t num_blocks) {
+void CompressWorker::EnqueueCompressBlocks(const void* buffer, size_t block_size,
+                                           size_t num_blocks) {
     {
         std::lock_guard<std::mutex> lock(lock_);
 
         CompressWork blocks = {};
         blocks.buffer = buffer;
+        blocks.block_size = block_size;
         blocks.num_blocks = num_blocks;
         work_queue_.push(std::move(blocks));
+        total_submitted_ += 1;
     }
     cv_.notify_all();
 }
 
-bool CompressWorker::GetCompressedBuffers(std::vector<std::basic_string<uint8_t>>* compressed_buf) {
-    {
+bool CompressWorker::GetCompressedBuffers(std::vector<std::vector<uint8_t>>* compressed_buf) {
+    while (true) {
         std::unique_lock<std::mutex> lock(lock_);
-        while (compressed_queue_.empty() && !stopped_) {
+        while ((total_submitted_ != total_processed_) && compressed_queue_.empty() && !stopped_) {
             cv_.wait(lock);
         }
-
-        if (stopped_) {
-            return true;
-        }
-    }
-
-    {
-        std::lock_guard<std::mutex> lock(lock_);
         while (compressed_queue_.size() > 0) {
             CompressWork blocks = std::move(compressed_queue_.front());
             compressed_queue_.pop();
+            total_processed_ += 1;
 
             if (blocks.compression_status) {
                 compressed_buf->insert(compressed_buf->end(),
@@ -312,9 +310,12 @@
                 return false;
             }
         }
+        if ((total_submitted_ == total_processed_) || stopped_) {
+            total_submitted_ = 0;
+            total_processed_ = 0;
+            return true;
+        }
     }
-
-    return true;
 }
 
 std::unique_ptr<ICompressor> ICompressor::Brotli(uint32_t compression_level,
@@ -344,8 +345,8 @@
     cv_.notify_all();
 }
 
-CompressWorker::CompressWorker(std::unique_ptr<ICompressor>&& compressor, uint32_t block_size)
-    : compressor_(std::move(compressor)), block_size_(block_size) {}
+CompressWorker::CompressWorker(std::unique_ptr<ICompressor>&& compressor)
+    : compressor_(std::move(compressor)) {}
 
 }  // namespace snapshot
 }  // namespace android
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/cow_format.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/cow_format.cpp
index 937065d..19014c0 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/cow_format.cpp
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/cow_format.cpp
@@ -14,7 +14,6 @@
 // limitations under the License.
 //
 
-#include <inttypes.h>
 #include <libsnapshot/cow_format.h>
 #include <sys/types.h>
 #include <unistd.h>
@@ -22,6 +21,7 @@
 #include <android-base/logging.h>
 #include <android-base/stringprintf.h>
 #include <libsnapshot/cow_format.h>
+#include <storage_literals/storage_literals.h>
 #include "writer_v2.h"
 #include "writer_v3.h"
 
@@ -29,8 +29,9 @@
 namespace snapshot {
 
 using android::base::unique_fd;
+using namespace android::storage_literals;
 
-std::ostream& EmitCowTypeString(std::ostream& os, uint8_t cow_type) {
+std::ostream& EmitCowTypeString(std::ostream& os, CowOperationType cow_type) {
     switch (cow_type) {
         case kCowCopyOp:
             return os << "kCowCopyOp";
@@ -53,6 +54,10 @@
     }
 }
 
+std::ostream& operator<<(std::ostream& os, CowOperationType cow_type) {
+    return EmitCowTypeString(os, cow_type);
+}
+
 std::ostream& operator<<(std::ostream& os, CowOperationV2 const& op) {
     os << "CowOperationV2(";
     EmitCowTypeString(os, op.type) << ", ";
@@ -80,22 +85,21 @@
     return os;
 }
 
-std::ostream& operator<<(std::ostream& os, CowOperation const& op) {
+std::ostream& operator<<(std::ostream& os, CowOperationV3 const& op) {
     os << "CowOperation(";
-    EmitCowTypeString(os, op.type);
-    if (op.type == kCowReplaceOp || op.type == kCowXorOp || op.type == kCowSequenceOp) {
+    EmitCowTypeString(os, op.type());
+    if (op.type() == kCowReplaceOp || op.type() == kCowXorOp || op.type() == kCowSequenceOp) {
         os << ", data_length:" << op.data_length;
     }
-    if (op.type != kCowClusterOp && op.type != kCowSequenceOp && op.type != kCowLabelOp) {
+    if (op.type() != kCowClusterOp && op.type() != kCowSequenceOp && op.type() != kCowLabelOp) {
         os << ", new_block:" << op.new_block;
     }
-    if (op.type == kCowXorOp || op.type == kCowReplaceOp || op.type == kCowCopyOp) {
-        os << ", source:" << (op.source_info & kCowOpSourceInfoDataMask);
-    } else if (op.type == kCowClusterOp) {
-        os << ", cluster_data:" << (op.source_info & kCowOpSourceInfoDataMask);
-    } else {
-        os << ", label:0x" << android::base::StringPrintf("%" PRIx64, op.source_info);
+    if (op.type() == kCowXorOp || op.type() == kCowReplaceOp || op.type() == kCowCopyOp) {
+        os << ", source:" << op.source();
+    } else if (op.type() == kCowClusterOp) {
+        os << ", cluster_data:" << op.source();
     }
+    // V3 op stores resume points in header, so CowOp can never be Label.
     os << ")";
     return os;
 }
@@ -126,7 +130,7 @@
 }
 
 bool IsMetadataOp(const CowOperation& op) {
-    switch (op.type) {
+    switch (op.type()) {
         case kCowLabelOp:
         case kCowClusterOp:
         case kCowFooterOp:
@@ -138,7 +142,7 @@
 }
 
 bool IsOrderedOp(const CowOperation& op) {
-    switch (op.type) {
+    switch (op.type()) {
         case kCowCopyOp:
         case kCowXorOp:
             return true;
@@ -172,5 +176,36 @@
     return CreateCowWriter(version, options, unique_fd{-1}, std::nullopt);
 }
 
+size_t CowOpCompressionSize(const CowOperation* op, size_t block_size) {
+    uint8_t compression_bits = op->compression_bits();
+    return (block_size << compression_bits);
+}
+
+bool GetBlockOffset(const CowOperation* op, uint64_t io_block, size_t block_size, off_t* offset) {
+    const uint64_t new_block = op->new_block;
+
+    if (op->type() != kCowReplaceOp || io_block < new_block) {
+        LOG(VERBOSE) << "Invalid IO request for block: " << io_block
+                     << " CowOperation: new_block: " << new_block;
+        return false;
+    }
+
+    // Get the actual compression size
+    const size_t compression_size = CowOpCompressionSize(op, block_size);
+    // Find the number of blocks spanned
+    const size_t num_blocks = compression_size / block_size;
+    // Find the distance of the I/O block which this
+    // CowOperation encompasses
+    const size_t block_distance = io_block - new_block;
+    // Check if this block is within this range;
+    // if so, return the relative offset
+    if (block_distance < num_blocks) {
+        *offset = block_distance * block_size;
+        return true;
+    }
+
+    return false;
+}
+
 }  // namespace snapshot
 }  // namespace android
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/cow_reader.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/cow_reader.cpp
index 8412879..6516499 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/cow_reader.cpp
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/cow_reader.cpp
@@ -24,7 +24,9 @@
 
 #include <android-base/file.h>
 #include <android-base/logging.h>
+#include <libsnapshot/cow_format.h>
 #include <libsnapshot/cow_reader.h>
+#include <storage_literals/storage_literals.h>
 #include <zlib.h>
 
 #include "cow_decompress.h"
@@ -34,6 +36,8 @@
 namespace android {
 namespace snapshot {
 
+using namespace android::storage_literals;
+
 bool ReadCowHeader(android::base::borrowed_fd fd, CowHeaderV3* header) {
     if (lseek(fd.get(), 0, SEEK_SET) < 0) {
         PLOG(ERROR) << "lseek header failed";
@@ -160,6 +164,21 @@
     return PrepMergeOps();
 }
 
+uint32_t CowReader::GetMaxCompressionSize() {
+    switch (header_.prefix.major_version) {
+        case 1:
+        case 2:
+            // Old versions supports only 4KB compression.
+            return header_.block_size;
+            ;
+        case 3:
+            return header_.max_compression_size;
+        default:
+            LOG(ERROR) << "Unknown version: " << header_.prefix.major_version;
+            return 0;
+    }
+}
+
 //
 // This sets up the data needed for MergeOpIter. MergeOpIter presents
 // data in the order we intend to merge in.
@@ -265,52 +284,31 @@
 //                        Replace-op-4, Zero-op-9, Replace-op-5 }
 //==============================================================
 bool CowReader::PrepMergeOps() {
-    auto merge_op_blocks = std::make_unique<std::vector<uint32_t>>();
     std::vector<int> other_ops;
-    auto seq_ops_set = std::unordered_set<uint32_t>();
-    auto block_map = std::make_unique<std::unordered_map<uint32_t, int>>();
-    size_t num_seqs = 0;
-    size_t read;
+    std::vector<uint32_t> merge_op_blocks;
+    std::unordered_map<uint32_t, int> block_map;
 
-    for (size_t i = 0; i < ops_->size(); i++) {
-        auto& current_op = ops_->data()[i];
-
-        if (current_op.type == kCowSequenceOp) {
-            size_t seq_len = current_op.data_length / sizeof(uint32_t);
-
-            merge_op_blocks->resize(merge_op_blocks->size() + seq_len);
-            if (!GetRawBytes(&current_op, &merge_op_blocks->data()[num_seqs],
-                             current_op.data_length, &read)) {
-                PLOG(ERROR) << "Failed to read sequence op!";
-                return false;
-            }
-            for (size_t j = num_seqs; j < num_seqs + seq_len; j++) {
-                seq_ops_set.insert(merge_op_blocks->data()[j]);
-            }
-            num_seqs += seq_len;
-        }
-
-        if (IsMetadataOp(current_op)) {
-            continue;
-        }
-
-        // Sequence ops must be the first ops in the stream.
-        if (seq_ops_set.empty() && IsOrderedOp(current_op)) {
-            merge_op_blocks->emplace_back(current_op.new_block);
-        } else if (seq_ops_set.count(current_op.new_block) == 0) {
-            other_ops.push_back(current_op.new_block);
-        }
-        block_map->insert({current_op.new_block, i});
+    switch (header_.prefix.major_version) {
+        case 1:
+        case 2:
+            GetSequenceDataV2(&merge_op_blocks, &other_ops, &block_map);
+            break;
+        case 3:
+            GetSequenceData(&merge_op_blocks, &other_ops, &block_map);
+            break;
+        default:
+            break;
     }
-    for (auto block : *merge_op_blocks) {
-        if (block_map->count(block) == 0) {
+
+    for (auto block : merge_op_blocks) {
+        if (block_map.count(block) == 0) {
             LOG(ERROR) << "Invalid Sequence Ops. Could not find Cow Op for new block " << block;
             return false;
         }
     }
 
-    if (merge_op_blocks->size() > header_.num_merge_ops) {
-        num_ordered_ops_to_merge_ = merge_op_blocks->size() - header_.num_merge_ops;
+    if (merge_op_blocks.size() > header_.num_merge_ops) {
+        num_ordered_ops_to_merge_ = merge_op_blocks.size() - header_.num_merge_ops;
     } else {
         num_ordered_ops_to_merge_ = 0;
     }
@@ -326,9 +324,9 @@
         std::sort(other_ops.begin(), other_ops.end(), std::greater<int>());
     }
 
-    merge_op_blocks->insert(merge_op_blocks->end(), other_ops.begin(), other_ops.end());
+    merge_op_blocks.insert(merge_op_blocks.end(), other_ops.begin(), other_ops.end());
 
-    num_total_data_ops_ = merge_op_blocks->size();
+    num_total_data_ops_ = merge_op_blocks.size();
     if (header_.num_merge_ops > 0) {
         merge_op_start_ = header_.num_merge_ops;
     }
@@ -338,24 +336,94 @@
         // the ops vector as required for merge operations.
         auto merge_ops_buffer = std::make_shared<std::vector<CowOperation>>();
         merge_ops_buffer->reserve(num_total_data_ops_);
-        for (auto block : *merge_op_blocks) {
-            merge_ops_buffer->emplace_back(ops_->data()[block_map->at(block)]);
+        for (auto block : merge_op_blocks) {
+            merge_ops_buffer->emplace_back(ops_->data()[block_map.at(block)]);
         }
         ops_->clear();
         ops_ = merge_ops_buffer;
         ops_->shrink_to_fit();
     } else {
-        for (auto block : *merge_op_blocks) {
-            block_pos_index_->push_back(block_map->at(block));
+        for (auto block : merge_op_blocks) {
+            block_pos_index_->push_back(block_map.at(block));
         }
     }
 
-    block_map->clear();
-    merge_op_blocks->clear();
+    block_map.clear();
+    merge_op_blocks.clear();
 
     return true;
 }
 
+bool CowReader::GetSequenceDataV2(std::vector<uint32_t>* merge_op_blocks,
+                                  std::vector<int>* other_ops,
+                                  std::unordered_map<uint32_t, int>* block_map) {
+    auto seq_ops_set = std::unordered_set<uint32_t>();
+    size_t num_seqs = 0;
+    size_t read;
+    for (size_t i = 0; i < ops_->size(); i++) {
+        auto& current_op = ops_->data()[i];
+
+        if (current_op.type() == kCowSequenceOp) {
+            size_t seq_len = current_op.data_length / sizeof(uint32_t);
+
+            merge_op_blocks->resize(merge_op_blocks->size() + seq_len);
+            if (!GetRawBytes(&current_op, &merge_op_blocks->data()[num_seqs],
+                             current_op.data_length, &read)) {
+                PLOG(ERROR) << "Failed to read sequence op!";
+                return false;
+            }
+            for (size_t j = num_seqs; j < num_seqs + seq_len; j++) {
+                seq_ops_set.insert(merge_op_blocks->at(j));
+            }
+            num_seqs += seq_len;
+        }
+
+        if (IsMetadataOp(current_op)) {
+            continue;
+        }
+
+        // Sequence ops must be the first ops in the stream.
+        if (seq_ops_set.empty() && IsOrderedOp(current_op)) {
+            merge_op_blocks->emplace_back(current_op.new_block);
+        } else if (seq_ops_set.count(current_op.new_block) == 0) {
+            other_ops->push_back(current_op.new_block);
+        }
+        block_map->insert({current_op.new_block, i});
+    }
+    return false;
+}
+
+bool CowReader::GetSequenceData(std::vector<uint32_t>* merge_op_blocks, std::vector<int>* other_ops,
+                                std::unordered_map<uint32_t, int>* block_map) {
+    std::unordered_set<uint32_t> seq_ops_set;
+    // read sequence ops data
+    merge_op_blocks->resize(header_.sequence_data_count);
+    if (!android::base::ReadFullyAtOffset(
+                fd_, merge_op_blocks->data(),
+                header_.sequence_data_count * sizeof(merge_op_blocks->at(0)),
+                GetSequenceOffset(header_))) {
+        PLOG(ERROR) << "failed to read sequence buffer. seq_data_count: "
+                    << header_.sequence_data_count << " at offset: " << GetSequenceOffset(header_);
+        return false;
+    }
+    seq_ops_set.reserve(merge_op_blocks->size());
+    for (auto& i : *merge_op_blocks) {
+        seq_ops_set.insert(i);
+    }
+    // read ordered op data
+    for (size_t i = 0; i < ops_->size(); i++) {
+        auto& current_op = ops_->data()[i];
+        // Sequence ops must be the first ops in the stream.
+        if (seq_ops_set.empty()) {
+            merge_op_blocks->emplace_back(current_op.new_block);
+        } else if (seq_ops_set.count(current_op.new_block) == 0) {
+            other_ops->push_back(current_op.new_block);
+        }
+        block_map->insert({current_op.new_block, i});
+    }
+    return true;
+}
+
 bool CowReader::VerifyMergeOps() {
     auto itr = GetMergeOpIter(true);
     std::unordered_map<uint64_t, const CowOperation*> overwritten_blocks;
@@ -587,11 +655,11 @@
 }
 
 bool CowReader::GetRawBytes(const CowOperation* op, void* buffer, size_t len, size_t* read) {
-    switch (op->type) {
+    switch (op->type()) {
         case kCowSequenceOp:
         case kCowReplaceOp:
         case kCowXorOp:
-            return GetRawBytes(GetCowOpSourceInfoData(*op), buffer, len, read);
+            return GetRawBytes(op->source(), buffer, len, read);
         default:
             LOG(ERROR) << "Cannot get raw bytes of non-data op: " << *op;
             return false;
@@ -655,6 +723,11 @@
 ssize_t CowReader::ReadData(const CowOperation* op, void* buffer, size_t buffer_size,
                             size_t ignore_bytes) {
     std::unique_ptr<IDecompressor> decompressor;
+    const size_t op_buf_size = CowOpCompressionSize(op, header_.block_size);
+    if (!op_buf_size) {
+        LOG(ERROR) << "Compression size is zero. op: " << *op;
+        return -1;
+    }
     switch (GetCompressionType()) {
         case kCowCompressNone:
             break;
@@ -665,12 +738,12 @@
             decompressor = IDecompressor::Brotli();
             break;
         case kCowCompressZstd:
-            if (header_.block_size != op->data_length) {
+            if (op_buf_size != op->data_length) {
                 decompressor = IDecompressor::Zstd();
             }
             break;
         case kCowCompressLz4:
-            if (header_.block_size != op->data_length) {
+            if (op_buf_size != op->data_length) {
                 decompressor = IDecompressor::Lz4();
             }
             break;
@@ -680,29 +753,29 @@
     }
 
     uint64_t offset;
-    if (op->type == kCowXorOp) {
+    if (op->type() == kCowXorOp) {
         offset = xor_data_loc_->at(op->new_block);
     } else {
-        offset = GetCowOpSourceInfoData(*op);
+        offset = op->source();
     }
     if (!decompressor ||
-        ((op->data_length == header_.block_size) && (header_.prefix.major_version == 3))) {
+        ((op->data_length == op_buf_size) && (header_.prefix.major_version == 3))) {
         CowDataStream stream(this, offset + ignore_bytes, op->data_length - ignore_bytes);
         return stream.ReadFully(buffer, buffer_size);
     }
 
     CowDataStream stream(this, offset, op->data_length);
     decompressor->set_stream(&stream);
-    return decompressor->Decompress(buffer, buffer_size, header_.block_size, ignore_bytes);
+    return decompressor->Decompress(buffer, buffer_size, op_buf_size, ignore_bytes);
 }
 
 bool CowReader::GetSourceOffset(const CowOperation* op, uint64_t* source_offset) {
-    switch (op->type) {
+    switch (op->type()) {
         case kCowCopyOp:
-            *source_offset = GetCowOpSourceInfoData(*op) * header_.block_size;
+            *source_offset = op->source() * header_.block_size;
             return true;
         case kCowXorOp:
-            *source_offset = GetCowOpSourceInfoData(*op);
+            *source_offset = op->source();
             return true;
         default:
             return false;
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/create_cow.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/create_cow.cpp
index efb1035..5497b72 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/create_cow.cpp
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/create_cow.cpp
@@ -71,6 +71,8 @@
 
     const int kNumThreads = 6;
     const size_t kBlockSizeToRead = 1_MiB;
+    const size_t compression_factor_ = 64_KiB;
+    size_t replace_ops_ = 0, copy_ops_ = 0, zero_ops_ = 0, in_place_ops_ = 0;
 
     std::unordered_map<std::string, int> source_block_hash_;
     std::mutex source_block_hash_lock_;
@@ -81,7 +83,12 @@
     std::unique_ptr<uint8_t[]> zblock_;
 
     std::string compression_ = "lz4";
-    unique_fd fd_;
+    unique_fd cow_fd_;
+    unique_fd target_fd_;
+
+    std::vector<uint64_t> zero_blocks_;
+    std::vector<uint64_t> replace_blocks_;
+    std::unordered_map<uint64_t, uint64_t> copy_blocks_;
 
     const int BLOCK_SZ = 4_KiB;
     void SHA256(const void* data, size_t length, uint8_t out[32]);
@@ -93,7 +100,14 @@
     bool FindSourceBlockHash();
     bool PrepareParse(std::string& parsing_file, const bool createSnapshot);
     bool ParsePartition();
-    bool WriteSnapshot(const void* buffer, uint64_t block, std::string& block_hash);
+    void PrepareMergeBlock(const void* buffer, uint64_t block, std::string& block_hash);
+    bool WriteV3Snapshots();
+    size_t PrepareWrite(size_t* pending_ops, size_t start_index);
+
+    bool CreateSnapshotWriter();
+    bool WriteOrderedSnapshots();
+    bool WriteNonOrderedSnapshots();
+    bool VerifyMergeOrder();
 };
 
 void CreateSnapshotLogger(android::base::LogId, android::base::LogSeverity severity, const char*,
@@ -118,21 +132,19 @@
     create_snapshot_patch_ = createSnapshot;
 
     if (createSnapshot) {
-        fd_.reset(open(patch_file_.c_str(), O_RDWR | O_CREAT | O_TRUNC, 0666));
-        if (fd_ < 0) {
+        cow_fd_.reset(open(patch_file_.c_str(), O_RDWR | O_CREAT | O_TRUNC, 0666));
+        if (cow_fd_ < 0) {
             PLOG(ERROR) << "Failed to open the snapshot-patch file: " << patch_file_;
             return false;
         }
 
+        target_fd_.reset((open(parsing_file_.c_str(), O_RDONLY)));
+        if (target_fd_ < 0) {
+            LOG(ERROR) << "open failed: " << parsing_file_;
+            return false;
+        }
         zblock_ = std::make_unique<uint8_t[]>(BLOCK_SZ);
         std::memset(zblock_.get(), 0, BLOCK_SZ);
-
-        CowOptions options;
-        options.compression = compression_;
-        options.num_compress_threads = 2;
-        options.batch_write = true;
-        options.cluster_ops = 600;
-        writer_ = CreateCowWriter(2, options, std::move(fd_));
     }
     return true;
 }
@@ -187,19 +199,158 @@
     return out;
 }
 
-bool CreateSnapshot::WriteSnapshot(const void* buffer, uint64_t block, std::string& block_hash) {
+void CreateSnapshot::PrepareMergeBlock(const void* buffer, uint64_t block,
+                                       std::string& block_hash) {
     if (std::memcmp(zblock_.get(), buffer, BLOCK_SZ) == 0) {
         std::lock_guard<std::mutex> lock(write_lock_);
-        return writer_->AddZeroBlocks(block, 1);
+        zero_blocks_.push_back(block);
+        return;
     }
 
     auto iter = source_block_hash_.find(block_hash);
     if (iter != source_block_hash_.end()) {
         std::lock_guard<std::mutex> lock(write_lock_);
-        return writer_->AddCopy(block, iter->second, 1);
+        // In-place copy is skipped
+        if (block != iter->second) {
+            copy_blocks_[block] = iter->second;
+        } else {
+            in_place_ops_ += 1;
+        }
+        return;
     }
     std::lock_guard<std::mutex> lock(write_lock_);
-    return writer_->AddRawBlocks(block, buffer, BLOCK_SZ);
+    replace_blocks_.push_back(block);
+}
+
+size_t CreateSnapshot::PrepareWrite(size_t* pending_ops, size_t start_index) {
+    size_t num_ops = *pending_ops;
+    uint64_t start_block = replace_blocks_[start_index];
+    size_t nr_consecutive = 1;
+    num_ops -= 1;
+    while (num_ops) {
+        uint64_t next_block = replace_blocks_[start_index + nr_consecutive];
+        if (next_block != start_block + nr_consecutive) {
+            break;
+        }
+        nr_consecutive += 1;
+        num_ops -= 1;
+    }
+    return nr_consecutive;
+}
+
+bool CreateSnapshot::CreateSnapshotWriter() {
+    uint64_t dev_sz = lseek(target_fd_.get(), 0, SEEK_END);
+    CowOptions options;
+    options.compression = compression_;
+    options.num_compress_threads = 2;
+    options.batch_write = true;
+    options.cluster_ops = 600;
+    options.compression_factor = compression_factor_;
+    options.max_blocks = {dev_sz / options.block_size};
+    writer_ = CreateCowWriter(3, options, std::move(cow_fd_));
+    return true;
+}
+
+bool CreateSnapshot::WriteNonOrderedSnapshots() {
+    zero_ops_ = zero_blocks_.size();
+    for (auto it = zero_blocks_.begin(); it != zero_blocks_.end(); it++) {
+        if (!writer_->AddZeroBlocks(*it, 1)) {
+            return false;
+        }
+    }
+    std::string buffer(compression_factor_, '\0');
+
+    replace_ops_ = replace_blocks_.size();
+    size_t blocks_to_compress = replace_blocks_.size();
+    size_t num_ops = 0;
+    size_t block_index = 0;
+    while (blocks_to_compress) {
+        num_ops = std::min((compression_factor_ / BLOCK_SZ), blocks_to_compress);
+        auto linear_blocks = PrepareWrite(&num_ops, block_index);
+        if (!android::base::ReadFullyAtOffset(target_fd_.get(), buffer.data(),
+                                              (linear_blocks * BLOCK_SZ),
+                                              replace_blocks_[block_index] * BLOCK_SZ)) {
+            LOG(ERROR) << "Failed to read at offset: " << replace_blocks_[block_index] * BLOCK_SZ
+                       << " size: " << linear_blocks * BLOCK_SZ;
+            return false;
+        }
+        if (!writer_->AddRawBlocks(replace_blocks_[block_index], buffer.data(),
+                                   linear_blocks * BLOCK_SZ)) {
+            LOG(ERROR) << "AddRawBlocks failed";
+            return false;
+        }
+
+        block_index += linear_blocks;
+        blocks_to_compress -= linear_blocks;
+    }
+    if (!writer_->Finalize()) {
+        return false;
+    }
+    return true;
+}
+
+bool CreateSnapshot::WriteOrderedSnapshots() {
+    std::unordered_map<uint64_t, uint64_t> overwritten_blocks;
+    std::vector<std::pair<uint64_t, uint64_t>> merge_sequence;
+    for (auto it = copy_blocks_.begin(); it != copy_blocks_.end(); it++) {
+        if (overwritten_blocks.count(it->second)) {
+            replace_blocks_.push_back(it->first);
+            continue;
+        }
+        overwritten_blocks[it->first] = it->second;
+        merge_sequence.emplace_back(std::make_pair(it->first, it->second));
+    }
+    // Sort the blocks so that if the blocks are contiguous, it would help
+    // compress multiple blocks in one shot based on the compression factor.
+    std::sort(replace_blocks_.begin(), replace_blocks_.end());
+
+    copy_ops_ = merge_sequence.size();
+    for (auto it = merge_sequence.begin(); it != merge_sequence.end(); it++) {
+        if (!writer_->AddCopy(it->first, it->second, 1)) {
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool CreateSnapshot::VerifyMergeOrder() {
+    unique_fd read_fd;
+    read_fd.reset(open(patch_file_.c_str(), O_RDONLY));
+    if (read_fd < 0) {
+        PLOG(ERROR) << "Failed to open the snapshot-patch file: " << patch_file_;
+        return false;
+    }
+    CowReader reader;
+    if (!reader.Parse(read_fd)) {
+        LOG(ERROR) << "Parse failed";
+        return false;
+    }
+
+    if (!reader.VerifyMergeOps()) {
+        LOG(ERROR) << "MergeOps Order is wrong";
+        return false;
+    }
+    return true;
+}
+
+bool CreateSnapshot::WriteV3Snapshots() {
+    if (!CreateSnapshotWriter()) {
+        return false;
+    }
+    if (!WriteOrderedSnapshots()) {
+        return false;
+    }
+    if (!WriteNonOrderedSnapshots()) {
+        return false;
+    }
+    if (!VerifyMergeOrder()) {
+        return false;
+    }
+
+    LOG(INFO) << "In-place: " << in_place_ops_ << " Zero: " << zero_ops_
+              << " Replace: " << replace_ops_ << " copy: " << copy_ops_;
+    return true;
 }
 
 bool CreateSnapshot::ReadBlocks(off_t offset, const int skip_blocks, const uint64_t dev_sz) {
@@ -241,10 +392,7 @@
             std::string hash = ToHexString(checksum, sizeof(checksum));
 
             if (create_snapshot_patch_) {
-                if (!WriteSnapshot(bufptr, blkindex, hash)) {
-                    LOG(ERROR) << "WriteSnapshot failed for block: " << blkindex;
-                    return false;
-                }
+                PrepareMergeBlock(bufptr, blkindex, hash);
             } else {
                 std::lock_guard<std::mutex> lock(source_block_hash_lock_);
                 {
@@ -306,8 +454,8 @@
         ret = t.get() && ret;
     }
 
-    if (ret && create_snapshot_patch_ && !writer_->Finalize()) {
-        LOG(ERROR) << "Finzalize failed";
+    if (ret && create_snapshot_patch_ && !WriteV3Snapshots()) {
+        LOG(ERROR) << "Snapshot Write failed";
         return false;
     }
 
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/inspect_cow.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/inspect_cow.cpp
index 993630b..3718851 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/inspect_cow.cpp
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/inspect_cow.cpp
@@ -199,7 +199,7 @@
 
         if (!FLAGS_silent && FLAGS_show_ops) std::cout << *op << "\n";
 
-        if ((FLAGS_decompress || extract_to >= 0) && op->type == kCowReplaceOp) {
+        if ((FLAGS_decompress || extract_to >= 0) && op->type() == kCowReplaceOp) {
             if (reader.ReadData(op, buffer.data(), buffer.size()) < 0) {
                 std::cerr << "Failed to decompress for :" << *op << "\n";
                 success = false;
@@ -213,12 +213,12 @@
                     return false;
                 }
             }
-        } else if (extract_to >= 0 && !IsMetadataOp(*op) && op->type != kCowZeroOp) {
+        } else if (extract_to >= 0 && !IsMetadataOp(*op) && op->type() != kCowZeroOp) {
             PLOG(ERROR) << "Cannot extract op yet: " << *op;
             return false;
         }
 
-        if (op->type == kCowSequenceOp && FLAGS_show_merge_sequence) {
+        if (op->type() == kCowSequenceOp && FLAGS_show_merge_sequence) {
             size_t read;
             std::vector<uint32_t> merge_op_blocks;
             size_t seq_len = op->data_length / sizeof(uint32_t);
@@ -236,13 +236,13 @@
             }
         }
 
-        if (op->type == kCowCopyOp) {
+        if (op->type() == kCowCopyOp) {
             copy_ops++;
-        } else if (op->type == kCowReplaceOp) {
+        } else if (op->type() == kCowReplaceOp) {
             replace_ops++;
-        } else if (op->type == kCowZeroOp) {
+        } else if (op->type() == kCowZeroOp) {
             zero_ops++;
-        } else if (op->type == kCowXorOp) {
+        } else if (op->type() == kCowXorOp) {
             xor_ops++;
         }
 
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/parser_v2.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/parser_v2.cpp
index 08a43a4..a35b614 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/parser_v2.cpp
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/parser_v2.cpp
@@ -205,7 +205,9 @@
         const auto& v2_op = v2_ops_->at(i);
 
         auto& new_op = out->ops->at(i);
-        new_op.type = v2_op.type;
+        new_op.set_type(v2_op.type);
+        // v2 ops always have 4k compression
+        new_op.set_compression_bits(0);
         new_op.data_length = v2_op.data_length;
 
         if (v2_op.new_block > std::numeric_limits<uint32_t>::max()) {
@@ -215,7 +217,7 @@
         new_op.new_block = v2_op.new_block;
 
         uint64_t source_info = v2_op.source;
-        if (new_op.type != kCowLabelOp) {
+        if (new_op.type() != kCowLabelOp) {
             source_info &= kCowOpSourceInfoDataMask;
             if (source_info != v2_op.source) {
                 LOG(ERROR) << "Out-of-range source value in COW op: " << v2_op;
@@ -232,7 +234,7 @@
                 return false;
             }
         }
-        new_op.source_info = source_info;
+        new_op.set_source(source_info);
     }
 
     out->header = header_;
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/parser_v3.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/parser_v3.cpp
index 52c6348..036d335 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/parser_v3.cpp
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/parser_v3.cpp
@@ -79,7 +79,7 @@
 
     return android::base::ReadFullyAtOffset(fd, resume_points_->data(),
                                             header_.resume_point_count * sizeof(ResumePoint),
-                                            header_.prefix.header_size + header_.buffer_size);
+                                            GetResumeOffset(header_));
 }
 
 std::optional<uint32_t> CowParserV3::FindResumeOp(const uint64_t label) {
@@ -112,8 +112,14 @@
     xor_data_loc_ = std::make_shared<std::unordered_map<uint64_t, uint64_t>>();
 
     for (auto op : *ops_) {
-        if (op.type == kCowXorOp) {
+        if (op.type() == kCowXorOp) {
             xor_data_loc_->insert({op.new_block, data_pos});
+        } else if (op.type() == kCowReplaceOp) {
+            if (data_pos != op.source()) {
+                LOG(ERROR) << "Invalid data location for operation " << op
+                           << ", expected: " << data_pos;
+                return false;
+            }
         }
         data_pos += op.data_length;
     }
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/snapshot_reader.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/snapshot_reader.cpp
index a3e40d9..12073fc 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/snapshot_reader.cpp
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/snapshot_reader.cpp
@@ -42,10 +42,21 @@
             op_iter_->Next();
             continue;
         }
-        if (op->new_block >= ops_.size()) {
-            ops_.resize(op->new_block + 1, nullptr);
+
+        size_t num_blocks = 1;
+        if (op->type() == kCowReplaceOp) {
+            num_blocks = (CowOpCompressionSize(op, block_size_) / block_size_);
         }
-        ops_[op->new_block] = op;
+        if (op->new_block >= ops_.size()) {
+            ops_.resize(op->new_block + num_blocks, nullptr);
+        }
+
+        size_t vec_index = op->new_block;
+        while (num_blocks) {
+            ops_[vec_index] = op;
+            num_blocks -= 1;
+            vec_index += 1;
+        }
         op_iter_->Next();
     }
 }
@@ -147,7 +158,7 @@
         op = ops_[chunk];
     }
 
-    if (!op || op->type == kCowCopyOp) {
+    if (!op || op->type() == kCowCopyOp) {
         borrowed_fd fd = GetSourceFd();
         if (fd < 0) {
             // GetSourceFd sets errno.
@@ -169,15 +180,24 @@
             // ReadFullyAtOffset sets errno.
             return -1;
         }
-    } else if (op->type == kCowZeroOp) {
+    } else if (op->type() == kCowZeroOp) {
         memset(buffer, 0, bytes_to_read);
-    } else if (op->type == kCowReplaceOp) {
-        if (cow_->ReadData(op, buffer, bytes_to_read, start_offset) < bytes_to_read) {
-            LOG(ERROR) << "CompressedSnapshotReader failed to read replace op";
+    } else if (op->type() == kCowReplaceOp) {
+        size_t buffer_size = CowOpCompressionSize(op, block_size_);
+        uint8_t temp_buffer[buffer_size];
+        if (cow_->ReadData(op, temp_buffer, buffer_size, 0) < buffer_size) {
+            LOG(ERROR) << "CompressedSnapshotReader failed to read replace op: buffer_size: "
+                       << buffer_size << "start_offset: " << start_offset;
             errno = EIO;
             return -1;
         }
-    } else if (op->type == kCowXorOp) {
+        off_t block_offset{};
+        if (!GetBlockOffset(op, chunk, block_size_, &block_offset)) {
+            LOG(ERROR) << "GetBlockOffset failed";
+            return -1;
+        }
+        std::memcpy(buffer, (char*)temp_buffer + block_offset + start_offset, bytes_to_read);
+    } else if (op->type() == kCowXorOp) {
         borrowed_fd fd = GetSourceFd();
         if (fd < 0) {
             // GetSourceFd sets errno.
@@ -208,7 +228,7 @@
             ((char*)buffer)[i] ^= data[i];
         }
     } else {
-        LOG(ERROR) << "CompressedSnapshotReader unknown op type: " << uint32_t(op->type);
+        LOG(ERROR) << "CompressedSnapshotReader unknown op type: " << uint32_t(op->type());
         errno = EINVAL;
         return -1;
     }
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/test_v2.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/test_v2.cpp
index 2709059..ce80cd7 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/test_v2.cpp
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/test_v2.cpp
@@ -18,6 +18,7 @@
 #include <iostream>
 #include <memory>
 #include <string_view>
+#include <vector>
 
 #include <android-base/file.h>
 #include <android-base/logging.h>
@@ -85,10 +86,10 @@
     size_t i = 0;
     while (!iter->AtEnd()) {
         auto op = iter->Get();
-        ASSERT_EQ(op->type, kCowCopyOp);
+        ASSERT_EQ(op->type(), kCowCopyOp);
         ASSERT_EQ(op->data_length, 0);
         ASSERT_EQ(op->new_block, 10 + i);
-        ASSERT_EQ(GetCowOpSourceInfoData(*op), 1000 + i);
+        ASSERT_EQ(op->source(), 1000 + i);
         iter->Next();
         i += 1;
     }
@@ -131,10 +132,10 @@
     ASSERT_FALSE(iter->AtEnd());
     auto op = iter->Get();
 
-    ASSERT_EQ(op->type, kCowCopyOp);
+    ASSERT_EQ(op->type(), kCowCopyOp);
     ASSERT_EQ(op->data_length, 0);
     ASSERT_EQ(op->new_block, 10);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 20);
+    ASSERT_EQ(op->source(), 20);
 
     std::string sink(data.size(), '\0');
 
@@ -142,7 +143,7 @@
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
 
-    ASSERT_EQ(op->type, kCowReplaceOp);
+    ASSERT_EQ(op->type(), kCowReplaceOp);
     ASSERT_EQ(op->data_length, 4096);
     ASSERT_EQ(op->new_block, 50);
     ASSERT_TRUE(ReadData(reader, op, sink.data(), sink.size()));
@@ -153,19 +154,19 @@
     op = iter->Get();
 
     // Note: the zero operation gets split into two blocks.
-    ASSERT_EQ(op->type, kCowZeroOp);
+    ASSERT_EQ(op->type(), kCowZeroOp);
     ASSERT_EQ(op->data_length, 0);
     ASSERT_EQ(op->new_block, 51);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 0);
+    ASSERT_EQ(op->source(), 0);
 
     iter->Next();
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
 
-    ASSERT_EQ(op->type, kCowZeroOp);
+    ASSERT_EQ(op->type(), kCowZeroOp);
     ASSERT_EQ(op->data_length, 0);
     ASSERT_EQ(op->new_block, 52);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 0);
+    ASSERT_EQ(op->source(), 0);
 
     iter->Next();
     ASSERT_TRUE(iter->AtEnd());
@@ -206,10 +207,10 @@
     ASSERT_FALSE(iter->AtEnd());
     auto op = iter->Get();
 
-    ASSERT_EQ(op->type, kCowCopyOp);
+    ASSERT_EQ(op->type(), kCowCopyOp);
     ASSERT_EQ(op->data_length, 0);
     ASSERT_EQ(op->new_block, 10);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 20);
+    ASSERT_EQ(op->source(), 20);
 
     std::string sink(data.size(), '\0');
 
@@ -217,10 +218,10 @@
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
 
-    ASSERT_EQ(op->type, kCowXorOp);
+    ASSERT_EQ(op->type(), kCowXorOp);
     ASSERT_EQ(op->data_length, 4096);
     ASSERT_EQ(op->new_block, 50);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 98314);  // 4096 * 24 + 10
+    ASSERT_EQ(op->source(), 98314);  // 4096 * 24 + 10
     ASSERT_TRUE(ReadData(reader, op, sink.data(), sink.size()));
     ASSERT_EQ(sink, data);
 
@@ -229,19 +230,19 @@
     op = iter->Get();
 
     // Note: the zero operation gets split into two blocks.
-    ASSERT_EQ(op->type, kCowZeroOp);
+    ASSERT_EQ(op->type(), kCowZeroOp);
     ASSERT_EQ(op->data_length, 0);
     ASSERT_EQ(op->new_block, 51);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 0);
+    ASSERT_EQ(op->source(), 0);
 
     iter->Next();
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
 
-    ASSERT_EQ(op->type, kCowZeroOp);
+    ASSERT_EQ(op->type(), kCowZeroOp);
     ASSERT_EQ(op->data_length, 0);
     ASSERT_EQ(op->new_block, 52);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 0);
+    ASSERT_EQ(op->source(), 0);
 
     iter->Next();
     ASSERT_TRUE(iter->AtEnd());
@@ -273,7 +274,7 @@
 
     std::string sink(data.size(), '\0');
 
-    ASSERT_EQ(op->type, kCowReplaceOp);
+    ASSERT_EQ(op->type(), kCowReplaceOp);
     ASSERT_EQ(op->data_length, 56);  // compressed!
     ASSERT_EQ(op->new_block, 50);
     ASSERT_TRUE(ReadData(reader, op, sink.data(), sink.size()));
@@ -325,16 +326,16 @@
     while (!iter->AtEnd()) {
         auto op = iter->Get();
 
-        if (op->type == kCowXorOp) {
+        if (op->type() == kCowXorOp) {
             total_blocks += 1;
             std::string sink(xor_data.size(), '\0');
             ASSERT_EQ(op->new_block, 50);
-            ASSERT_EQ(GetCowOpSourceInfoData(*op), 98314);  // 4096 * 24 + 10
+            ASSERT_EQ(op->source(), 98314);  // 4096 * 24 + 10
             ASSERT_TRUE(ReadData(reader, op, sink.data(), sink.size()));
             ASSERT_EQ(sink, xor_data);
         }
 
-        if (op->type == kCowReplaceOp) {
+        if (op->type() == kCowReplaceOp) {
             total_blocks += 1;
             if (op->new_block == 100) {
                 data.resize(options.block_size);
@@ -399,7 +400,7 @@
     while (!iter->AtEnd()) {
         auto op = iter->Get();
 
-        if (op->type == kCowReplaceOp) {
+        if (op->type() == kCowReplaceOp) {
             total_blocks += 1;
             if (op->new_block == 50) {
                 data.resize(options.block_size);
@@ -429,7 +430,7 @@
 template <typename T>
 class HorribleStream : public IByteStream {
   public:
-    HorribleStream(const std::basic_string<T>& input) : input_(input) {}
+    HorribleStream(const std::vector<T>& input) : input_(input) {}
 
     ssize_t Read(void* buffer, size_t length) override {
         if (pos_ >= input_.size()) {
@@ -444,16 +445,17 @@
     size_t Size() const override { return input_.size(); }
 
   private:
-    std::basic_string<T> input_;
+    std::vector<T> input_;
     size_t pos_ = 0;
 };
 
 TEST(HorribleStream, ReadFully) {
-    std::string expected = "this is some data";
+    std::string expected_str = "this is some data";
+    std::vector<char> expected{expected_str.begin(), expected_str.end()};
 
     HorribleStream<char> stream(expected);
 
-    std::string buffer(expected.size(), '\0');
+    std::vector<char> buffer(expected.size(), '\0');
     ASSERT_TRUE(stream.ReadFully(buffer.data(), buffer.size()));
     ASSERT_EQ(buffer, expected);
 }
@@ -519,7 +521,7 @@
 
     std::string sink(data.size(), '\0');
 
-    ASSERT_EQ(op->type, kCowReplaceOp);
+    ASSERT_EQ(op->type(), kCowReplaceOp);
     ASSERT_EQ(op->data_length, 56);  // compressed!
     ASSERT_EQ(op->new_block, 50);
     ASSERT_TRUE(ReadData(reader, op, sink.data(), sink.size()));
@@ -529,7 +531,7 @@
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
 
-    ASSERT_EQ(op->type, kCowClusterOp);
+    ASSERT_EQ(op->type(), kCowClusterOp);
 
     iter->Next();
     ASSERT_FALSE(iter->AtEnd());
@@ -546,7 +548,7 @@
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
 
-    ASSERT_EQ(op->type, kCowClusterOp);
+    ASSERT_EQ(op->type(), kCowClusterOp);
 
     iter->Next();
     ASSERT_TRUE(iter->AtEnd());
@@ -580,7 +582,7 @@
     std::string sink(options.block_size, '\0');
 
     auto op = iter->Get();
-    ASSERT_EQ(op->type, kCowReplaceOp);
+    ASSERT_EQ(op->type(), kCowReplaceOp);
     ASSERT_EQ(op->new_block, 51);
     ASSERT_TRUE(ReadData(reader, op, sink.data(), sink.size()));
 }
@@ -601,14 +603,14 @@
     ASSERT_TRUE(writer.AddCopy(10, 20));
     ASSERT_TRUE(writer.AddRawBlocks(50, data.data(), data.size()));
     ASSERT_TRUE(writer.AddZeroBlocks(51, 2));
-    auto size_before = writer.GetCowSize();
+    auto size_before = writer.GetCowSizeInfo().cow_size;
     ASSERT_TRUE(writer.Finalize());
-    auto size_after = writer.GetCowSize();
+    auto size_after = writer.GetCowSizeInfo().cow_size;
     ASSERT_EQ(size_before, size_after);
     struct stat buf;
 
     ASSERT_GE(fstat(cow_->fd, &buf), 0) << strerror(errno);
-    ASSERT_EQ(buf.st_size, writer.GetCowSize());
+    ASSERT_EQ(buf.st_size, writer.GetCowSizeInfo().cow_size);
 }
 
 TEST_F(CowTest, AppendLabelSmall) {
@@ -637,7 +639,7 @@
 
     struct stat buf;
     ASSERT_EQ(fstat(cow_->fd, &buf), 0);
-    ASSERT_EQ(buf.st_size, writer->GetCowSize());
+    ASSERT_EQ(buf.st_size, writer->GetCowSizeInfo().cow_size);
 
     // Read back both operations, and label.
     CowReader reader;
@@ -653,7 +655,7 @@
 
     ASSERT_FALSE(iter->AtEnd());
     auto op = iter->Get();
-    ASSERT_EQ(op->type, kCowReplaceOp);
+    ASSERT_EQ(op->type(), kCowReplaceOp);
     ASSERT_TRUE(ReadData(reader, op, sink.data(), sink.size()));
     ASSERT_EQ(sink, data);
 
@@ -663,14 +665,14 @@
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowLabelOp);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 3);
+    ASSERT_EQ(op->type(), kCowLabelOp);
+    ASSERT_EQ(op->source(), 3);
 
     iter->Next();
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowReplaceOp);
+    ASSERT_EQ(op->type(), kCowReplaceOp);
     ASSERT_TRUE(ReadData(reader, op, sink.data(), sink.size()));
     ASSERT_EQ(sink, data2);
 
@@ -690,7 +692,7 @@
     ASSERT_TRUE(writer->AddRawBlocks(50, data.data(), data.size()));
     ASSERT_TRUE(writer->AddLabel(1));
     // Drop the tail end of the last op header, corrupting it.
-    ftruncate(cow_->fd, writer->GetCowSize() - sizeof(CowFooter) - 3);
+    ftruncate(cow_->fd, writer->GetCowSizeInfo().cow_size - sizeof(CowFooter) - 3);
 
     ASSERT_EQ(lseek(cow_->fd, 0, SEEK_SET), 0);
 
@@ -705,7 +707,7 @@
 
     struct stat buf;
     ASSERT_EQ(fstat(cow_->fd, &buf), 0);
-    ASSERT_EQ(buf.st_size, writer->GetCowSize());
+    ASSERT_EQ(buf.st_size, writer->GetCowSizeInfo().cow_size);
 
     // Read back both operations.
     CowReader reader;
@@ -716,14 +718,14 @@
 
     ASSERT_FALSE(iter->AtEnd());
     auto op = iter->Get();
-    ASSERT_EQ(op->type, kCowLabelOp);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 0);
+    ASSERT_EQ(op->type(), kCowLabelOp);
+    ASSERT_EQ(op->source(), 0);
 
     iter->Next();
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowZeroOp);
+    ASSERT_EQ(op->type(), kCowZeroOp);
 
     iter->Next();
 
@@ -763,7 +765,7 @@
 
     struct stat buf;
     ASSERT_EQ(fstat(cow_->fd, &buf), 0);
-    ASSERT_EQ(buf.st_size, writer->GetCowSize());
+    ASSERT_EQ(buf.st_size, writer->GetCowSizeInfo().cow_size);
 
     // Read back all valid operations
     CowReader reader;
@@ -774,8 +776,8 @@
 
     ASSERT_FALSE(iter->AtEnd());
     auto op = iter->Get();
-    ASSERT_EQ(op->type, kCowLabelOp);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 5);
+    ASSERT_EQ(op->type(), kCowLabelOp);
+    ASSERT_EQ(op->source(), 5);
 
     iter->Next();
     ASSERT_TRUE(iter->AtEnd());
@@ -812,7 +814,7 @@
 
     struct stat buf;
     ASSERT_EQ(fstat(cow_->fd, &buf), 0);
-    ASSERT_EQ(buf.st_size, writer->GetCowSize());
+    ASSERT_EQ(buf.st_size, writer->GetCowSizeInfo().cow_size);
 
     // Read back all ops
     CowReader reader;
@@ -825,7 +827,7 @@
 
     ASSERT_FALSE(iter->AtEnd());
     auto op = iter->Get();
-    ASSERT_EQ(op->type, kCowReplaceOp);
+    ASSERT_EQ(op->type(), kCowReplaceOp);
     ASSERT_TRUE(ReadData(reader, op, sink.data(), sink.size()));
     ASSERT_EQ(sink, data.substr(0, options.block_size));
 
@@ -835,7 +837,7 @@
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowReplaceOp);
+    ASSERT_EQ(op->type(), kCowReplaceOp);
     ASSERT_TRUE(ReadData(reader, op, sink.data(), sink.size()));
     ASSERT_EQ(sink, data.substr(options.block_size, 2 * options.block_size));
 
@@ -843,26 +845,26 @@
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowLabelOp);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 4);
+    ASSERT_EQ(op->type(), kCowLabelOp);
+    ASSERT_EQ(op->source(), 4);
 
     iter->Next();
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowZeroOp);
+    ASSERT_EQ(op->type(), kCowZeroOp);
 
     iter->Next();
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowZeroOp);
+    ASSERT_EQ(op->type(), kCowZeroOp);
 
     iter->Next();
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowLabelOp);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 5);
+    ASSERT_EQ(op->type(), kCowLabelOp);
+    ASSERT_EQ(op->source(), 5);
 
     iter->Next();
 
@@ -906,7 +908,7 @@
 
     ASSERT_FALSE(iter->AtEnd());
     auto op = iter->Get();
-    ASSERT_EQ(op->type, kCowReplaceOp);
+    ASSERT_EQ(op->type(), kCowReplaceOp);
     ASSERT_TRUE(ReadData(reader, op, sink.data(), sink.size()));
     ASSERT_EQ(sink, data.substr(0, options.block_size));
 
@@ -914,52 +916,52 @@
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowLabelOp);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 4);
+    ASSERT_EQ(op->type(), kCowLabelOp);
+    ASSERT_EQ(op->source(), 4);
 
     iter->Next();
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowZeroOp);
+    ASSERT_EQ(op->type(), kCowZeroOp);
 
     iter->Next();
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowClusterOp);
+    ASSERT_EQ(op->type(), kCowClusterOp);
 
     iter->Next();
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowZeroOp);
+    ASSERT_EQ(op->type(), kCowZeroOp);
 
     iter->Next();
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowLabelOp);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 5);
+    ASSERT_EQ(op->type(), kCowLabelOp);
+    ASSERT_EQ(op->source(), 5);
 
     iter->Next();
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowCopyOp);
+    ASSERT_EQ(op->type(), kCowCopyOp);
 
     iter->Next();
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowClusterOp);
+    ASSERT_EQ(op->type(), kCowClusterOp);
 
     iter->Next();
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowLabelOp);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 6);
+    ASSERT_EQ(op->type(), kCowLabelOp);
+    ASSERT_EQ(op->source(), 6);
 
     iter->Next();
 
@@ -989,7 +991,7 @@
 
     struct stat buf;
     ASSERT_EQ(fstat(cow_->fd, &buf), 0);
-    ASSERT_EQ(buf.st_size, writer->GetCowSize());
+    ASSERT_EQ(buf.st_size, writer->GetCowSizeInfo().cow_size);
 
     // Read back both operations, plus cluster op at end
     CowReader reader;
@@ -1005,14 +1007,14 @@
 
     ASSERT_FALSE(iter->AtEnd());
     auto op = iter->Get();
-    ASSERT_EQ(op->type, kCowLabelOp);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 50);
+    ASSERT_EQ(op->type(), kCowLabelOp);
+    ASSERT_EQ(op->source(), 50);
 
     iter->Next();
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowReplaceOp);
+    ASSERT_EQ(op->type(), kCowReplaceOp);
     ASSERT_TRUE(ReadData(reader, op, sink.data(), sink.size()));
     ASSERT_EQ(sink, data2);
 
@@ -1020,7 +1022,7 @@
 
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
-    ASSERT_EQ(op->type, kCowClusterOp);
+    ASSERT_EQ(op->type(), kCowClusterOp);
 
     iter->Next();
 
@@ -1117,12 +1119,12 @@
         num_in_cluster++;
         max_in_cluster = std::max(max_in_cluster, num_in_cluster);
 
-        if (op->type == kCowReplaceOp) {
+        if (op->type() == kCowReplaceOp) {
             num_replace++;
 
             ASSERT_EQ(op->new_block, num_replace);
             ASSERT_TRUE(CompareDataBlock(&reader, op, "Block " + std::to_string(num_replace)));
-        } else if (op->type == kCowClusterOp) {
+        } else if (op->type() == kCowClusterOp) {
             num_in_cluster = 0;
             num_clusters++;
         }
@@ -1178,12 +1180,12 @@
         num_in_cluster++;
         max_in_cluster = std::max(max_in_cluster, num_in_cluster);
 
-        if (op->type == kCowReplaceOp) {
+        if (op->type() == kCowReplaceOp) {
             num_replace++;
 
             ASSERT_EQ(op->new_block, num_replace);
             ASSERT_TRUE(CompareDataBlock(&reader, op, "Block " + std::to_string(num_replace)));
-        } else if (op->type == kCowClusterOp) {
+        } else if (op->type() == kCowClusterOp) {
             num_in_cluster = 0;
             num_clusters++;
         }
@@ -1229,12 +1231,12 @@
 
         num_in_cluster++;
         max_in_cluster = std::max(max_in_cluster, num_in_cluster);
-        if (op->type == kCowReplaceOp) {
+        if (op->type() == kCowReplaceOp) {
             num_replace++;
 
             ASSERT_EQ(op->new_block, num_replace);
             ASSERT_TRUE(CompareDataBlock(&reader, op, "Block " + std::to_string(num_replace)));
-        } else if (op->type == kCowClusterOp) {
+        } else if (op->type() == kCowClusterOp) {
             num_in_cluster = 0;
             num_clusters++;
         }
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/test_v3.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/test_v3.cpp
index c41e07c..2021348 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/test_v3.cpp
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/test_v3.cpp
@@ -1,10 +1,3 @@
-// Copyright (C) 2023 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,
@@ -15,17 +8,17 @@
 #include <sys/stat.h>
 
 #include <cstdio>
-#include <iostream>
+#include <limits>
 #include <memory>
-#include <string_view>
 
 #include <android-base/file.h>
 #include <android-base/logging.h>
+#include <android-base/unique_fd.h>
 #include <gtest/gtest.h>
+#include <libsnapshot/cow_format.h>
 #include <libsnapshot/cow_reader.h>
 #include <libsnapshot/cow_writer.h>
-#include "cow_decompress.h"
-#include "libsnapshot/cow_format.h"
+#include <storage_literals/storage_literals.h>
 #include "writer_v2.h"
 #include "writer_v3.h"
 
@@ -37,6 +30,9 @@
 namespace android {
 namespace snapshot {
 
+using namespace android::storage_literals;
+using ::testing::TestWithParam;
+
 class CowTestV3 : public ::testing::Test {
   protected:
     virtual void SetUp() override {
@@ -80,6 +76,7 @@
 
 TEST_F(CowTestV3, Header) {
     CowOptions options;
+    options.op_count_max = 15;
     auto writer = CreateCowWriter(3, options, GetCowFd());
     ASSERT_TRUE(writer->Finalize());
 
@@ -99,7 +96,7 @@
     options.op_count_max = 20;
     auto writer = CreateCowWriter(3, options, GetCowFd());
     ASSERT_FALSE(writer->AddZeroBlocks(1, 21));
-    ASSERT_FALSE(writer->AddZeroBlocks(1, 1));
+    ASSERT_TRUE(writer->AddZeroBlocks(1, 20));
     std::string data = "This is some data, believe it";
     data.resize(options.block_size, '\0');
 
@@ -112,6 +109,40 @@
     ASSERT_EQ(reader.header_v3().op_count, 20);
 }
 
+TEST_F(CowTestV3, MaxOpSingleThreadCompression) {
+    CowOptions options;
+    options.op_count_max = 20;
+    options.num_compress_threads = 1;
+    options.compression_factor = 4096 * 8;
+    options.compression = "lz4";
+
+    auto writer = CreateCowWriter(3, options, GetCowFd());
+    ASSERT_TRUE(writer->AddZeroBlocks(1, 20));
+    std::string data = "This is some data, believe it";
+    data.resize(options.block_size, '\0');
+
+    ASSERT_FALSE(writer->AddRawBlocks(5, data.data(), data.size()));
+
+    ASSERT_TRUE(writer->Finalize());
+}
+
+TEST_F(CowTestV3, MaxOpMultiThreadCompression) {
+    CowOptions options;
+    options.op_count_max = 20;
+    options.num_compress_threads = 2;
+    options.compression_factor = 4096 * 8;
+    options.compression = "lz4";
+
+    auto writer = CreateCowWriter(3, options, GetCowFd());
+    ASSERT_TRUE(writer->AddZeroBlocks(1, 20));
+    std::string data = "This is some data, believe it";
+    data.resize(options.block_size, '\0');
+
+    ASSERT_FALSE(writer->AddRawBlocks(5, data.data(), data.size()));
+
+    ASSERT_TRUE(writer->Finalize());
+}
+
 TEST_F(CowTestV3, ZeroOp) {
     CowOptions options;
     options.op_count_max = 20;
@@ -128,19 +159,19 @@
     ASSERT_FALSE(iter->AtEnd());
 
     auto op = iter->Get();
-    ASSERT_EQ(op->type, kCowZeroOp);
+    ASSERT_EQ(op->type(), kCowZeroOp);
     ASSERT_EQ(op->data_length, 0);
     ASSERT_EQ(op->new_block, 1);
-    ASSERT_EQ(op->source_info, 0);
+    ASSERT_EQ(op->source(), 0);
 
     iter->Next();
     ASSERT_FALSE(iter->AtEnd());
     op = iter->Get();
 
-    ASSERT_EQ(op->type, kCowZeroOp);
+    ASSERT_EQ(op->type(), kCowZeroOp);
     ASSERT_EQ(op->data_length, 0);
     ASSERT_EQ(op->new_block, 2);
-    ASSERT_EQ(op->source_info, 0);
+    ASSERT_EQ(op->source(), 0);
 }
 
 TEST_F(CowTestV3, ReplaceOp) {
@@ -171,7 +202,7 @@
     auto op = iter->Get();
     std::string sink(data.size(), '\0');
 
-    ASSERT_EQ(op->type, kCowReplaceOp);
+    ASSERT_EQ(op->type(), kCowReplaceOp);
     ASSERT_EQ(op->data_length, 4096);
     ASSERT_EQ(op->new_block, 5);
     ASSERT_TRUE(ReadData(reader, op, sink.data(), sink.size()));
@@ -186,7 +217,7 @@
     std::string data;
     data.resize(options.block_size * 5);
     for (int i = 0; i < data.size(); i++) {
-        data[i] = char(rand() % 256);
+        data[i] = static_cast<char>('A' + i / options.block_size);
     }
 
     ASSERT_TRUE(writer->AddRawBlocks(5, data.data(), data.size()));
@@ -207,19 +238,20 @@
     ASSERT_FALSE(iter->AtEnd());
 
     size_t i = 0;
-    std::string sink(data.size(), '\0');
 
     while (!iter->AtEnd()) {
         auto op = iter->Get();
-        ASSERT_EQ(op->type, kCowReplaceOp);
+        std::string sink(options.block_size, '\0');
+        ASSERT_EQ(op->type(), kCowReplaceOp);
         ASSERT_EQ(op->data_length, options.block_size);
         ASSERT_EQ(op->new_block, 5 + i);
-        ASSERT_TRUE(
-                ReadData(reader, op, sink.data() + (i * options.block_size), options.block_size));
+        ASSERT_TRUE(ReadData(reader, op, sink.data(), options.block_size));
+        ASSERT_EQ(std::string_view(sink),
+                  std::string_view(data).substr(i * options.block_size, options.block_size))
+                << " readback data for " << i << "th block does not match";
         iter->Next();
         i++;
     }
-    ASSERT_EQ(sink, data);
 
     ASSERT_EQ(i, 5);
 }
@@ -249,10 +281,10 @@
     size_t i = 0;
     while (!iter->AtEnd()) {
         auto op = iter->Get();
-        ASSERT_EQ(op->type, kCowCopyOp);
+        ASSERT_EQ(op->type(), kCowCopyOp);
         ASSERT_EQ(op->data_length, 0);
         ASSERT_EQ(op->new_block, 10 + i);
-        ASSERT_EQ(GetCowOpSourceInfoData(*op), 1000 + i);
+        ASSERT_EQ(op->source(), 1000 + i);
         iter->Next();
         i += 1;
     }
@@ -285,10 +317,10 @@
     auto op = iter->Get();
     std::string sink(data.size(), '\0');
 
-    ASSERT_EQ(op->type, kCowXorOp);
+    ASSERT_EQ(op->type(), kCowXorOp);
     ASSERT_EQ(op->data_length, 4096);
     ASSERT_EQ(op->new_block, 50);
-    ASSERT_EQ(GetCowOpSourceInfoData(*op), 98314);  // 4096 * 24 + 10
+    ASSERT_EQ(op->source(), 98314);  // 4096 * 24 + 10
     ASSERT_TRUE(ReadData(reader, op, sink.data(), sink.size()));
     ASSERT_EQ(sink, data);
 }
@@ -325,10 +357,10 @@
 
     while (!iter->AtEnd()) {
         auto op = iter->Get();
-        ASSERT_EQ(op->type, kCowXorOp);
+        ASSERT_EQ(op->type(), kCowXorOp);
         ASSERT_EQ(op->data_length, 4096);
         ASSERT_EQ(op->new_block, 50 + i);
-        ASSERT_EQ(GetCowOpSourceInfoData(*op), 98314 + (i * options.block_size));  // 4096 * 24 + 10
+        ASSERT_EQ(op->source(), 98314 + (i * options.block_size));  // 4096 * 24 + 10
         ASSERT_TRUE(
                 ReadData(reader, op, sink.data() + (i * options.block_size), options.block_size));
         iter->Next();
@@ -374,49 +406,40 @@
     ASSERT_NE(iter, nullptr);
     ASSERT_FALSE(iter->AtEnd());
 
-    size_t i = 0;
-
-    while (i < 5) {
+    for (size_t i = 0; i < 5; i++) {
         auto op = iter->Get();
-        ASSERT_EQ(op->type, kCowZeroOp);
+        ASSERT_EQ(op->type(), kCowZeroOp);
         ASSERT_EQ(op->new_block, 10 + i);
         iter->Next();
-        i++;
     }
-    i = 0;
-    while (i < 5) {
+    for (size_t i = 0; i < 5; i++) {
         auto op = iter->Get();
-        ASSERT_EQ(op->type, kCowCopyOp);
+        ASSERT_EQ(op->type(), kCowCopyOp);
         ASSERT_EQ(op->new_block, 15 + i);
-        ASSERT_EQ(GetCowOpSourceInfoData(*op), 3 + i);
+        ASSERT_EQ(op->source(), 3 + i);
         iter->Next();
-        i++;
     }
-    i = 0;
     std::string sink(data.size(), '\0');
 
-    while (i < 5) {
+    for (size_t i = 0; i < 5; i++) {
         auto op = iter->Get();
-        ASSERT_EQ(op->type, kCowReplaceOp);
+        ASSERT_EQ(op->type(), kCowReplaceOp);
         ASSERT_EQ(op->new_block, 18 + i);
-        ASSERT_TRUE(
-                ReadData(reader, op, sink.data() + (i * options.block_size), options.block_size));
+        ASSERT_EQ(reader.ReadData(op, sink.data() + (i * options.block_size), options.block_size),
+                  options.block_size);
         iter->Next();
-        i++;
     }
     ASSERT_EQ(sink, data);
 
-    i = 0;
     std::fill(sink.begin(), sink.end(), '\0');
-    while (i < 5) {
+    for (size_t i = 0; i < 5; i++) {
         auto op = iter->Get();
-        ASSERT_EQ(op->type, kCowXorOp);
+        ASSERT_EQ(op->type(), kCowXorOp);
         ASSERT_EQ(op->new_block, 50 + i);
-        ASSERT_EQ(GetCowOpSourceInfoData(*op), 98314 + (i * options.block_size));  // 4096 * 24 + 10
+        ASSERT_EQ(op->source(), 98314 + (i * options.block_size));  // 4096 * 24 + 10
         ASSERT_TRUE(
                 ReadData(reader, op, sink.data() + (i * options.block_size), options.block_size));
         iter->Next();
-        i++;
     }
     ASSERT_EQ(sink, data);
 }
@@ -448,7 +471,7 @@
 
     std::string sink(data.size(), '\0');
 
-    ASSERT_EQ(op->type, kCowReplaceOp);
+    ASSERT_EQ(op->type(), kCowReplaceOp);
     ASSERT_EQ(op->data_length, 56);  // compressed!
     ASSERT_EQ(op->new_block, 50);
     ASSERT_TRUE(ReadData(reader, op, sink.data(), sink.size()));
@@ -482,5 +505,421 @@
     header = reader.header_v3();
     ASSERT_EQ(header.op_count, 15);
 }
+
+TEST_F(CowTestV3, BufferMetadataSyncTest) {
+    CowOptions options;
+    options.op_count_max = 100;
+    auto writer = CreateCowWriter(3, options, GetCowFd());
+    /*
+    Header metadafields
+    sequence_data_count = 0;
+    resume_point_count = 0;
+    resume_point_max = 4;
+    */
+    ASSERT_TRUE(writer->Finalize());
+
+    CowReader reader;
+    ASSERT_TRUE(reader.Parse(cow_->fd));
+
+    auto header = reader.header_v3();
+    ASSERT_EQ(header.sequence_data_count, static_cast<uint64_t>(0));
+    ASSERT_EQ(header.resume_point_count, 0);
+    ASSERT_EQ(header.resume_point_max, 4);
+
+    writer->AddLabel(0);
+    ASSERT_TRUE(reader.Parse(cow_->fd));
+    header = reader.header_v3();
+    ASSERT_EQ(header.sequence_data_count, static_cast<uint64_t>(0));
+    ASSERT_EQ(header.resume_point_count, 1);
+    ASSERT_EQ(header.resume_point_max, 4);
+
+    ASSERT_TRUE(reader.Parse(cow_->fd));
+    header = reader.header_v3();
+
+    /*
+    Header metadafields
+    sequence_data_count = 1;
+    resume_point_count = 0;
+    resume_point_max = 4;
+    */
+}
+
+TEST_F(CowTestV3, SequenceTest) {
+    CowOptions options;
+    constexpr int seq_len = std::numeric_limits<uint16_t>::max() / sizeof(uint32_t) + 1;
+    options.op_count_max = seq_len;
+    auto writer = CreateCowWriter(3, options, GetCowFd());
+    // sequence data. This just an arbitrary set of integers that specify the merge order. The
+    // actual calculation is done by update_engine and passed to writer. All we care about here is
+    // writing that data correctly
+    uint32_t sequence[seq_len];
+    for (int i = 0; i < seq_len; i++) {
+        sequence[i] = i + 1;
+    }
+
+    ASSERT_TRUE(writer->AddSequenceData(seq_len, sequence));
+    ASSERT_TRUE(writer->AddZeroBlocks(1, seq_len - 1));
+    std::vector<uint8_t> data(writer->GetBlockSize());
+    for (size_t i = 0; i < data.size(); i++) {
+        data[i] = static_cast<uint8_t>(i & 0xFF);
+    }
+    ASSERT_TRUE(writer->AddRawBlocks(seq_len, data.data(), data.size()));
+    ASSERT_TRUE(writer->Finalize());
+
+    ASSERT_EQ(lseek(cow_->fd, 0, SEEK_SET), 0);
+
+    CowReader reader;
+    ASSERT_TRUE(reader.Parse(cow_->fd));
+    auto iter = reader.GetRevMergeOpIter();
+
+    for (int i = 0; i < seq_len; i++) {
+        ASSERT_TRUE(!iter->AtEnd());
+        const auto& op = iter->Get();
+
+        ASSERT_EQ(op->new_block, seq_len - i);
+        if (op->new_block == seq_len) {
+            std::vector<uint8_t> read_back(writer->GetBlockSize());
+            ASSERT_EQ(reader.ReadData(op, read_back.data(), read_back.size()),
+                      static_cast<ssize_t>(read_back.size()));
+            ASSERT_EQ(read_back, data);
+        }
+
+        iter->Next();
+    }
+    ASSERT_TRUE(iter->AtEnd());
+}
+
+TEST_F(CowTestV3, MissingSeqOp) {
+    CowOptions options;
+    options.op_count_max = std::numeric_limits<uint32_t>::max();
+    auto writer = CreateCowWriter(3, options, GetCowFd());
+    const int seq_len = 10;
+    uint32_t sequence[seq_len];
+    for (int i = 0; i < seq_len; i++) {
+        sequence[i] = i + 1;
+    }
+    ASSERT_TRUE(writer->AddSequenceData(seq_len, sequence));
+    ASSERT_TRUE(writer->AddZeroBlocks(1, seq_len - 1));
+    ASSERT_TRUE(writer->Finalize());
+
+    ASSERT_EQ(lseek(cow_->fd, 0, SEEK_SET), 0);
+
+    CowReader reader;
+    ASSERT_FALSE(reader.Parse(cow_->fd));
+}
+
+TEST_F(CowTestV3, ResumeSeqOp) {
+    CowOptions options;
+    options.op_count_max = std::numeric_limits<uint32_t>::max();
+    auto writer = std::make_unique<CowWriterV3>(options, GetCowFd());
+    const int seq_len = 10;
+    uint32_t sequence[seq_len];
+    for (int i = 0; i < seq_len; i++) {
+        sequence[i] = i + 1;
+    }
+    ASSERT_TRUE(writer->Initialize());
+
+    ASSERT_TRUE(writer->AddSequenceData(seq_len, sequence));
+    ASSERT_TRUE(writer->AddZeroBlocks(1, seq_len / 2));
+    ASSERT_TRUE(writer->AddLabel(1));
+    ASSERT_TRUE(writer->AddZeroBlocks(1 + seq_len / 2, 1));
+
+    ASSERT_EQ(lseek(cow_->fd, 0, SEEK_SET), 0);
+    auto reader = std::make_unique<CowReader>();
+    ASSERT_TRUE(reader->Parse(cow_->fd, 1));
+    auto itr = reader->GetRevMergeOpIter();
+    ASSERT_TRUE(itr->AtEnd());
+
+    writer = std::make_unique<CowWriterV3>(options, GetCowFd());
+    ASSERT_TRUE(writer->Initialize({1}));
+    ASSERT_TRUE(writer->AddZeroBlocks(1 + seq_len / 2, seq_len / 2));
+    ASSERT_TRUE(writer->Finalize());
+
+    ASSERT_EQ(lseek(cow_->fd, 0, SEEK_SET), 0);
+
+    reader = std::make_unique<CowReader>();
+    ASSERT_TRUE(reader->Parse(cow_->fd));
+
+    auto iter = reader->GetRevMergeOpIter();
+
+    uint64_t expected_block = 10;
+    while (!iter->AtEnd() && expected_block > 0) {
+        ASSERT_FALSE(iter->AtEnd());
+        const auto& op = iter->Get();
+
+        ASSERT_EQ(op->new_block, expected_block);
+
+        iter->Next();
+        expected_block--;
+    }
+    ASSERT_EQ(expected_block, 0);
+    ASSERT_TRUE(iter->AtEnd());
+}
+
+TEST_F(CowTestV3, SetSourceManyTimes) {
+    CowOperationV3 op{};
+    op.set_source(1);
+    ASSERT_EQ(op.source(), 1);
+    op.set_source(2);
+    ASSERT_EQ(op.source(), 2);
+    op.set_source(4);
+    ASSERT_EQ(op.source(), 4);
+    op.set_source(8);
+    ASSERT_EQ(op.source(), 8);
+}
+
+TEST_F(CowTestV3, SetTypeManyTimes) {
+    CowOperationV3 op{};
+    op.set_type(kCowCopyOp);
+    ASSERT_EQ(op.type(), kCowCopyOp);
+    op.set_type(kCowReplaceOp);
+    ASSERT_EQ(op.type(), kCowReplaceOp);
+    op.set_type(kCowZeroOp);
+    ASSERT_EQ(op.type(), kCowZeroOp);
+    op.set_type(kCowXorOp);
+    ASSERT_EQ(op.type(), kCowXorOp);
+}
+
+TEST_F(CowTestV3, SetTypeSourceInverleave) {
+    CowOperationV3 op{};
+    op.set_type(kCowCopyOp);
+    ASSERT_EQ(op.type(), kCowCopyOp);
+    op.set_source(0x010203040506);
+    ASSERT_EQ(op.source(), 0x010203040506);
+    ASSERT_EQ(op.type(), kCowCopyOp);
+    op.set_type(kCowReplaceOp);
+    ASSERT_EQ(op.source(), 0x010203040506);
+    ASSERT_EQ(op.type(), kCowReplaceOp);
+}
+
+TEST_F(CowTestV3, CowSizeEstimate) {
+    CowOptions options{};
+    options.compression = "none";
+    auto estimator = android::snapshot::CreateCowEstimator(3, options);
+    ASSERT_TRUE(estimator->AddZeroBlocks(0, 1024 * 1024));
+    const auto cow_size = estimator->GetCowSizeInfo().cow_size;
+    options.op_count_max = 1024 * 1024;
+    options.max_blocks = 1024 * 1024;
+    CowWriterV3 writer(options, GetCowFd());
+    ASSERT_TRUE(writer.Initialize());
+    ASSERT_TRUE(writer.AddZeroBlocks(0, 1024 * 1024));
+
+    ASSERT_LE(writer.GetCowSizeInfo().cow_size, cow_size);
+}
+
+TEST_F(CowTestV3, CopyOpMany) {
+    CowOptions options;
+    options.op_count_max = 100;
+    CowWriterV3 writer(options, GetCowFd());
+    writer.Initialize();
+    ASSERT_TRUE(writer.AddCopy(100, 50, 50));
+    ASSERT_TRUE(writer.AddCopy(150, 100, 50));
+    ASSERT_TRUE(writer.Finalize());
+    CowReader reader;
+    ASSERT_TRUE(reader.Parse(GetCowFd()));
+    auto it = reader.GetOpIter();
+    for (size_t i = 0; i < 100; i++) {
+        ASSERT_FALSE(it->AtEnd()) << " op iterator ended at " << i;
+        const auto op = *it->Get();
+        ASSERT_EQ(op.type(), kCowCopyOp);
+        ASSERT_EQ(op.new_block, 100 + i);
+        it->Next();
+    }
+}
+
+TEST_F(CowTestV3, CheckOpCount) {
+    CowOptions options;
+    options.op_count_max = 20;
+    options.batch_write = true;
+    options.cluster_ops = 200;
+    auto writer = CreateCowWriter(3, options, GetCowFd());
+    ASSERT_TRUE(writer->AddZeroBlocks(0, 19));
+    ASSERT_FALSE(writer->AddZeroBlocks(0, 19));
+}
+
+struct TestParam {
+    std::string compression;
+    int block_size;
+    int num_threads;
+    size_t cluster_ops;
+};
+
+class VariableBlockTest : public ::testing::TestWithParam<TestParam> {
+  protected:
+    virtual void SetUp() override {
+        cow_ = std::make_unique<TemporaryFile>();
+        ASSERT_GE(cow_->fd, 0) << strerror(errno);
+    }
+
+    virtual void TearDown() override { cow_ = nullptr; }
+
+    unique_fd GetCowFd() { return unique_fd{dup(cow_->fd)}; }
+
+    std::unique_ptr<TemporaryFile> cow_;
+};
+
+// Helper to check read sizes.
+static inline void ReadBlockData(CowReader& reader, const CowOperation* op, void* buffer,
+                                 size_t size) {
+    size_t block_size = CowOpCompressionSize(op, 4096);
+    std::string data(block_size, '\0');
+    size_t value = reader.ReadData(op, data.data(), block_size);
+    ASSERT_TRUE(value == block_size);
+    std::memcpy(buffer, data.data(), size);
+}
+
+TEST_P(VariableBlockTest, VariableBlockCompressionTest) {
+    const TestParam params = GetParam();
+
+    CowOptions options;
+    options.op_count_max = 100000;
+    options.compression = params.compression;
+    options.num_compress_threads = params.num_threads;
+    options.batch_write = true;
+    options.compression_factor = params.block_size;
+    options.cluster_ops = params.cluster_ops;
+
+    CowWriterV3 writer(options, GetCowFd());
+
+    ASSERT_TRUE(writer.Initialize());
+
+    std::string xor_data = "This is test data-1. Testing xor";
+    xor_data.resize(options.block_size, '\0');
+    ASSERT_TRUE(writer.AddXorBlocks(50, xor_data.data(), xor_data.size(), 24, 10));
+
+    // Large number of blocks
+    std::string data = "This is test data-2. Testing replace ops";
+    data.resize(options.block_size * 2048, '\0');
+    ASSERT_TRUE(writer.AddRawBlocks(100, data.data(), data.size()));
+
+    std::string data2 = "This is test data-3. Testing replace ops";
+    data2.resize(options.block_size * 259, '\0');
+    ASSERT_TRUE(writer.AddRawBlocks(6000, data2.data(), data2.size()));
+
+    // Test data size is smaller than block size
+
+    // 4k block
+    std::string data3 = "This is test data-4. Testing replace ops";
+    data3.resize(options.block_size, '\0');
+    ASSERT_TRUE(writer.AddRawBlocks(9000, data3.data(), data3.size()));
+
+    // 8k block
+    std::string data4;
+    data4.resize(options.block_size * 2, '\0');
+    for (size_t i = 0; i < data4.size(); i++) {
+        data4[i] = static_cast<char>('A' + i / options.block_size);
+    }
+    ASSERT_TRUE(writer.AddRawBlocks(10000, data4.data(), data4.size()));
+
+    // 16k block
+    std::string data5;
+    data.resize(options.block_size * 4, '\0');
+    for (int i = 0; i < data5.size(); i++) {
+        data5[i] = static_cast<char>('C' + i / options.block_size);
+    }
+    ASSERT_TRUE(writer.AddRawBlocks(11000, data5.data(), data5.size()));
+
+    // 64k Random buffer which cannot be compressed
+    unique_fd rnd_fd(open("/dev/random", O_RDONLY));
+    ASSERT_GE(rnd_fd, 0);
+    std::string random_buffer;
+    random_buffer.resize(65536, '\0');
+    ASSERT_EQ(android::base::ReadFullyAtOffset(rnd_fd, random_buffer.data(), 65536, 0), true);
+    ASSERT_TRUE(writer.AddRawBlocks(12000, random_buffer.data(), 65536));
+
+    ASSERT_TRUE(writer.Finalize());
+
+    ASSERT_EQ(lseek(cow_->fd, 0, SEEK_SET), 0);
+
+    CowReader reader;
+    ASSERT_TRUE(reader.Parse(cow_->fd));
+
+    auto iter = reader.GetOpIter();
+    ASSERT_NE(iter, nullptr);
+
+    while (!iter->AtEnd()) {
+        auto op = iter->Get();
+
+        if (op->type() == kCowXorOp) {
+            std::string sink(xor_data.size(), '\0');
+            ASSERT_EQ(op->new_block, 50);
+            ASSERT_EQ(op->source(), 98314);  // 4096 * 24 + 10
+            ReadBlockData(reader, op, sink.data(), sink.size());
+            ASSERT_EQ(sink, xor_data);
+        }
+        if (op->type() == kCowReplaceOp) {
+            if (op->new_block == 100) {
+                data.resize(options.block_size);
+                std::string sink(data.size(), '\0');
+                ReadBlockData(reader, op, sink.data(), sink.size());
+                ASSERT_EQ(sink.size(), data.size());
+                ASSERT_EQ(sink, data);
+            }
+            if (op->new_block == 6000) {
+                data2.resize(options.block_size);
+                std::string sink(data2.size(), '\0');
+                ReadBlockData(reader, op, sink.data(), sink.size());
+                ASSERT_EQ(sink, data2);
+            }
+            if (op->new_block == 9000) {
+                std::string sink(data3.size(), '\0');
+                ReadBlockData(reader, op, sink.data(), sink.size());
+                ASSERT_EQ(sink, data3);
+            }
+            if (op->new_block == 10000) {
+                data4.resize(options.block_size);
+                std::string sink(options.block_size, '\0');
+                ReadBlockData(reader, op, sink.data(), sink.size());
+                ASSERT_EQ(sink, data4);
+            }
+            if (op->new_block == 11000) {
+                data5.resize(options.block_size);
+                std::string sink(options.block_size, '\0');
+                ReadBlockData(reader, op, sink.data(), sink.size());
+                ASSERT_EQ(sink, data5);
+            }
+            if (op->new_block == 12000) {
+                random_buffer.resize(options.block_size);
+                std::string sink(options.block_size, '\0');
+                ReadBlockData(reader, op, sink.data(), sink.size());
+                ASSERT_EQ(sink, random_buffer);
+            }
+        }
+
+        iter->Next();
+    }
+}
+
+std::vector<TestParam> GetTestConfigs() {
+    std::vector<TestParam> testParams;
+
+    std::vector<int> block_sizes = {4_KiB, 8_KiB, 16_KiB, 32_KiB, 64_KiB, 128_KiB, 256_KiB};
+    std::vector<std::string> compression_algo = {"none", "lz4", "zstd", "gz"};
+    std::vector<int> threads = {1, 2};
+    // This will also test batch size
+    std::vector<size_t> cluster_ops = {1, 256};
+
+    // This should test 112 combination
+    for (auto block : block_sizes) {
+        for (auto compression : compression_algo) {
+            for (auto thread : threads) {
+                for (auto cluster : cluster_ops) {
+                    TestParam param;
+                    param.block_size = block;
+                    param.compression = compression;
+                    param.num_threads = thread;
+                    param.cluster_ops = cluster;
+                    testParams.push_back(std::move(param));
+                }
+            }
+        }
+    }
+
+    return testParams;
+}
+
+INSTANTIATE_TEST_SUITE_P(CompressorsWithVariableBlocks, VariableBlockTest,
+                         ::testing::ValuesIn(GetTestConfigs()));
+
 }  // namespace snapshot
 }  // namespace android
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.cpp
index 37324c7..d0864e0 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.cpp
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.cpp
@@ -185,7 +185,7 @@
     for (int i = 0; i < num_compress_threads_; i++) {
         std::unique_ptr<ICompressor> compressor =
                 ICompressor::Create(compression_, header_.block_size);
-        auto wt = std::make_unique<CompressWorker>(std::move(compressor), header_.block_size);
+        auto wt = std::make_unique<CompressWorker>(std::move(compressor));
         threads_.emplace_back(std::async(std::launch::async, &CompressWorker::RunThread, wt.get()));
         compress_threads_.push_back(std::move(wt));
     }
@@ -353,7 +353,7 @@
         if (i == num_threads - 1) {
             num_blocks_per_thread = num_blocks;
         }
-        worker->EnqueueCompressBlocks(iter, num_blocks_per_thread);
+        worker->EnqueueCompressBlocks(iter, header_.block_size, num_blocks_per_thread);
         iter += (num_blocks_per_thread * header_.block_size);
         num_blocks -= num_blocks_per_thread;
     }
@@ -369,7 +369,7 @@
 }
 
 bool CowWriterV2::EmitBlocks(uint64_t new_block_start, const void* data, size_t size,
-                             uint64_t old_block, uint16_t offset, uint8_t type) {
+                             uint64_t old_block, uint16_t offset, CowOperationType type) {
     CHECK(!merge_in_progress_);
     const uint8_t* iter = reinterpret_cast<const uint8_t*>(data);
 
@@ -576,12 +576,14 @@
     return Sync();
 }
 
-uint64_t CowWriterV2::GetCowSize() {
+CowSizeInfo CowWriterV2::GetCowSizeInfo() const {
+    CowSizeInfo info;
     if (current_data_size_ > 0) {
-        return next_data_pos_ + sizeof(footer_);
+        info.cow_size = next_data_pos_ + sizeof(footer_);
     } else {
-        return next_op_pos_ + sizeof(footer_);
+        info.cow_size = next_op_pos_ + sizeof(footer_);
     }
+    return info;
 }
 
 bool CowWriterV2::GetDataPos(uint64_t* pos) {
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.h b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.h
index 24170eb..6a37aa7 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.h
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.h
@@ -27,7 +27,7 @@
 
     bool Initialize(std::optional<uint64_t> label = {}) override;
     bool Finalize() override;
-    uint64_t GetCowSize() override;
+    CowSizeInfo GetCowSizeInfo() const override;
 
   protected:
     virtual bool EmitCopy(uint64_t new_block, uint64_t old_block, uint64_t num_blocks = 1) override;
@@ -42,7 +42,7 @@
     bool EmitCluster();
     bool EmitClusterIfNeeded();
     bool EmitBlocks(uint64_t new_block_start, const void* data, size_t size, uint64_t old_block,
-                    uint16_t offset, uint8_t type);
+                    uint16_t offset, CowOperationType type);
     void SetupHeaders();
     void SetupWriteOptions();
     bool ParseOptions();
@@ -81,8 +81,8 @@
     int num_compress_threads_ = 1;
     std::vector<std::unique_ptr<CompressWorker>> compress_threads_;
     std::vector<std::future<bool>> threads_;
-    std::vector<std::basic_string<uint8_t>> compressed_buf_;
-    std::vector<std::basic_string<uint8_t>>::iterator buf_iter_;
+    std::vector<std::vector<uint8_t>> compressed_buf_;
+    std::vector<std::vector<uint8_t>>::iterator buf_iter_;
 
     std::vector<std::unique_ptr<CowOperationV2>> opbuffer_vec_;
     std::vector<std::unique_ptr<uint8_t[]>> databuffer_vec_;
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.cpp
index 6883c5e..ea1da4b 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.cpp
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.cpp
@@ -34,10 +34,13 @@
 #include <zlib.h>
 
 #include <fcntl.h>
+#include <libsnapshot/cow_compress.h>
 #include <libsnapshot_cow/parser_v3.h>
 #include <linux/fs.h>
+#include <storage_literals/storage_literals.h>
 #include <sys/ioctl.h>
 #include <unistd.h>
+#include <numeric>
 
 // The info messages here are spammy, but as useful for update_engine. Disable
 // them when running on the host.
@@ -52,13 +55,38 @@
 
 static_assert(sizeof(off_t) == sizeof(uint64_t));
 
+using namespace android::storage_literals;
 using android::base::unique_fd;
 
+// Divide |x| by |y| and round up to the nearest integer.
+constexpr uint64_t DivRoundUp(uint64_t x, uint64_t y) {
+    return (x + y - 1) / y;
+}
+
 CowWriterV3::CowWriterV3(const CowOptions& options, unique_fd&& fd)
-    : CowWriterBase(options, std::move(fd)) {
+    : CowWriterBase(options, std::move(fd)), batch_size_(std::max<size_t>(options.cluster_ops, 1)) {
     SetupHeaders();
 }
 
+void CowWriterV3::InitWorkers() {
+    if (num_compress_threads_ <= 1) {
+        LOG_INFO << "Not creating new threads for compression.";
+        return;
+    }
+    compress_threads_.reserve(num_compress_threads_);
+    compress_threads_.clear();
+    threads_.reserve(num_compress_threads_);
+    threads_.clear();
+    for (size_t i = 0; i < num_compress_threads_; i++) {
+        std::unique_ptr<ICompressor> compressor =
+                ICompressor::Create(compression_, header_.max_compression_size);
+        auto&& wt = compress_threads_.emplace_back(
+                std::make_unique<CompressWorker>(std::move(compressor)));
+        threads_.emplace_back(std::thread([wt = wt.get()]() { wt->RunThread(); }));
+    }
+    LOG(INFO) << num_compress_threads_ << " thread used for compression";
+}
+
 void CowWriterV3::SetupHeaders() {
     header_ = {};
     header_.prefix.magic = kCowMagicNumber;
@@ -77,17 +105,23 @@
     // v3 specific fields
     // WIP: not quite sure how some of these are calculated yet, assuming buffer_size is determined
     // during COW size estimation
-    header_.sequence_buffer_offset = 0;
+    header_.sequence_data_count = 0;
+
     header_.resume_point_count = 0;
     header_.resume_point_max = kNumResumePoints;
     header_.op_count = 0;
     header_.op_count_max = 0;
     header_.compression_algorithm = kCowCompressNone;
-    return;
+    header_.max_compression_size = options_.compression_factor;
 }
 
 bool CowWriterV3::ParseOptions() {
-    num_compress_threads_ = std::max(options_.num_compress_threads, 1);
+    if (!header_.max_compression_size || !IsBlockAligned(header_.max_compression_size)) {
+        LOG(ERROR) << "Invalid compression factor: " << header_.max_compression_size;
+        return false;
+    }
+
+    num_compress_threads_ = std::max(int(options_.num_compress_threads), 1);
     auto parts = android::base::Split(options_.compression, ",");
     if (parts.size() > 2) {
         LOG(ERROR) << "failed to parse compression parameters: invalid argument count: "
@@ -100,6 +134,19 @@
         return false;
     }
     header_.compression_algorithm = *algorithm;
+    header_.op_count_max = options_.op_count_max;
+
+    if (!IsEstimating() && header_.op_count_max == 0) {
+        if (!options_.max_blocks.has_value()) {
+            LOG(ERROR) << "can't size op buffer size since op_count_max is 0 and max_blocks is not "
+                          "set.";
+            return false;
+        }
+        LOG(INFO) << "op count max is read in as 0. Setting to "
+                     "num blocks in partition "
+                  << options_.max_blocks.value();
+        header_.op_count_max = options_.max_blocks.value();
+    }
 
     if (parts.size() > 1) {
         if (!android::base::ParseUint(parts[1], &compression_.compression_level)) {
@@ -112,11 +159,47 @@
     }
 
     compression_.algorithm = *algorithm;
-    compressor_ = ICompressor::Create(compression_, header_.block_size);
+    if (compression_.algorithm != kCowCompressNone) {
+        compressor_ = ICompressor::Create(compression_, header_.max_compression_size);
+        if (compressor_ == nullptr) {
+            LOG(ERROR) << "Failed to create compressor for " << compression_.algorithm;
+            return false;
+        }
+    }
+
+    if (options_.cluster_ops &&
+        (android::base::GetBoolProperty("ro.virtual_ab.batch_writes", false) ||
+         options_.batch_write)) {
+        batch_size_ = std::max<size_t>(options_.cluster_ops, 1);
+        data_vec_.reserve(batch_size_);
+        cached_data_.reserve(batch_size_);
+        cached_ops_.reserve(batch_size_ * kNonDataOpBufferSize);
+    }
+
+    if (batch_size_ > 1) {
+        LOG(INFO) << "Batch writes: enabled with batch size " << batch_size_;
+    } else {
+        LOG(INFO) << "Batch writes: disabled";
+    }
+    if (android::base::GetBoolProperty("ro.virtual_ab.compression.threads", false) &&
+        options_.num_compress_threads) {
+        num_compress_threads_ = options_.num_compress_threads;
+    }
+    InitWorkers();
+
     return true;
 }
 
-CowWriterV3::~CowWriterV3() {}
+CowWriterV3::~CowWriterV3() {
+    for (const auto& t : compress_threads_) {
+        t->Finalize();
+    }
+    for (auto& t : threads_) {
+        if (t.joinable()) {
+            t.join();
+        }
+    }
+}
 
 bool CowWriterV3::Initialize(std::optional<uint64_t> label) {
     if (!InitFd() || !ParseOptions()) {
@@ -132,6 +215,14 @@
         }
     }
 
+    // TODO: b/322279333
+    // Set compression factor to 4k during estimation.
+    // Once COW estimator is ready to support variable
+    // block size, this check has to be removed.
+    if (IsEstimating()) {
+        header_.max_compression_size = header_.block_size;
+    }
+
     return true;
 }
 
@@ -163,7 +254,7 @@
             return false;
         }
     }
-    header_.op_count_max = options_.op_count_max;
+
     resume_points_ = std::make_shared<std::vector<ResumePoint>>();
 
     if (!Sync()) {
@@ -175,7 +266,7 @@
 }
 
 bool CowWriterV3::OpenForAppend(uint64_t label) {
-    CowHeaderV3 header_v3;
+    CowHeaderV3 header_v3{};
     if (!ReadCowHeader(fd_, &header_v3)) {
         LOG(ERROR) << "Couldn't read Cow Header";
         return false;
@@ -205,17 +296,36 @@
     return true;
 }
 
+bool CowWriterV3::CheckOpCount(size_t op_count) {
+    if (IsEstimating()) {
+        return true;
+    }
+    if (header_.op_count + cached_ops_.size() + op_count > header_.op_count_max) {
+        LOG(ERROR) << "Current number of ops on disk: " << header_.op_count
+                   << ", number of ops cached in memory: " << cached_ops_.size()
+                   << ", number of ops attempting to write: " << op_count
+                   << ", this will exceed max op count " << header_.op_count_max;
+        return false;
+    }
+    return true;
+}
+
 bool CowWriterV3::EmitCopy(uint64_t new_block, uint64_t old_block, uint64_t num_blocks) {
+    if (!CheckOpCount(num_blocks)) {
+        return false;
+    }
     for (size_t i = 0; i < num_blocks; i++) {
-        CowOperationV3 op = {};
-        op.type = kCowCopyOp;
+        CowOperationV3& op = cached_ops_.emplace_back();
+        op.set_type(kCowCopyOp);
         op.new_block = new_block + i;
-        op.source_info = old_block + i;
-        if (!WriteOperation(op)) {
+        op.set_source(old_block + i);
+    }
+
+    if (NeedsFlush()) {
+        if (!FlushCacheOps()) {
             return false;
         }
     }
-
     return true;
 }
 
@@ -228,56 +338,99 @@
     return EmitBlocks(new_block_start, data, size, old_block, offset, kCowXorOp);
 }
 
-bool CowWriterV3::EmitBlocks(uint64_t new_block_start, const void* data, size_t size,
-                             uint64_t old_block, uint16_t offset, uint8_t type) {
-    const size_t num_blocks = (size / header_.block_size);
-    for (size_t i = 0; i < num_blocks; i++) {
-        const uint8_t* const iter =
-                reinterpret_cast<const uint8_t*>(data) + (header_.block_size * i);
+bool CowWriterV3::NeedsFlush() const {
+    // Allow bigger batch sizes for ops without data. A single CowOperationV3
+    // struct uses 14 bytes of memory, even if we cache 200 * 16 ops in memory,
+    // it's only ~44K.
+    return cached_data_.size() >= batch_size_ ||
+           cached_ops_.size() >= batch_size_ * kNonDataOpBufferSize;
+}
 
-        CowOperation op = {};
-        op.new_block = new_block_start + i;
+bool CowWriterV3::ConstructCowOpCompressedBuffers(uint64_t new_block_start, const void* data,
+                                                  uint64_t old_block, uint16_t offset,
+                                                  CowOperationType type, size_t blocks_to_write) {
+    size_t compressed_bytes = 0;
+    auto&& blocks = CompressBlocks(blocks_to_write, data, type);
+    if (blocks.empty()) {
+        LOG(ERROR) << "Failed to compress blocks " << new_block_start << ", " << blocks_to_write
+                   << ", actual number of blocks received from compressor " << blocks.size();
+        return false;
+    }
+    if (!CheckOpCount(blocks.size())) {
+        return false;
+    }
+    size_t blocks_written = 0;
+    for (size_t blk_index = 0; blk_index < blocks.size(); blk_index++) {
+        CowOperation& op = cached_ops_.emplace_back();
+        auto& vec = data_vec_.emplace_back();
+        CompressedBuffer buffer = std::move(blocks[blk_index]);
+        auto& compressed_data = cached_data_.emplace_back(std::move(buffer.compressed_data));
+        op.new_block = new_block_start + blocks_written;
 
-        op.type = type;
+        op.set_type(type);
+        op.set_compression_bits(std::log2(buffer.compression_factor / header_.block_size));
+
         if (type == kCowXorOp) {
-            op.source_info = (old_block + i) * header_.block_size + offset;
+            op.set_source((old_block + blocks_written) * header_.block_size + offset);
         } else {
-            op.source_info = next_data_pos_;
+            op.set_source(next_data_pos_ + compressed_bytes);
         }
-        std::basic_string<uint8_t> compressed_data;
-        const void* out_data = iter;
 
-        op.data_length = header_.block_size;
+        vec = {.iov_base = compressed_data.data(), .iov_len = compressed_data.size()};
+        op.data_length = vec.iov_len;
+        compressed_bytes += op.data_length;
+        blocks_written += (buffer.compression_factor / header_.block_size);
+    }
+    if (blocks_written != blocks_to_write) {
+        LOG(ERROR) << "Total compressed blocks: " << blocks_written
+                   << " Expected: " << blocks_to_write;
+        return false;
+    }
+    return true;
+}
 
-        if (compression_.algorithm) {
-            if (!compressor_) {
-                PLOG(ERROR) << "Compressor not initialized";
-                return false;
-            }
-            compressed_data = compressor_->Compress(out_data, header_.block_size);
-            if (compressed_data.size() < op.data_length) {
-                out_data = compressed_data.data();
-                op.data_length = compressed_data.size();
-            }
-        }
-        if (!WriteOperation(op, out_data, op.data_length)) {
-            PLOG(ERROR) << "AddRawBlocks with compression: write failed. new block: "
-                        << new_block_start << " compression: " << compression_.algorithm;
+bool CowWriterV3::EmitBlocks(uint64_t new_block_start, const void* data, size_t size,
+                             uint64_t old_block, uint16_t offset, CowOperationType type) {
+    if (compression_.algorithm != kCowCompressNone && compressor_ == nullptr) {
+        LOG(ERROR) << "Compression algorithm is " << compression_.algorithm
+                   << " but compressor is uninitialized.";
+        return false;
+    }
+    const auto bytes = reinterpret_cast<const uint8_t*>(data);
+    const size_t num_blocks = (size / header_.block_size);
+    for (size_t i = 0; i < num_blocks;) {
+        const size_t blocks_to_write =
+                std::min<size_t>(batch_size_ - cached_data_.size(), num_blocks - i);
+
+        if (!ConstructCowOpCompressedBuffers(new_block_start + i, bytes + header_.block_size * i,
+                                             old_block + i, offset, type, blocks_to_write)) {
             return false;
         }
+
+        if (NeedsFlush() && !FlushCacheOps()) {
+            LOG(ERROR) << "EmitBlocks with compression: write failed. new block: "
+                       << new_block_start << " compression: " << compression_.algorithm
+                       << ", op type: " << type;
+            return false;
+        }
+
+        i += blocks_to_write;
     }
 
     return true;
 }
 
-bool CowWriterV3::EmitZeroBlocks(uint64_t new_block_start, uint64_t num_blocks) {
+bool CowWriterV3::EmitZeroBlocks(uint64_t new_block_start, const uint64_t num_blocks) {
+    if (!CheckOpCount(num_blocks)) {
+        return false;
+    }
     for (uint64_t i = 0; i < num_blocks; i++) {
-        CowOperationV3 op;
-        op.type = kCowZeroOp;
-        op.data_length = 0;
+        auto& op = cached_ops_.emplace_back();
+        op.set_type(kCowZeroOp);
         op.new_block = new_block_start + i;
-        op.source_info = 0;
-        if (!WriteOperation(op)) {
+    }
+    if (NeedsFlush()) {
+        if (!FlushCacheOps()) {
             return false;
         }
     }
@@ -288,6 +441,10 @@
     // remove all labels greater than this current one. we want to avoid the situation of adding
     // in
     // duplicate labels with differing op values
+    if (!FlushCacheOps()) {
+        LOG(ERROR) << "Failed to flush cached ops before emitting label " << label;
+        return false;
+    }
     auto remove_if_callback = [&](const auto& resume_point) -> bool {
         if (resume_point.label >= label) return true;
         return false;
@@ -311,43 +468,264 @@
         PLOG(ERROR) << "writing resume buffer failed";
         return false;
     }
-    return Sync();
+    return Finalize();
 }
 
 bool CowWriterV3::EmitSequenceData(size_t num_ops, const uint32_t* data) {
-    LOG(ERROR) << __LINE__ << " " << __FILE__ << " <- function here should never be called";
-    if (num_ops && data) return false;
-    return false;
+    if (header_.op_count > 0 || !cached_ops_.empty()) {
+        LOG(ERROR) << "There's " << header_.op_count << " operations written to disk and "
+                   << cached_ops_.size()
+                   << " ops cached in memory. Writing sequence data is only allowed before all "
+                      "operation writes.";
+        return false;
+    }
+
+    header_.sequence_data_count = num_ops;
+
+    // Ensure next_data_pos_ is updated as previously initialized + the newly added sequence buffer.
+    CHECK_EQ(next_data_pos_ + header_.sequence_data_count * sizeof(uint32_t),
+             GetDataOffset(header_));
+    next_data_pos_ = GetDataOffset(header_);
+
+    if (!android::base::WriteFullyAtOffset(fd_, data, sizeof(data[0]) * num_ops,
+                                           GetSequenceOffset(header_))) {
+        PLOG(ERROR) << "writing sequence buffer failed";
+        return false;
+    }
+    return true;
 }
 
-bool CowWriterV3::WriteOperation(const CowOperationV3& op, const void* data, size_t size) {
+bool CowWriterV3::FlushCacheOps() {
+    if (cached_ops_.empty()) {
+        if (!data_vec_.empty()) {
+            LOG(ERROR) << "Cached ops is empty, but data iovec has size: " << data_vec_.size()
+                       << " this is definitely a bug.";
+            return false;
+        }
+        return true;
+    }
+    size_t bytes_written = 0;
+
+    for (auto& op : cached_ops_) {
+        if (op.type() == kCowReplaceOp) {
+            op.set_source(next_data_pos_ + bytes_written);
+        }
+        bytes_written += op.data_length;
+    }
+    if (!WriteOperation(cached_ops_, data_vec_)) {
+        LOG(ERROR) << "Failed to flush " << cached_ops_.size() << " ops to disk";
+        return false;
+    }
+    cached_ops_.clear();
+    cached_data_.clear();
+    data_vec_.clear();
+    return true;
+}
+
+size_t CowWriterV3::GetCompressionFactor(const size_t blocks_to_compress,
+                                         CowOperationType type) const {
+    // For XOR ops, we don't support bigger block size compression yet.
+    // For bigger block size support, snapshot-merge also has to changed. We
+    // aren't there yet; hence, just stick to 4k for now until
+    // snapshot-merge is ready for XOR operation.
+    if (type == kCowXorOp) {
+        return header_.block_size;
+    }
+
+    size_t compression_factor = header_.max_compression_size;
+    while (compression_factor > header_.block_size) {
+        size_t num_blocks = compression_factor / header_.block_size;
+        if (blocks_to_compress >= num_blocks) {
+            return compression_factor;
+        }
+        compression_factor >>= 1;
+    }
+    return header_.block_size;
+}
+
+std::vector<CowWriterV3::CompressedBuffer> CowWriterV3::ProcessBlocksWithNoCompression(
+        const size_t num_blocks, const void* data, CowOperationType type) {
+    size_t blocks_to_compress = num_blocks;
+    const uint8_t* iter = reinterpret_cast<const uint8_t*>(data);
+    std::vector<CompressedBuffer> compressed_vec;
+
+    while (blocks_to_compress) {
+        CompressedBuffer buffer;
+
+        const size_t compression_factor = GetCompressionFactor(blocks_to_compress, type);
+        size_t num_blocks = compression_factor / header_.block_size;
+
+        buffer.compression_factor = compression_factor;
+        buffer.compressed_data.resize(compression_factor);
+
+        // No compression. Just copy the data as-is.
+        std::memcpy(buffer.compressed_data.data(), iter, compression_factor);
+
+        compressed_vec.push_back(std::move(buffer));
+        blocks_to_compress -= num_blocks;
+        iter += compression_factor;
+    }
+    return compressed_vec;
+}
+
+std::vector<CowWriterV3::CompressedBuffer> CowWriterV3::ProcessBlocksWithCompression(
+        const size_t num_blocks, const void* data, CowOperationType type) {
+    size_t blocks_to_compress = num_blocks;
+    const uint8_t* iter = reinterpret_cast<const uint8_t*>(data);
+    std::vector<CompressedBuffer> compressed_vec;
+
+    while (blocks_to_compress) {
+        CompressedBuffer buffer;
+
+        const size_t compression_factor = GetCompressionFactor(blocks_to_compress, type);
+        size_t num_blocks = compression_factor / header_.block_size;
+
+        buffer.compression_factor = compression_factor;
+        // Compress the blocks
+        buffer.compressed_data = compressor_->Compress(iter, compression_factor);
+        if (buffer.compressed_data.empty()) {
+            PLOG(ERROR) << "Compression failed";
+            return {};
+        }
+
+        // Check if the buffer was indeed compressed
+        if (buffer.compressed_data.size() >= compression_factor) {
+            buffer.compressed_data.resize(compression_factor);
+            std::memcpy(buffer.compressed_data.data(), iter, compression_factor);
+        }
+
+        compressed_vec.push_back(std::move(buffer));
+        blocks_to_compress -= num_blocks;
+        iter += compression_factor;
+    }
+    return compressed_vec;
+}
+
+std::vector<CowWriterV3::CompressedBuffer> CowWriterV3::ProcessBlocksWithThreadedCompression(
+        const size_t num_blocks, const void* data, CowOperationType type) {
+    const size_t num_threads = num_compress_threads_;
+    const uint8_t* iter = reinterpret_cast<const uint8_t*>(data);
+
+    // We will alternate which thread to send compress work to. E.g. alternate between T1 and T2
+    // until all blocks are processed
+    std::vector<CompressedBuffer> compressed_vec;
+    int iteration = 0;
+    int blocks_to_compress = static_cast<int>(num_blocks);
+    while (blocks_to_compress) {
+        CompressedBuffer buffer;
+        CompressWorker* worker = compress_threads_[iteration % num_threads].get();
+
+        const size_t compression_factor = GetCompressionFactor(blocks_to_compress, type);
+        size_t num_blocks = compression_factor / header_.block_size;
+
+        worker->EnqueueCompressBlocks(iter, compression_factor, 1);
+        buffer.compression_factor = compression_factor;
+        compressed_vec.push_back(std::move(buffer));
+
+        iteration++;
+        iter += compression_factor;
+        blocks_to_compress -= num_blocks;
+    }
+
+    std::vector<std::vector<uint8_t>> compressed_buf;
+    std::vector<std::vector<std::vector<uint8_t>>> worker_buffers(num_threads);
+    compressed_buf.clear();
+    for (size_t i = 0; i < num_threads; i++) {
+        CompressWorker* worker = compress_threads_[i].get();
+        if (!worker->GetCompressedBuffers(&worker_buffers[i])) {
+            return {};
+        }
+    }
+    // compressed_vec | CB 1 | CB 2 | CB 3 | CB 4 | <-compressed buffers
+    //                   t1     t2     t1     t2    <- processed by these threads
+    // Ordering is important here. We need to retrieve the compressed data in the same order we
+    // processed it and assume that that we submit data beginning with the first thread and then
+    // round robin the consecutive data calls. We need to Fetch compressed buffers from the threads
+    // via the same ordering
+    for (size_t i = 0; i < compressed_vec.size(); i++) {
+        compressed_buf.emplace_back(worker_buffers[i % num_threads][i / num_threads]);
+    }
+
+    if (compressed_vec.size() != compressed_buf.size()) {
+        LOG(ERROR) << "Compressed buffer size: " << compressed_buf.size()
+                   << " - Expected: " << compressed_vec.size();
+        return {};
+    }
+
+    iter = reinterpret_cast<const uint8_t*>(data);
+    // Walk through all the compressed buffers
+    for (size_t i = 0; i < compressed_buf.size(); i++) {
+        auto& buffer = compressed_vec[i];
+        auto& block = compressed_buf[i];
+        size_t block_size = buffer.compression_factor;
+        // Check if the blocks was indeed compressed
+        if (block.size() >= block_size) {
+            buffer.compressed_data.resize(block_size);
+            std::memcpy(buffer.compressed_data.data(), iter, block_size);
+        } else {
+            // Compressed block
+            buffer.compressed_data.resize(block.size());
+            std::memcpy(buffer.compressed_data.data(), block.data(), block.size());
+        }
+        iter += block_size;
+    }
+    return compressed_vec;
+}
+
+std::vector<CowWriterV3::CompressedBuffer> CowWriterV3::CompressBlocks(const size_t num_blocks,
+                                                                       const void* data,
+                                                                       CowOperationType type) {
+    if (compression_.algorithm == kCowCompressNone) {
+        return ProcessBlocksWithNoCompression(num_blocks, data, type);
+    }
+
+    const size_t num_threads = (num_blocks == 1) ? 1 : num_compress_threads_;
+
+    // If no threads are required, just compress the blocks inline.
+    if (num_threads <= 1) {
+        return ProcessBlocksWithCompression(num_blocks, data, type);
+    }
+
+    return ProcessBlocksWithThreadedCompression(num_blocks, data, type);
+}
+
+bool CowWriterV3::WriteOperation(std::span<const CowOperationV3> ops,
+                                 std::span<const struct iovec> data) {
+    const auto total_data_size =
+            std::transform_reduce(data.begin(), data.end(), 0, std::plus<size_t>{},
+                                  [](const struct iovec& a) { return a.iov_len; });
     if (IsEstimating()) {
-        header_.op_count++;
-        header_.op_count_max++;
-        next_data_pos_ += op.data_length;
+        header_.op_count += ops.size();
+        if (header_.op_count > header_.op_count_max) {
+            // If we increment op_count_max, the offset of data section would
+            // change. So need to update |next_data_pos_|
+            next_data_pos_ += (header_.op_count - header_.op_count_max) * sizeof(CowOperationV3);
+            header_.op_count_max = header_.op_count;
+        }
+        next_data_pos_ += total_data_size;
         return true;
     }
 
-    if (header_.op_count + 1 > header_.op_count_max) {
-        LOG(ERROR) << "Maximum number of ops reached: " << header_.op_count_max;
+    if (header_.op_count + ops.size() > header_.op_count_max) {
+        LOG(ERROR) << "Current op count " << header_.op_count << ", attempting to write "
+                   << ops.size() << " ops will exceed the max of " << header_.op_count_max;
         return false;
     }
-
     const off_t offset = GetOpOffset(header_.op_count, header_);
-    if (!android::base::WriteFullyAtOffset(fd_, &op, sizeof(op), offset)) {
-        PLOG(ERROR) << "write failed for " << op << " at " << offset;
+    if (!android::base::WriteFullyAtOffset(fd_, ops.data(), ops.size() * sizeof(ops[0]), offset)) {
+        PLOG(ERROR) << "Write failed for " << ops.size() << " ops at " << offset;
         return false;
     }
-    if (data && size > 0) {
-        if (!android::base::WriteFullyAtOffset(fd_, data, size, next_data_pos_)) {
-            PLOG(ERROR) << "write failed for data of size: " << size
-                        << " at offset: " << next_data_pos_;
+    if (!data.empty()) {
+        const auto ret = pwritev(fd_, data.data(), data.size(), next_data_pos_);
+        if (ret != total_data_size) {
+            PLOG(ERROR) << "write failed for data of size: " << data.size()
+                        << " at offset: " << next_data_pos_ << " " << ret;
             return false;
         }
     }
-    header_.op_count++;
-    next_data_pos_ += op.data_length;
-    next_op_pos_ += sizeof(CowOperationV3);
+    header_.op_count += ops.size();
+    next_data_pos_ += total_data_size;
 
     return true;
 }
@@ -355,14 +733,20 @@
 bool CowWriterV3::Finalize() {
     CHECK_GE(header_.prefix.header_size, sizeof(CowHeaderV3));
     CHECK_LE(header_.prefix.header_size, sizeof(header_));
+    if (!FlushCacheOps()) {
+        return false;
+    }
     if (!android::base::WriteFullyAtOffset(fd_, &header_, header_.prefix.header_size, 0)) {
         return false;
     }
     return Sync();
 }
 
-uint64_t CowWriterV3::GetCowSize() {
-    return next_data_pos_;
+CowSizeInfo CowWriterV3::GetCowSizeInfo() const {
+    CowSizeInfo info;
+    info.cow_size = next_data_pos_;
+    info.op_count_max = header_.op_count_max;
+    return info;
 }
 
 }  // namespace snapshot
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.h b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.h
index 3dfc33c..e2dc698 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.h
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v3.h
@@ -15,12 +15,23 @@
 #pragma once
 
 #include <android-base/logging.h>
+#include <span>
+#include <string_view>
+#include <thread>
+#include <vector>
 
+#include <libsnapshot/cow_format.h>
+#include <storage_literals/storage_literals.h>
 #include "writer_base.h"
 
 namespace android {
 namespace snapshot {
 
+using namespace android::storage_literals;
+// This is a multiple on top of the number of data ops that can be stored in our cache at once. This
+// is added so that we can cache more non-data ops as it takes up less space.
+static constexpr uint32_t kNonDataOpBufferSize = 16;
+
 class CowWriterV3 : public CowWriterBase {
   public:
     explicit CowWriterV3(const CowOptions& options, android::base::unique_fd&& fd);
@@ -28,7 +39,7 @@
 
     bool Initialize(std::optional<uint64_t> label = {}) override;
     bool Finalize() override;
-    uint64_t GetCowSize() override;
+    CowSizeInfo GetCowSizeInfo() const override;
 
   protected:
     virtual bool EmitCopy(uint64_t new_block, uint64_t old_block, uint64_t num_blocks = 1) override;
@@ -40,16 +51,53 @@
     virtual bool EmitSequenceData(size_t num_ops, const uint32_t* data) override;
 
   private:
+    struct CompressedBuffer {
+        size_t compression_factor;
+        std::vector<uint8_t> compressed_data;
+    };
     void SetupHeaders();
+    bool NeedsFlush() const;
     bool ParseOptions();
     bool OpenForWrite();
     bool OpenForAppend(uint64_t label);
-    bool WriteOperation(const CowOperationV3& op, const void* data = nullptr, size_t size = 0);
+    bool WriteOperation(std::span<const CowOperationV3> op, std::span<const struct iovec> data);
     bool EmitBlocks(uint64_t new_block_start, const void* data, size_t size, uint64_t old_block,
-                    uint16_t offset, uint8_t type);
-    bool CompressBlocks(size_t num_blocks, const void* data);
+                    uint16_t offset, CowOperationType type);
+    bool ConstructCowOpCompressedBuffers(uint64_t new_block_start, const void* data,
+                                         uint64_t old_block, uint16_t offset, CowOperationType type,
+                                         size_t blocks_to_write);
+    bool CheckOpCount(size_t op_count);
 
   private:
+    std::vector<CompressedBuffer> ProcessBlocksWithNoCompression(const size_t num_blocks,
+                                                                 const void* data,
+                                                                 CowOperationType type);
+    std::vector<CompressedBuffer> ProcessBlocksWithCompression(const size_t num_blocks,
+                                                               const void* data,
+                                                               CowOperationType type);
+    std::vector<CompressedBuffer> ProcessBlocksWithThreadedCompression(const size_t num_blocks,
+                                                                       const void* data,
+                                                                       CowOperationType type);
+    std::vector<CompressedBuffer> CompressBlocks(const size_t num_blocks, const void* data,
+                                                 CowOperationType type);
+    size_t GetCompressionFactor(const size_t blocks_to_compress, CowOperationType type) const;
+
+    constexpr bool IsBlockAligned(const size_t size) {
+        // These are the only block size supported. Block size beyond 256k
+        // may impact random read performance post OTA boot.
+        const size_t values[] = {4_KiB, 8_KiB, 16_KiB, 32_KiB, 64_KiB, 128_KiB, 256_KiB};
+
+        auto it = std::lower_bound(std::begin(values), std::end(values), size);
+
+        if (it != std::end(values) && *it == size) {
+            return true;
+        }
+        return false;
+    }
+
+    bool ReadBackVerification();
+    bool FlushCacheOps();
+    void InitWorkers();
     CowHeaderV3 header_{};
     CowCompression compression_;
     // in the case that we are using one thread for compression, we can store and re-use the same
@@ -59,13 +107,17 @@
     // Resume points contain a laebl + cow_op_index.
     std::shared_ptr<std::vector<ResumePoint>> resume_points_;
 
-    uint64_t next_op_pos_ = 0;
     uint64_t next_data_pos_ = 0;
-    std::vector<std::basic_string<uint8_t>> compressed_buf_;
 
     // in the case that we are using one thread for compression, we can store and re-use the same
     // compressor
     int num_compress_threads_ = 1;
+    size_t batch_size_ = 1;
+    std::vector<CowOperationV3> cached_ops_;
+    std::vector<std::vector<uint8_t>> cached_data_;
+    std::vector<struct iovec> data_vec_;
+
+    std::vector<std::thread> threads_;
 };
 
 }  // namespace snapshot
diff --git a/fs_mgr/libsnapshot/partition_cow_creator.cpp b/fs_mgr/libsnapshot/partition_cow_creator.cpp
index 5bc7e65..c0d2073 100644
--- a/fs_mgr/libsnapshot/partition_cow_creator.cpp
+++ b/fs_mgr/libsnapshot/partition_cow_creator.cpp
@@ -217,6 +217,7 @@
 
     if (update && update->has_estimate_cow_size()) {
         ret.snapshot_status.set_estimated_cow_size(update->estimate_cow_size());
+        ret.snapshot_status.set_estimated_ops_buffer_size(update->estimate_op_count_max());
     }
 
     if (ret.snapshot_status.snapshot_size() == 0) {
diff --git a/fs_mgr/libsnapshot/partition_cow_creator.h b/fs_mgr/libsnapshot/partition_cow_creator.h
index bd5c8cb..cbd664f 100644
--- a/fs_mgr/libsnapshot/partition_cow_creator.h
+++ b/fs_mgr/libsnapshot/partition_cow_creator.h
@@ -59,6 +59,7 @@
     // True if snapuserd COWs are enabled.
     bool using_snapuserd = false;
     std::string compression_algorithm;
+    uint64_t compression_factor;
 
     // True if multi-threaded compression should be enabled
     bool enable_threading;
diff --git a/fs_mgr/libsnapshot/partition_cow_creator_test.cpp b/fs_mgr/libsnapshot/partition_cow_creator_test.cpp
index cf26a16..a4a2c1a 100644
--- a/fs_mgr/libsnapshot/partition_cow_creator_test.cpp
+++ b/fs_mgr/libsnapshot/partition_cow_creator_test.cpp
@@ -39,6 +39,7 @@
 namespace android {
 namespace snapshot {
 
+// @VsrTest = 3.7.6
 class PartitionCowCreatorTest : public ::testing::Test {
   public:
     void SetUp() override {
diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp
index e91e3b7..e6c4de6 100644
--- a/fs_mgr/libsnapshot/snapshot.cpp
+++ b/fs_mgr/libsnapshot/snapshot.cpp
@@ -30,6 +30,7 @@
 #include <android-base/logging.h>
 #include <android-base/parseint.h>
 #include <android-base/properties.h>
+#include <android-base/stringprintf.h>
 #include <android-base/strings.h>
 #include <android-base/unique_fd.h>
 #include <cutils/sockets.h>
@@ -82,12 +83,28 @@
 using std::chrono::duration_cast;
 using namespace std::chrono_literals;
 using namespace std::string_literals;
+using android::base::Realpath;
+using android::base::StringPrintf;
 
 static constexpr char kBootSnapshotsWithoutSlotSwitch[] =
         "/metadata/ota/snapshot-boot-without-slot-switch";
 static constexpr char kBootIndicatorPath[] = "/metadata/ota/snapshot-boot";
 static constexpr char kRollbackIndicatorPath[] = "/metadata/ota/rollback-indicator";
 static constexpr auto kUpdateStateCheckInterval = 2s;
+/*
+ * The readahead size is set to 32kb so that
+ * there is no significant memory pressure (/proc/pressure/memory) during boot.
+ * After OTA, during boot, partitions are scanned before marking slot as successful.
+ * This scan will trigger readahead both on source and COW block device thereby
+ * leading to Inactive(file) pages to be very high.
+ *
+ * A lower value may help reduce memory pressure further, however, that will
+ * increase the boot time. Thus, for device which don't care about OTA boot
+ * time, they could use O_DIRECT functionality wherein the I/O to the source
+ * block device will be O_DIRECT.
+ */
+static constexpr auto kCowReadAheadSizeKb = 32;
+static constexpr auto kSourceReadAheadSizeKb = 32;
 
 // Note: IImageManager is an incomplete type in the header, so the default
 // destructor doesn't work.
@@ -403,6 +420,7 @@
     status->set_metadata_sectors(0);
     status->set_using_snapuserd(cow_creator->using_snapuserd);
     status->set_compression_algorithm(cow_creator->compression_algorithm);
+    status->set_compression_factor(cow_creator->compression_factor);
     if (cow_creator->enable_threading) {
         status->set_enable_threading(cow_creator->enable_threading);
     }
@@ -490,8 +508,6 @@
         // When snapshots are on current slot, we determine the size
         // of block device based on the number of COW operations. We cannot
         // use base device as it will be from older image.
-        size_t num_ops = 0;
-        uint64_t dev_sz = 0;
         unique_fd fd(open(cow_file.c_str(), O_RDONLY | O_CLOEXEC));
         if (fd < 0) {
             PLOG(ERROR) << "Failed to open " << cow_file;
@@ -504,13 +520,18 @@
             return false;
         }
 
+        uint64_t dev_sz = 0;
         const auto& header = reader.GetHeader();
-        if (header.prefix.major_version > 2) {
-            LOG(ERROR) << "COW format not supported";
-            return false;
+        if (header.prefix.major_version == 2) {
+            const size_t num_ops = reader.get_num_total_data_ops();
+            dev_sz = (num_ops * header.block_size);
+        } else {
+            // create_snapshot will skip in-place copy ops. Hence, fetch this
+            // information directly from v3 header.
+            const auto& v3_header = reader.header_v3();
+            dev_sz = v3_header.op_count_max * v3_header.block_size;
         }
-        num_ops = reader.get_num_total_data_ops();
-        dev_sz = (num_ops * header.block_size);
+
         base_sectors = dev_sz >> 9;
     } else {
         // For userspace snapshots, the size of the base device is taken as the
@@ -1748,6 +1769,9 @@
                 snapuserd_argv->emplace_back(std::move(message));
             }
 
+            SetReadAheadSize(cow_image_device, kCowReadAheadSizeKb);
+            SetReadAheadSize(source_device, kSourceReadAheadSizeKb);
+
             // Do not attempt to connect to the new snapuserd yet, it hasn't
             // been started. We do however want to wait for the misc device
             // to have been created.
@@ -3213,12 +3237,16 @@
     }
 
     std::string compression_algorithm;
+    uint64_t compression_factor{};
     if (using_snapuserd) {
         compression_algorithm = dap_metadata.vabc_compression_param();
+        compression_factor = dap_metadata.compression_factor();
         if (compression_algorithm.empty()) {
             // Older OTAs don't set an explicit compression type, so default to gz.
             compression_algorithm = "gz";
         }
+        LOG(INFO) << "using compression algorithm: " << compression_algorithm
+                   << ", max compressible block size: " << compression_factor;
     }
 
     PartitionCowCreator cow_creator{
@@ -3231,7 +3259,9 @@
             .extra_extents = {},
             .using_snapuserd = using_snapuserd,
             .compression_algorithm = compression_algorithm,
+            .compression_factor = compression_factor,
     };
+
     if (dap_metadata.vabc_feature_set().has_threaded()) {
         cow_creator.enable_threading = dap_metadata.vabc_feature_set().threaded();
     }
@@ -3310,7 +3340,7 @@
         // Terminate stale daemon if any
         std::unique_ptr<SnapuserdClient> snapuserd_client = std::move(snapuserd_client_);
         if (!snapuserd_client) {
-            snapuserd_client = SnapuserdClient::Connect(kSnapuserdSocket, 5s);
+            snapuserd_client = SnapuserdClient::TryConnect(kSnapuserdSocket, 5s);
         }
         if (snapuserd_client) {
             snapuserd_client->DetachSnapuserd();
@@ -3531,6 +3561,10 @@
                 options.scratch_space = false;
             }
             options.compression = it->second.compression_algorithm();
+            if (cow_version >= 3) {
+                options.op_count_max = it->second.estimated_ops_buffer_size();
+                options.max_blocks = {it->second.device_size() / options.block_size};
+            }
 
             auto writer = CreateCowWriter(cow_version, options, std::move(fd));
             if (!writer->Finalize()) {
@@ -3641,7 +3675,9 @@
     cow_options.compression = status.compression_algorithm();
     cow_options.max_blocks = {status.device_size() / cow_options.block_size};
     cow_options.batch_write = status.batched_writes();
-    cow_options.num_compress_threads = status.enable_threading() ? 2 : 0;
+    cow_options.num_compress_threads = status.enable_threading() ? 2 : 1;
+    cow_options.op_count_max = status.estimated_ops_buffer_size();
+    cow_options.compression_factor = status.compression_factor();
     // Disable scratch space for vts tests
     if (device()->IsTestDevice()) {
         cow_options.scratch_space = false;
@@ -3769,6 +3805,7 @@
         ss << "    allocated sectors: " << status.sectors_allocated() << std::endl;
         ss << "    metadata sectors: " << status.metadata_sectors() << std::endl;
         ss << "    compression: " << status.compression_algorithm() << std::endl;
+        ss << "    compression factor: " << status.compression_factor() << std::endl;
         ss << "    merge phase: " << DecideMergePhase(status) << std::endl;
     }
     os << ss.rdbuf();
@@ -4404,5 +4441,31 @@
     return true;
 }
 
+void SnapshotManager::SetReadAheadSize(const std::string& entry_block_device, off64_t size_kb) {
+    std::string block_device;
+    if (!Realpath(entry_block_device, &block_device)) {
+        PLOG(ERROR) << "Failed to realpath " << entry_block_device;
+        return;
+    }
+
+    static constexpr std::string_view kDevBlockPrefix("/dev/block/");
+    if (!android::base::StartsWith(block_device, kDevBlockPrefix)) {
+        LOG(ERROR) << block_device << " is not a block device";
+        return;
+    }
+
+    std::string block_name = block_device.substr(kDevBlockPrefix.length());
+    std::string sys_partition =
+            android::base::StringPrintf("/sys/class/block/%s/partition", block_name.c_str());
+    struct stat info;
+    if (lstat(sys_partition.c_str(), &info) == 0) {
+        block_name += "/..";
+    }
+    std::string sys_ra = android::base::StringPrintf("/sys/class/block/%s/queue/read_ahead_kb",
+                                                     block_name.c_str());
+    std::string size = std::to_string(size_kb);
+    android::base::WriteStringToFile(size, sys_ra.c_str());
+}
+
 }  // namespace snapshot
 }  // namespace android
diff --git a/fs_mgr/libsnapshot/snapshot_test.cpp b/fs_mgr/libsnapshot/snapshot_test.cpp
index 4e6b5e1..47e6ce9 100644
--- a/fs_mgr/libsnapshot/snapshot_test.cpp
+++ b/fs_mgr/libsnapshot/snapshot_test.cpp
@@ -104,6 +104,7 @@
 
 void MountMetadata();
 
+// @VsrTest = 3.7.6
 class SnapshotTest : public ::testing::Test {
   public:
     SnapshotTest() : dm_(DeviceMapper::Instance()) {}
@@ -2362,8 +2363,10 @@
     auto init = NewManagerForFirstStageMount("_b");
     ASSERT_NE(init, nullptr);
 
-    ASSERT_TRUE(init->EnsureSnapuserdConnected());
-    init->set_use_first_stage_snapuserd(true);
+    if (snapuserd_required_) {
+        ASSERT_TRUE(init->EnsureSnapuserdConnected());
+        init->set_use_first_stage_snapuserd(true);
+    }
 
     ASSERT_TRUE(init->NeedSnapshotsInFirstStageMount());
     ASSERT_TRUE(init->CreateLogicalAndSnapshotPartitions("super", snapshot_timeout_));
@@ -2374,9 +2377,11 @@
         ASSERT_TRUE(IsPartitionUnchanged(name));
     }
 
-    ASSERT_TRUE(init->PerformInitTransition(SnapshotManager::InitTransition::SECOND_STAGE));
-    for (const auto& name : partitions) {
-        ASSERT_TRUE(init->snapuserd_client()->WaitForDeviceDelete(name + "-user-cow-init"));
+    if (snapuserd_required_) {
+        ASSERT_TRUE(init->PerformInitTransition(SnapshotManager::InitTransition::SECOND_STAGE));
+        for (const auto& name : partitions) {
+            ASSERT_TRUE(init->snapuserd_client()->WaitForDeviceDelete(name + "-user-cow-init"));
+        }
     }
 
     // Initiate the merge and wait for it to be completed.
@@ -2860,15 +2865,23 @@
 }
 
 void KillSnapuserd() {
-    auto status = android::base::GetProperty("init.svc.snapuserd", "stopped");
-    if (status == "stopped") {
-        return;
+    // Detach the daemon if it's alive
+    auto snapuserd_client = SnapuserdClient::TryConnect(kSnapuserdSocket, 5s);
+    if (snapuserd_client) {
+        snapuserd_client->DetachSnapuserd();
     }
-    auto snapuserd_client = SnapuserdClient::Connect(kSnapuserdSocket, 5s);
-    if (!snapuserd_client) {
-        return;
+
+    // Now stop the service - Init will send a SIGKILL to the daemon. However,
+    // process state will move from "running" to "stopping". Only after the
+    // process is reaped by init, the service state is moved to "stopped".
+    //
+    // Since the tests involve starting the daemon immediately, wait for the
+    // process to completely stop (aka. wait until init reaps the terminated
+    // process).
+    android::base::SetProperty("ctl.stop", "snapuserd");
+    if (!android::base::WaitForProperty("init.svc.snapuserd", "stopped", 10s)) {
+        LOG(ERROR) << "Timed out waiting for snapuserd to stop.";
     }
-    snapuserd_client->DetachSnapuserd();
 }
 
 }  // namespace snapshot
diff --git a/fs_mgr/libsnapshot/snapshotctl.cpp b/fs_mgr/libsnapshot/snapshotctl.cpp
index ebaca2d..5d3f96c 100644
--- a/fs_mgr/libsnapshot/snapshotctl.cpp
+++ b/fs_mgr/libsnapshot/snapshotctl.cpp
@@ -15,6 +15,7 @@
 //
 
 #include <sysexits.h>
+#include <unistd.h>
 
 #include <chrono>
 #include <filesystem>
@@ -46,13 +47,14 @@
 
 #include "partition_cow_creator.h"
 
-#ifdef SNAPSHOTCTL_USERDEBUG_OR_ENG
 #include <BootControlClient.h>
-#endif
 
 using namespace std::chrono_literals;
 using namespace std::string_literals;
 using namespace android::storage_literals;
+using android::base::LogdLogger;
+using android::base::StderrLogger;
+using android::base::TeeLogger;
 using android::fs_mgr::CreateLogicalPartitionParams;
 using android::fs_mgr::FindPartition;
 using android::fs_mgr::GetPartitionSize;
@@ -79,7 +81,11 @@
                  "  revert-snapshots\n"
                  "    Prepares devices to boot without snapshots on next boot.\n"
                  "    This does not delete the snapshot. It only removes the indicators\n"
-                 "    so that first stage init will not mount from snapshots.\n";
+                 "    so that first stage init will not mount from snapshots.\n"
+                 "  apply-update\n"
+                 "    Apply the incremental OTA update wherein the snapshots are\n"
+                 "    directly written to COW block device. This will bypass update-engine\n"
+                 "    and the device will be ready to boot from the target build.\n";
     return EX_USAGE;
 }
 
@@ -96,14 +102,22 @@
     bool DeleteSnapshots();
     bool CleanupSnapshot() { return sm_->PrepareDeviceToBootWithoutSnapshot(); }
     bool BeginUpdate();
+    bool ApplyUpdate();
 
   private:
     std::optional<std::string> GetCowImagePath(std::string& name);
+    bool PrepareUpdate();
     bool WriteSnapshotPatch(std::string cow_device, std::string patch);
+    std::string GetGroupName(const android::fs_mgr::LpMetadata& pt,
+                             const std::string& partiton_name);
     std::unique_ptr<SnapshotManager::LockedFile> lock_;
     std::unique_ptr<SnapshotManager> sm_;
     std::vector<std::future<bool>> threads_;
     std::string snapshot_dir_path_;
+    std::unordered_map<std::string, chromeos_update_engine::DynamicPartitionGroup*> group_map_;
+
+    std::vector<std::string> patchfiles_;
+    chromeos_update_engine::DeltaArchiveManifest manifest_;
 };
 
 MapSnapshots::MapSnapshots(std::string path) {
@@ -115,6 +129,178 @@
     snapshot_dir_path_ = path + "/";
 }
 
+std::string MapSnapshots::GetGroupName(const android::fs_mgr::LpMetadata& pt,
+                                       const std::string& partition_name) {
+    std::string group_name;
+    for (const auto& partition : pt.partitions) {
+        std::string name = android::fs_mgr::GetPartitionName(partition);
+        auto suffix = android::fs_mgr::GetPartitionSlotSuffix(name);
+        std::string pname = name.substr(0, name.size() - suffix.size());
+        if (pname == partition_name) {
+            std::string group_name =
+                    android::fs_mgr::GetPartitionGroupName(pt.groups[partition.group_index]);
+            return group_name.substr(0, group_name.size() - suffix.size());
+        }
+    }
+    return "";
+}
+
+bool MapSnapshots::PrepareUpdate() {
+    auto source_slot = fs_mgr_get_slot_suffix();
+    auto source_slot_number = SlotNumberForSlotSuffix(source_slot);
+    auto super_source = fs_mgr_get_super_partition_name(source_slot_number);
+
+    // Get current partition information.
+    PartitionOpener opener;
+    auto source_metadata = ReadMetadata(opener, super_source, source_slot_number);
+    if (!source_metadata) {
+        LOG(ERROR) << "Could not read source partition metadata.\n";
+        return false;
+    }
+
+    auto dap = manifest_.mutable_dynamic_partition_metadata();
+    dap->set_snapshot_enabled(true);
+    dap->set_vabc_enabled(true);
+    dap->set_vabc_compression_param("lz4");
+    dap->set_cow_version(3);
+
+    for (const auto& entry : std::filesystem::directory_iterator(snapshot_dir_path_)) {
+        if (android::base::EndsWith(entry.path().generic_string(), ".patch")) {
+            patchfiles_.push_back(android::base::Basename(entry.path().generic_string()));
+        }
+    }
+
+    for (auto& patchfile : patchfiles_) {
+        std::string parsing_file = snapshot_dir_path_ + patchfile;
+        android::base::unique_fd fd(TEMP_FAILURE_RETRY(open(parsing_file.c_str(), O_RDONLY)));
+        if (fd < 0) {
+            LOG(ERROR) << "Failed to open file: " << parsing_file;
+            return false;
+        }
+        uint64_t dev_sz = lseek(fd.get(), 0, SEEK_END);
+        if (!dev_sz) {
+            LOG(ERROR) << "Could not determine block device size: " << parsing_file;
+            return false;
+        }
+
+        const int block_sz = 4_KiB;
+        dev_sz += block_sz - 1;
+        dev_sz &= ~(block_sz - 1);
+
+        auto npos = patchfile.rfind(".patch");
+        auto partition_name = patchfile.substr(0, npos);
+
+        chromeos_update_engine::DynamicPartitionGroup* group = nullptr;
+        std::string group_name = GetGroupName(*source_metadata.get(), partition_name);
+        if (group_map_.find(group_name) != group_map_.end()) {
+            group = group_map_[group_name];
+        } else {
+            group = dap->add_groups();
+            group->set_name(group_name);
+            group_map_[group_name] = group;
+        }
+        group->add_partition_names(partition_name);
+
+        auto pu = manifest_.mutable_partitions()->Add();
+        pu->set_partition_name(partition_name);
+        pu->set_estimate_cow_size(dev_sz);
+
+        CowReader reader;
+        if (!reader.Parse(fd)) {
+            LOG(ERROR) << "COW reader parse failed";
+            return false;
+        }
+
+        uint64_t new_device_size = 0;
+        const auto& header = reader.GetHeader();
+        if (header.prefix.major_version == 2) {
+            size_t num_ops = reader.get_num_total_data_ops();
+            new_device_size = (num_ops * header.block_size);
+        } else {
+            const auto& v3_header = reader.header_v3();
+            new_device_size = v3_header.op_count_max * v3_header.block_size;
+        }
+
+        LOG(INFO) << "Partition: " << partition_name << " Group_name: " << group_name
+                  << " size: " << new_device_size << " COW-size: " << dev_sz;
+        pu->mutable_new_partition_info()->set_size(new_device_size);
+    }
+    return true;
+}
+
+bool MapSnapshots::ApplyUpdate() {
+    if (!PrepareUpdate()) {
+        LOG(ERROR) << "PrepareUpdate failed";
+        return false;
+    }
+    if (!sm_->BeginUpdate()) {
+        LOG(ERROR) << "BeginUpdate failed";
+        return false;
+    }
+    if (!sm_->CreateUpdateSnapshots(manifest_)) {
+        LOG(ERROR) << "Could not apply snapshots";
+        return false;
+    }
+
+    LOG(INFO) << "CreateUpdateSnapshots success";
+    if (!sm_->MapAllSnapshots(10s)) {
+        LOG(ERROR) << "MapAllSnapshots failed";
+        return false;
+    }
+
+    LOG(INFO) << "MapAllSnapshots success";
+
+    auto& dm = android::dm::DeviceMapper::Instance();
+    auto target_slot = fs_mgr_get_other_slot_suffix();
+    for (auto& patchfile : patchfiles_) {
+        auto npos = patchfile.rfind(".patch");
+        auto partition_name = patchfile.substr(0, npos) + target_slot;
+        auto cow_device = partition_name + "-cow";
+        std::string cow_path;
+        if (!dm.GetDmDevicePathByName(cow_device, &cow_path)) {
+            LOG(ERROR) << "Failed to cow path";
+            return false;
+        }
+        threads_.emplace_back(std::async(std::launch::async, &MapSnapshots::WriteSnapshotPatch,
+                                         this, cow_path, patchfile));
+    }
+
+    bool ret = true;
+    for (auto& t : threads_) {
+        ret = t.get() && ret;
+    }
+    if (!ret) {
+        LOG(ERROR) << "Snapshot writes failed";
+        return false;
+    }
+    if (!sm_->UnmapAllSnapshots()) {
+        LOG(ERROR) << "UnmapAllSnapshots failed";
+        return false;
+    }
+
+    LOG(INFO) << "Pre-created snapshots successfully copied";
+    // All snapshots have been written.
+    if (!sm_->FinishedSnapshotWrites(false /* wipe */)) {
+        LOG(ERROR) << "Could not finalize snapshot writes.\n";
+        return false;
+    }
+
+    auto hal = hal::BootControlClient::WaitForService();
+    if (!hal) {
+        LOG(ERROR) << "Could not find IBootControl HAL.\n";
+        return false;
+    }
+    auto target_slot_number = SlotNumberForSlotSuffix(target_slot);
+    auto cr = hal->SetActiveBootSlot(target_slot_number);
+    if (!cr.IsOk()) {
+        LOG(ERROR) << "Could not set active boot slot: " << cr.errMsg;
+        return false;
+    }
+
+    LOG(INFO) << "ApplyUpdate success";
+    return true;
+}
+
 bool MapSnapshots::BeginUpdate() {
     lock_ = sm_->LockExclusive();
     std::vector<std::string> snapshots;
@@ -228,7 +414,10 @@
             break;
         }
     }
-    fsync(cfd.get());
+    if (fsync(cfd.get()) < 0) {
+        PLOG(ERROR) << "Fsync failed";
+        return false;
+    }
     return true;
 }
 
@@ -275,23 +464,23 @@
 }
 
 bool DumpCmdHandler(int /*argc*/, char** argv) {
-    android::base::InitLogging(argv, &android::base::StderrLogger);
+    android::base::InitLogging(argv, TeeLogger(LogdLogger(), &StderrLogger));
     return SnapshotManager::New()->Dump(std::cout);
 }
 
 bool MapCmdHandler(int, char** argv) {
-    android::base::InitLogging(argv, &android::base::StderrLogger);
+    android::base::InitLogging(argv, TeeLogger(LogdLogger(), &StderrLogger));
     using namespace std::chrono_literals;
     return SnapshotManager::New()->MapAllSnapshots(5000ms);
 }
 
 bool UnmapCmdHandler(int, char** argv) {
-    android::base::InitLogging(argv, &android::base::StderrLogger);
+    android::base::InitLogging(argv, TeeLogger(LogdLogger(), &StderrLogger));
     return SnapshotManager::New()->UnmapAllSnapshots();
 }
 
 bool MergeCmdHandler(int /*argc*/, char** argv) {
-    android::base::InitLogging(argv, &android::base::StderrLogger);
+    android::base::InitLogging(argv, TeeLogger(LogdLogger(), &StderrLogger));
     LOG(WARNING) << "Deprecated. Call update_engine_client --merge instead.";
     return false;
 }
@@ -363,6 +552,30 @@
     return snapshot.DeleteSnapshots();
 }
 
+bool ApplyUpdate(int argc, char** argv) {
+    android::base::InitLogging(argv, &android::base::KernelLogger);
+
+    // Make sure we are root.
+    if (::getuid() != 0) {
+        LOG(ERROR) << "Not running as root. Try \"adb root\" first.";
+        return EXIT_FAILURE;
+    }
+
+    if (argc < 3) {
+        std::cerr << " apply-update <directory location where snapshot patches are present>"
+                     "    Apply the snapshots to the COW block device\n";
+        return false;
+    }
+
+    std::string path = std::string(argv[2]);
+    MapSnapshots cow(path);
+    if (!cow.ApplyUpdate()) {
+        return false;
+    }
+    LOG(INFO) << "Apply update success. Please reboot the device";
+    return true;
+}
+
 bool MapPrecreatedSnapshots(int argc, char** argv) {
     android::base::InitLogging(argv, &android::base::KernelLogger);
 
@@ -550,6 +763,7 @@
         {"test-blank-ota", TestOtaHandler},
 #endif
         {"unmap", UnmapCmdHandler},
+        {"apply-update", ApplyUpdate},
         {"map-snapshots", MapPrecreatedSnapshots},
         {"unmap-snapshots", UnMapPrecreatedSnapshots},
         {"delete-snapshots", DeletePrecreatedSnapshots},
diff --git a/fs_mgr/libsnapshot/snapuserd/Android.bp b/fs_mgr/libsnapshot/snapuserd/Android.bp
index 1b0c563..bd296a3 100644
--- a/fs_mgr/libsnapshot/snapuserd/Android.bp
+++ b/fs_mgr/libsnapshot/snapuserd/Android.bp
@@ -86,10 +86,15 @@
         "libext4_utils",
         "libsnapshot_cow",
         "liburing",
+        "libprocessgroup",
+        "libjsoncpp",
+        "libcgrouprc",
+        "libcgrouprc_format",
     ],
     include_dirs: ["bionic/libc/kernel"],
     export_include_dirs: ["include"],
     header_libs: [
+        "libcutils_headers",
         "libstorage_literals_headers",
     ],
     ramdisk_available: true,
@@ -126,6 +131,10 @@
         "liblog",
         "libsnapshot_cow",
         "libsnapuserd",
+        "libprocessgroup",
+        "libjsoncpp",
+        "libcgrouprc",
+        "libcgrouprc_format",
         "libsnapuserd_client",
         "libz",
         "liblz4",
@@ -135,6 +144,7 @@
     ],
 
     header_libs: [
+        "libcutils_headers",
         "libstorage_literals_headers",
     ],
 
@@ -147,12 +157,6 @@
     // snapuserd, which would lead to deadlock if we had to handle page
     // faults for its code pages.
     static_executable: true,
-
-    // Snapuserd segfaults with ThinLTO
-    // http://b/208565717
-    lto: {
-         never: true,
-    },
 }
 
 cc_binary {
@@ -257,6 +261,10 @@
         "libgtest",
         "libsnapshot_cow",
         "libsnapuserd",
+        "libprocessgroup",
+        "libjsoncpp",
+        "libcgrouprc",
+        "libcgrouprc_format",
         "liburing",
         "libz",
     ],
@@ -267,6 +275,7 @@
     header_libs: [
         "libstorage_literals_headers",
         "libfiemap_headers",
+        "libcutils_headers",
     ],
     test_options: {
         min_shipping_api_level: 30,
@@ -326,6 +335,10 @@
         "libgflags",
         "libsnapshot_cow",
         "libsnapuserd",
+        "libprocessgroup",
+        "libjsoncpp",
+        "libcgrouprc",
+        "libcgrouprc_format",
         "liburing",
         "libz",
     ],
@@ -336,5 +349,6 @@
     header_libs: [
         "libstorage_literals_headers",
         "libfiemap_headers",
+        "libcutils_headers",
     ],
 }
diff --git a/fs_mgr/libsnapshot/snapuserd/dm-snapshot-merge/snapuserd.cpp b/fs_mgr/libsnapshot/snapuserd/dm-snapshot-merge/snapuserd.cpp
index 6dc082e..93bb0b2 100644
--- a/fs_mgr/libsnapshot/snapuserd/dm-snapshot-merge/snapuserd.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/dm-snapshot-merge/snapuserd.cpp
@@ -406,9 +406,9 @@
             break;
         }
 
-        if (cow_op->type == kCowReplaceOp) {
+        if (cow_op->type() == kCowReplaceOp) {
             replace_ops++;
-        } else if (cow_op->type == kCowZeroOp) {
+        } else if (cow_op->type() == kCowZeroOp) {
             zero_ops++;
         }
 
@@ -508,7 +508,7 @@
             // the merge of operations are done based on the ops present
             // in the file.
             //===========================================================
-            uint64_t block_source = GetCowOpSourceInfoData(*cow_op);
+            uint64_t block_source = cow_op->source();
             if (prev_id.has_value()) {
                 if (dest_blocks.count(cow_op->new_block) || source_blocks.count(block_source)) {
                     break;
@@ -540,7 +540,7 @@
             chunk_vec_.push_back(std::make_pair(ChunkToSector(data_chunk_id), cow_op));
             offset += sizeof(struct disk_exception);
             num_ops += 1;
-            if (cow_op->type == kCowCopyOp) {
+            if (cow_op->type() == kCowCopyOp) {
                 copy_ops++;
             }
 
diff --git a/fs_mgr/libsnapshot/snapuserd/dm-snapshot-merge/snapuserd_readahead.cpp b/fs_mgr/libsnapshot/snapuserd/dm-snapshot-merge/snapuserd_readahead.cpp
index ab0b309..f1b9245 100644
--- a/fs_mgr/libsnapshot/snapuserd/dm-snapshot-merge/snapuserd_readahead.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/dm-snapshot-merge/snapuserd_readahead.cpp
@@ -172,7 +172,7 @@
 }
 
 void ReadAheadThread::CheckOverlap(const CowOperation* cow_op) {
-    uint64_t source_block = GetCowOpSourceInfoData(*cow_op);
+    uint64_t source_block = cow_op->source();
     if (dest_blocks_.count(cow_op->new_block) || source_blocks_.count(source_block)) {
         overlap_ = true;
     }
@@ -191,8 +191,8 @@
         // Get the first block with offset
         const CowOperation* cow_op = GetRAOpIter();
         CHECK_NE(cow_op, nullptr);
-        *source_offset = GetCowOpSourceInfoData(*cow_op);
-        if (cow_op->type == kCowCopyOp) {
+        *source_offset = cow_op->source();
+        if (cow_op->type() == kCowCopyOp) {
             *source_offset *= BLOCK_SZ;
         }
         RAIterNext();
@@ -210,8 +210,8 @@
         while (!RAIterDone() && num_ops) {
             const CowOperation* op = GetRAOpIter();
             CHECK_NE(op, nullptr);
-            uint64_t next_offset = GetCowOpSourceInfoData(*op);
-            if (op->type == kCowCopyOp) {
+            uint64_t next_offset = op->source();
+            if (op->type() == kCowCopyOp) {
                 next_offset *= BLOCK_SZ;
             }
             if (next_offset + nr_consecutive * BLOCK_SZ != *source_offset) {
diff --git a/fs_mgr/libsnapshot/snapuserd/dm-snapshot-merge/snapuserd_worker.cpp b/fs_mgr/libsnapshot/snapuserd/dm-snapshot-merge/snapuserd_worker.cpp
index 571b352..1f5d568 100644
--- a/fs_mgr/libsnapshot/snapuserd/dm-snapshot-merge/snapuserd_worker.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/dm-snapshot-merge/snapuserd_worker.cpp
@@ -177,7 +177,7 @@
         return false;
     }
 
-    switch (cow_op->type) {
+    switch (cow_op->type()) {
         case kCowReplaceOp: {
             return ProcessReplaceOp(cow_op);
         }
@@ -191,7 +191,8 @@
         }
 
         default: {
-            SNAP_LOG(ERROR) << "Unsupported operation-type found: " << cow_op->type;
+            SNAP_LOG(ERROR) << "Unsupported operation-type found: "
+                            << static_cast<uint8_t>(cow_op->type());
         }
     }
     return false;
diff --git a/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_client.h b/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_client.h
index 010beb3..ede92dd 100644
--- a/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_client.h
+++ b/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_client.h
@@ -17,11 +17,7 @@
 #include <unistd.h>
 
 #include <chrono>
-#include <cstring>
-#include <iostream>
 #include <string>
-#include <thread>
-#include <vector>
 
 #include <android-base/unique_fd.h>
 
@@ -53,9 +49,14 @@
     explicit SnapuserdClient(android::base::unique_fd&& sockfd);
     SnapuserdClient(){};
 
+    // Attempt to connect to snapsuerd, wait for the daemon to start if
+    // connection failed.
     static std::unique_ptr<SnapuserdClient> Connect(const std::string& socket_name,
                                                     std::chrono::milliseconds timeout_ms);
-
+    // Attempt to connect to snapsuerd, but does not wait for the daemon to
+    // start.
+    static std::unique_ptr<SnapuserdClient> TryConnect(const std::string& socket_name,
+                                                       std::chrono::milliseconds timeout_ms);
     bool StopSnapuserd();
 
     // Initializing a snapuserd handler is a three-step process:
diff --git a/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp b/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp
index 3bed3a4..789c980 100644
--- a/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp
@@ -27,7 +27,7 @@
 #include <unistd.h>
 
 #include <chrono>
-#include <sstream>
+#include <thread>
 
 #include <android-base/file.h>
 #include <android-base/logging.h>
@@ -64,6 +64,40 @@
     return errno == ECONNREFUSED || errno == EINTR || errno == ENOENT;
 }
 
+std::unique_ptr<SnapuserdClient> SnapuserdClient::TryConnect(const std::string& socket_name,
+                                                             std::chrono::milliseconds timeout_ms) {
+    unique_fd fd;
+    const auto start = std::chrono::steady_clock::now();
+    while (true) {
+        fd.reset(TEMP_FAILURE_RETRY(socket_local_client(
+                socket_name.c_str(), ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM)));
+        if (fd >= 0) {
+            auto client = std::make_unique<SnapuserdClient>(std::move(fd));
+            if (!client->ValidateConnection()) {
+                return nullptr;
+            }
+            return client;
+        }
+        if (errno == ENOENT) {
+            LOG(INFO) << "Daemon socket " << socket_name
+                      << " does not exist, return without waiting.";
+            return nullptr;
+        }
+        if (errno == ECONNREFUSED) {
+            const auto now = std::chrono::steady_clock::now();
+            const auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - start);
+            if (elapsed >= timeout_ms) {
+                LOG(ERROR) << "Timed out connecting to snapuserd socket: " << socket_name;
+                return nullptr;
+            }
+            std::this_thread::sleep_for(10ms);
+        } else {
+            PLOG(ERROR) << "connect failed: " << socket_name;
+            return nullptr;
+        }
+    }
+}
+
 std::unique_ptr<SnapuserdClient> SnapuserdClient::Connect(const std::string& socket_name,
                                                           std::chrono::milliseconds timeout_ms) {
     unique_fd fd;
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/extractor.cpp b/fs_mgr/libsnapshot/snapuserd/user-space-merge/extractor.cpp
index c5718d5..c85331b 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/extractor.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/extractor.cpp
@@ -41,7 +41,7 @@
 bool Extractor::Init() {
     auto opener = factory_.CreateTestOpener(control_name_);
     handler_ = std::make_shared<SnapshotHandler>(control_name_, cow_path_, base_path_, base_path_,
-                                                 opener, 1, false, false);
+                                                 opener, 1, false, false, false);
     if (!handler_->InitCowDevice()) {
         return false;
     }
@@ -50,7 +50,7 @@
     }
 
     read_worker_ = std::make_unique<ReadWorker>(cow_path_, base_path_, control_name_, base_path_,
-                                                handler_->GetSharedPtr(), opener);
+                                                handler_->GetSharedPtr(), opener, false);
     if (!read_worker_->Init()) {
         return false;
     }
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp b/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp
index ffd7a4b..711e704 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp
@@ -51,10 +51,11 @@
 std::shared_ptr<HandlerThread> SnapshotHandlerManager::AddHandler(
         const std::string& misc_name, const std::string& cow_device_path,
         const std::string& backing_device, const std::string& base_path_merge,
-        std::shared_ptr<IBlockServerOpener> opener, int num_worker_threads, bool use_iouring) {
-    auto snapuserd = std::make_shared<SnapshotHandler>(misc_name, cow_device_path, backing_device,
-                                                       base_path_merge, opener, num_worker_threads,
-                                                       use_iouring, perform_verification_);
+        std::shared_ptr<IBlockServerOpener> opener, int num_worker_threads, bool use_iouring,
+        bool o_direct) {
+    auto snapuserd = std::make_shared<SnapshotHandler>(
+            misc_name, cow_device_path, backing_device, base_path_merge, opener, num_worker_threads,
+            use_iouring, perform_verification_, o_direct);
     if (!snapuserd->InitCowDevice()) {
         LOG(ERROR) << "Failed to initialize Snapuserd";
         return nullptr;
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.h b/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.h
index ff6ee8f..f23f07e 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.h
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.h
@@ -57,7 +57,8 @@
                                                       const std::string& backing_device,
                                                       const std::string& base_path_merge,
                                                       std::shared_ptr<IBlockServerOpener> opener,
-                                                      int num_worker_threads, bool use_iouring) = 0;
+                                                      int num_worker_threads, bool use_iouring,
+                                                      bool o_direct) = 0;
 
     // Start serving requests on a snapshot handler.
     virtual bool StartHandler(const std::string& misc_name) = 0;
@@ -96,7 +97,8 @@
                                               const std::string& backing_device,
                                               const std::string& base_path_merge,
                                               std::shared_ptr<IBlockServerOpener> opener,
-                                              int num_worker_threads, bool use_iouring) override;
+                                              int num_worker_threads, bool use_iouring,
+                                              bool o_direct) override;
     bool StartHandler(const std::string& misc_name) override;
     bool DeleteHandler(const std::string& misc_name) override;
     bool InitiateMerge(const std::string& misc_name) override;
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/merge_worker.cpp b/fs_mgr/libsnapshot/snapuserd/user-space-merge/merge_worker.cpp
index 11b8d7c..bd7eaca 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/merge_worker.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/merge_worker.cpp
@@ -13,10 +13,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include "merge_worker.h"
 
+#include <libsnapshot/cow_format.h>
 #include <pthread.h>
 
+#include "merge_worker.h"
 #include "snapuserd_core.h"
 #include "utility.h"
 
@@ -37,6 +38,7 @@
     int num_ops = *pending_ops;
     int nr_consecutive = 0;
     bool checkOrderedOp = (replace_zero_vec == nullptr);
+    size_t num_blocks = 1;
 
     do {
         if (!cowop_iter_->AtEnd() && num_ops) {
@@ -48,11 +50,15 @@
             *source_offset = cow_op->new_block * BLOCK_SZ;
             if (!checkOrderedOp) {
                 replace_zero_vec->push_back(cow_op);
+                if (cow_op->type() == kCowReplaceOp) {
+                    // Get the number of blocks this op has compressed
+                    num_blocks = (CowOpCompressionSize(cow_op, BLOCK_SZ) / BLOCK_SZ);
+                }
             }
 
             cowop_iter_->Next();
-            num_ops -= 1;
-            nr_consecutive = 1;
+            num_ops -= num_blocks;
+            nr_consecutive = num_blocks;
 
             while (!cowop_iter_->AtEnd() && num_ops) {
                 const CowOperation* op = cowop_iter_->Get();
@@ -66,11 +72,20 @@
                 }
 
                 if (!checkOrderedOp) {
+                    if (op->type() == kCowReplaceOp) {
+                        num_blocks = (CowOpCompressionSize(op, BLOCK_SZ) / BLOCK_SZ);
+                        if (num_ops < num_blocks) {
+                            break;
+                        }
+                    } else {
+                        // zero op
+                        num_blocks = 1;
+                    }
                     replace_zero_vec->push_back(op);
                 }
 
-                nr_consecutive += 1;
-                num_ops -= 1;
+                nr_consecutive += num_blocks;
+                num_ops -= num_blocks;
                 cowop_iter_->Next();
             }
         }
@@ -80,16 +95,16 @@
 }
 
 bool MergeWorker::MergeReplaceZeroOps() {
-    // Flush after merging 2MB. Since all ops are independent and there is no
+    // Flush after merging 1MB. Since all ops are independent and there is no
     // dependency between COW ops, we will flush the data and the number
     // of ops merged in COW block device. If there is a crash, we will
     // end up replaying some of the COW ops which were already merged. That is
     // ok.
     //
-    // Although increasing this greater than 2MB may help in improving merge
+    // Although increasing this greater than 1MB may help in improving merge
     // times; however, on devices with low memory, this can be problematic
     // when there are multiple merge threads in parallel.
-    int total_ops_merged_per_commit = (PAYLOAD_BUFFER_SZ / BLOCK_SZ) * 2;
+    int total_ops_merged_per_commit = (PAYLOAD_BUFFER_SZ / BLOCK_SZ);
     int num_ops_merged = 0;
 
     SNAP_LOG(INFO) << "MergeReplaceZeroOps started....";
@@ -108,19 +123,25 @@
 
         for (size_t i = 0; i < replace_zero_vec.size(); i++) {
             const CowOperation* cow_op = replace_zero_vec[i];
-
-            void* buffer = bufsink_.AcquireBuffer(BLOCK_SZ);
-            if (!buffer) {
-                SNAP_LOG(ERROR) << "AcquireBuffer failed in MergeReplaceOps";
-                return false;
-            }
-            if (cow_op->type == kCowReplaceOp) {
-                if (!reader_->ReadData(cow_op, buffer, BLOCK_SZ)) {
+            if (cow_op->type() == kCowReplaceOp) {
+                size_t buffer_size = CowOpCompressionSize(cow_op, BLOCK_SZ);
+                void* buffer = bufsink_.AcquireBuffer(buffer_size);
+                if (!buffer) {
+                    SNAP_LOG(ERROR) << "AcquireBuffer failed in MergeReplaceOps";
+                    return false;
+                }
+                // Read the entire compressed buffer spanning multiple blocks
+                if (!reader_->ReadData(cow_op, buffer, buffer_size)) {
                     SNAP_LOG(ERROR) << "Failed to read COW in merge";
                     return false;
                 }
             } else {
-                CHECK(cow_op->type == kCowZeroOp);
+                void* buffer = bufsink_.AcquireBuffer(BLOCK_SZ);
+                if (!buffer) {
+                    SNAP_LOG(ERROR) << "AcquireBuffer failed in MergeReplaceOps";
+                    return false;
+                }
+                CHECK(cow_op->type() == kCowZeroOp);
                 memset(buffer, 0, BLOCK_SZ);
             }
         }
@@ -137,7 +158,7 @@
             return false;
         }
 
-        num_ops_merged += linear_blocks;
+        num_ops_merged += replace_zero_vec.size();
 
         if (num_ops_merged >= total_ops_merged_per_commit) {
             // Flush the data
@@ -557,10 +578,14 @@
         return true;
     }
 
-    if (!SetThreadPriority(kNiceValueForMergeThreads)) {
+    if (!SetThreadPriority(ANDROID_PRIORITY_BACKGROUND)) {
         SNAP_PLOG(ERROR) << "Failed to set thread priority";
     }
 
+    if (!SetProfiles({"CPUSET_SP_BACKGROUND"})) {
+        SNAP_PLOG(ERROR) << "Failed to assign task profile to Mergeworker thread";
+    }
+
     SNAP_LOG(INFO) << "Merge starting..";
 
     bufsink_.Initialize(PAYLOAD_BUFFER_SZ);
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/read_worker.cpp b/fs_mgr/libsnapshot/snapuserd/user-space-merge/read_worker.cpp
index 5cb13e8..d40b6d1 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/read_worker.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/read_worker.cpp
@@ -14,10 +14,10 @@
  * limitations under the License.
  */
 
-#include "read_worker.h"
-
+#include <libsnapshot/cow_format.h>
 #include <pthread.h>
 
+#include "read_worker.h"
 #include "snapuserd_core.h"
 #include "utility.h"
 
@@ -31,23 +31,27 @@
 void ReadWorker::CloseFds() {
     block_server_ = {};
     backing_store_fd_ = {};
+    backing_store_direct_fd_ = {};
     Worker::CloseFds();
 }
 
 ReadWorker::ReadWorker(const std::string& cow_device, const std::string& backing_device,
                        const std::string& misc_name, const std::string& base_path_merge,
                        std::shared_ptr<SnapshotHandler> snapuserd,
-                       std::shared_ptr<IBlockServerOpener> opener)
+                       std::shared_ptr<IBlockServerOpener> opener, bool direct_read)
     : Worker(cow_device, misc_name, base_path_merge, snapuserd),
       backing_store_device_(backing_device),
-      block_server_opener_(opener) {}
+      direct_read_(direct_read),
+      block_server_opener_(opener),
+      aligned_buffer_(std::unique_ptr<void, decltype(&::free)>(nullptr, &::free)) {}
 
 // Start the replace operation. This will read the
 // internal COW format and if the block is compressed,
 // it will be de-compressed.
-bool ReadWorker::ProcessReplaceOp(const CowOperation* cow_op, void* buffer) {
-    if (!reader_->ReadData(cow_op, buffer, BLOCK_SZ)) {
-        SNAP_LOG(ERROR) << "ProcessReplaceOp failed for block " << cow_op->new_block;
+bool ReadWorker::ProcessReplaceOp(const CowOperation* cow_op, void* buffer, size_t buffer_size) {
+    if (!reader_->ReadData(cow_op, buffer, buffer_size)) {
+        SNAP_LOG(ERROR) << "ProcessReplaceOp failed for block " << cow_op->new_block
+                        << " buffer_size: " << buffer_size;
         return false;
     }
     return true;
@@ -61,9 +65,20 @@
     }
     SNAP_LOG(DEBUG) << " ReadFromBaseDevice...: new-block: " << cow_op->new_block
                     << " Op: " << *cow_op;
+
+    if (direct_read_ && IsBlockAligned(offset)) {
+        if (!android::base::ReadFullyAtOffset(backing_store_direct_fd_, aligned_buffer_.get(),
+                                              BLOCK_SZ, offset)) {
+            SNAP_PLOG(ERROR) << "O_DIRECT Read failed at offset: " << offset;
+            return false;
+        }
+        std::memcpy(buffer, aligned_buffer_.get(), BLOCK_SZ);
+        return true;
+    }
+
     if (!android::base::ReadFullyAtOffset(backing_store_fd_, buffer, BLOCK_SZ, offset)) {
         std::string op;
-        if (cow_op->type == kCowCopyOp)
+        if (cow_op->type() == kCowCopyOp)
             op = "Copy-op";
         else {
             op = "Xor-op";
@@ -133,7 +148,7 @@
         }
         case MERGE_GROUP_STATE::GROUP_MERGE_PENDING: {
             bool ret;
-            if (cow_op->type == kCowCopyOp) {
+            if (cow_op->type() == kCowCopyOp) {
                 ret = ProcessCopyOp(cow_op, buffer);
             } else {
                 ret = ProcessXorOp(cow_op, buffer);
@@ -167,9 +182,15 @@
         return false;
     }
 
-    switch (cow_op->type) {
+    switch (cow_op->type()) {
         case kCowReplaceOp: {
-            return ProcessReplaceOp(cow_op, buffer);
+            size_t buffer_size = CowOpCompressionSize(cow_op, BLOCK_SZ);
+            uint8_t chunk[buffer_size];
+            if (!ProcessReplaceOp(cow_op, chunk, buffer_size)) {
+                return false;
+            }
+            std::memcpy(buffer, chunk, BLOCK_SZ);
+            return true;
         }
 
         case kCowZeroOp: {
@@ -183,7 +204,8 @@
         }
 
         default: {
-            SNAP_LOG(ERROR) << "Unknown operation-type found: " << cow_op->type;
+            SNAP_LOG(ERROR) << "Unknown operation-type found: "
+                            << static_cast<uint8_t>(cow_op->type());
         }
     }
     return false;
@@ -194,12 +216,37 @@
         return false;
     }
 
+    const size_t compression_factor = reader_->GetMaxCompressionSize();
+    if (!compression_factor) {
+        SNAP_LOG(ERROR) << "Compression factor is set to 0 which is invalid.";
+        return false;
+    }
+    decompressed_buffer_ = std::make_unique<uint8_t[]>(compression_factor);
+
     backing_store_fd_.reset(open(backing_store_device_.c_str(), O_RDONLY));
     if (backing_store_fd_ < 0) {
         SNAP_PLOG(ERROR) << "Open Failed: " << backing_store_device_;
         return false;
     }
 
+    if (direct_read_) {
+        backing_store_direct_fd_.reset(open(backing_store_device_.c_str(), O_RDONLY | O_DIRECT));
+        if (backing_store_direct_fd_ < 0) {
+            SNAP_PLOG(ERROR) << "Open Failed with O_DIRECT: " << backing_store_direct_fd_;
+            direct_read_ = false;
+        } else {
+            void* aligned_addr;
+            ssize_t page_size = getpagesize();
+            if (posix_memalign(&aligned_addr, page_size, page_size) < 0) {
+                direct_read_ = false;
+                SNAP_PLOG(ERROR) << "posix_memalign failed "
+                                 << " page_size: " << page_size << " read_sz: " << page_size;
+            } else {
+                aligned_buffer_.reset(aligned_addr);
+            }
+        }
+    }
+
     block_server_ = block_server_opener_->Open(this, PAYLOAD_BUFFER_SZ);
     if (!block_server_) {
         SNAP_PLOG(ERROR) << "Unable to open block server";
@@ -213,7 +260,7 @@
 
     pthread_setname_np(pthread_self(), "ReadWorker");
 
-    if (!SetThreadPriority(kNiceValueForMergeThreads)) {
+    if (!SetThreadPriority(ANDROID_PRIORITY_NORMAL)) {
         SNAP_PLOG(ERROR) << "Failed to set thread priority";
     }
 
@@ -243,6 +290,20 @@
     return true;
 }
 
+bool ReadWorker::GetCowOpBlockOffset(const CowOperation* cow_op, uint64_t io_block,
+                                     off_t* block_offset) {
+    // If this is a replace op, get the block offset of this I/O
+    // block. Multi-block compression is supported only for
+    // Replace ops.
+    //
+    // Note: This can be extended when we support COPY and XOR ops down the
+    // line as the blocks are mostly contiguous.
+    if (cow_op && cow_op->type() == kCowReplaceOp) {
+        return GetBlockOffset(cow_op, io_block, BLOCK_SZ, block_offset);
+    }
+    return false;
+}
+
 bool ReadWorker::ReadAlignedSector(sector_t sector, size_t sz) {
     size_t remaining_size = sz;
     std::vector<std::pair<sector_t, const CowOperation*>>& chunk_vec = snapuserd_->GetChunkVec();
@@ -253,7 +314,7 @@
         size_t read_size = std::min(PAYLOAD_BUFFER_SZ, remaining_size);
 
         size_t total_bytes_read = 0;
-
+        const CowOperation* prev_op = nullptr;
         while (read_size) {
             // We need to check every 4k block to verify if it is
             // present in the mapping.
@@ -261,7 +322,7 @@
 
             auto it = std::lower_bound(chunk_vec.begin(), chunk_vec.end(),
                                        std::make_pair(sector, nullptr), SnapshotHandler::compare);
-            bool not_found = (it == chunk_vec.end() || it->first != sector);
+            const bool sector_not_found = (it == chunk_vec.end() || it->first != sector);
 
             void* buffer = block_server_->GetResponseBuffer(BLOCK_SZ, size);
             if (!buffer) {
@@ -269,15 +330,88 @@
                 return false;
             }
 
-            if (not_found) {
-                // Block not found in map - which means this block was not
-                // changed as per the OTA. Just route the I/O to the base
-                // device.
-                if (!ReadDataFromBaseDevice(sector, buffer, size)) {
-                    SNAP_LOG(ERROR) << "ReadDataFromBaseDevice failed";
-                    return false;
+            if (sector_not_found) {
+                // Find the 4k block
+                uint64_t io_block = SectorToChunk(sector);
+                // Get the previous iterator. Since the vector is sorted, the
+                // lookup of this sector can fall in a range of blocks if
+                // CowOperation has compressed multiple blocks.
+                if (it != chunk_vec.begin()) {
+                    std::advance(it, -1);
                 }
 
+                bool is_mapping_present = true;
+
+                // Vector itself is empty. This can happen if the block was not
+                // changed per the OTA or if the merge was already complete but
+                // snapshot table was not yet collapsed.
+                if (it == chunk_vec.end()) {
+                    is_mapping_present = false;
+                }
+
+                const CowOperation* cow_op = nullptr;
+                // Relative offset within the compressed multiple blocks
+                off_t block_offset = 0;
+                if (is_mapping_present) {
+                    // Get the nearest operation found in the vector
+                    cow_op = it->second;
+                    is_mapping_present = GetCowOpBlockOffset(cow_op, io_block, &block_offset);
+                }
+
+                // Thus, we have a case wherein sector was not found in the sorted
+                // vector; however, we indeed have a mapping of this sector
+                // embedded in one of the CowOperation which spans multiple
+                // block size.
+                if (is_mapping_present) {
+                    // block_offset = 0 would mean that the CowOperation should
+                    // already be in the sorted vector. Hence, lookup should
+                    // have already found it. If not, this is a bug.
+                    if (block_offset == 0) {
+                        SNAP_LOG(ERROR)
+                                << "GetBlockOffset returned offset 0 for io_block: " << io_block;
+                        return false;
+                    }
+
+                    // Get the CowOperation actual compression size
+                    size_t compression_size = CowOpCompressionSize(cow_op, BLOCK_SZ);
+                    // Offset cannot be greater than the compression size
+                    if (block_offset > compression_size) {
+                        SNAP_LOG(ERROR) << "Invalid I/O block found. io_block: " << io_block
+                                        << " CowOperation-new-block: " << cow_op->new_block
+                                        << " compression-size: " << compression_size;
+                        return false;
+                    }
+
+                    // Cached copy of the previous iteration. Just retrieve the
+                    // data
+                    if (prev_op && prev_op->new_block == cow_op->new_block) {
+                        std::memcpy(buffer, (char*)decompressed_buffer_.get() + block_offset, size);
+                    } else {
+                        // Get the data from the disk based on the compression
+                        // size
+                        if (!ProcessReplaceOp(cow_op, decompressed_buffer_.get(),
+                                              compression_size)) {
+                            return false;
+                        }
+                        // Copy the data from the decompressed buffer relative
+                        // to the i/o block offset.
+                        std::memcpy(buffer, (char*)decompressed_buffer_.get() + block_offset, size);
+                        // Cache this CowOperation pointer for successive I/O
+                        // operation. Since the request is sequential and the
+                        // block is already decompressed, subsequest I/O blocks
+                        // can fetch the data directly from this decompressed
+                        // buffer.
+                        prev_op = cow_op;
+                    }
+                } else {
+                    // Block not found in map - which means this block was not
+                    // changed as per the OTA. Just route the I/O to the base
+                    // device.
+                    if (!ReadDataFromBaseDevice(sector, buffer, size)) {
+                        SNAP_LOG(ERROR) << "ReadDataFromBaseDevice failed";
+                        return false;
+                    }
+                }
                 ret = size;
             } else {
                 // We found the sector in mapping. Check the type of COW OP and
@@ -308,12 +442,50 @@
     return true;
 }
 
+bool ReadWorker::IsMappingPresent(const CowOperation* cow_op, loff_t requested_offset,
+                                  loff_t cow_op_offset) {
+    const bool replace_op = (cow_op->type() == kCowReplaceOp);
+    if (replace_op) {
+        size_t max_compressed_size = CowOpCompressionSize(cow_op, BLOCK_SZ);
+        if ((requested_offset >= cow_op_offset) &&
+            (requested_offset < (cow_op_offset + max_compressed_size))) {
+            return true;
+        }
+    }
+    return false;
+}
+
 int ReadWorker::ReadUnalignedSector(
         sector_t sector, size_t size,
         std::vector<std::pair<sector_t, const CowOperation*>>::iterator& it) {
     SNAP_LOG(DEBUG) << "ReadUnalignedSector: sector " << sector << " size: " << size
                     << " Aligned sector: " << it->first;
 
+    loff_t requested_offset = sector << SECTOR_SHIFT;
+    loff_t final_offset = (it->first) << SECTOR_SHIFT;
+
+    const CowOperation* cow_op = it->second;
+    if (IsMappingPresent(cow_op, requested_offset, final_offset)) {
+        size_t buffer_size = CowOpCompressionSize(cow_op, BLOCK_SZ);
+        uint8_t chunk[buffer_size];
+        // Read the entire decompressed buffer based on the block-size
+        if (!ProcessReplaceOp(cow_op, chunk, buffer_size)) {
+            return -1;
+        }
+        size_t skip_offset = (requested_offset - final_offset);
+        size_t write_sz = std::min(size, buffer_size - skip_offset);
+
+        auto buffer =
+                reinterpret_cast<uint8_t*>(block_server_->GetResponseBuffer(BLOCK_SZ, write_sz));
+        if (!buffer) {
+            SNAP_LOG(ERROR) << "ReadUnalignedSector failed to allocate buffer";
+            return -1;
+        }
+
+        std::memcpy(buffer, (char*)chunk + skip_offset, write_sz);
+        return write_sz;
+    }
+
     int num_sectors_skip = sector - it->first;
     size_t skip_size = num_sectors_skip << SECTOR_SHIFT;
     size_t write_size = std::min(size, BLOCK_SZ - skip_size);
@@ -412,8 +584,11 @@
 
     size_t remaining_size = size;
     int ret = 0;
+
+    const CowOperation* cow_op = it->second;
     if (!merge_complete && (requested_offset >= final_offset) &&
-        (requested_offset - final_offset) < BLOCK_SZ) {
+        (((requested_offset - final_offset) < BLOCK_SZ) ||
+         IsMappingPresent(cow_op, requested_offset, final_offset))) {
         // Read the partial un-aligned data
         ret = ReadUnalignedSector(sector, remaining_size, it);
         if (ret < 0) {
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/read_worker.h b/fs_mgr/libsnapshot/snapuserd/user-space-merge/read_worker.h
index 6dbae81..04b2736 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/read_worker.h
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/read_worker.h
@@ -28,7 +28,7 @@
     ReadWorker(const std::string& cow_device, const std::string& backing_device,
                const std::string& misc_name, const std::string& base_path_merge,
                std::shared_ptr<SnapshotHandler> snapuserd,
-               std::shared_ptr<IBlockServerOpener> opener);
+               std::shared_ptr<IBlockServerOpener> opener, bool direct_read = false);
 
     bool Run();
     bool Init() override;
@@ -44,9 +44,12 @@
     bool ProcessXorOp(const CowOperation* cow_op, void* buffer);
     bool ProcessOrderedOp(const CowOperation* cow_op, void* buffer);
     bool ProcessCopyOp(const CowOperation* cow_op, void* buffer);
-    bool ProcessReplaceOp(const CowOperation* cow_op, void* buffer);
+    bool ProcessReplaceOp(const CowOperation* cow_op, void* buffer, size_t buffer_size);
     bool ProcessZeroOp(void* buffer);
 
+    bool IsMappingPresent(const CowOperation* cow_op, loff_t requested_offset,
+                          loff_t cow_op_offset);
+    bool GetCowOpBlockOffset(const CowOperation* cow_op, uint64_t io_block, off_t* block_offset);
     bool ReadAlignedSector(sector_t sector, size_t sz);
     bool ReadUnalignedSector(sector_t sector, size_t size);
     int ReadUnalignedSector(sector_t sector, size_t size,
@@ -56,14 +59,19 @@
 
     constexpr bool IsBlockAligned(size_t size) { return ((size & (BLOCK_SZ - 1)) == 0); }
     constexpr sector_t ChunkToSector(chunk_t chunk) { return chunk << CHUNK_SHIFT; }
+    constexpr chunk_t SectorToChunk(sector_t sector) { return sector >> CHUNK_SHIFT; }
 
     std::string backing_store_device_;
     unique_fd backing_store_fd_;
+    unique_fd backing_store_direct_fd_;
+    bool direct_read_ = false;
 
     std::shared_ptr<IBlockServerOpener> block_server_opener_;
     std::unique_ptr<IBlockServer> block_server_;
 
-    std::basic_string<uint8_t> xor_buffer_;
+    std::vector<uint8_t> xor_buffer_;
+    std::unique_ptr<void, decltype(&::free)> aligned_buffer_;
+    std::unique_ptr<uint8_t[]> decompressed_buffer_;
 };
 
 }  // namespace snapshot
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.cpp b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.cpp
index 950d771..05ba047 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.cpp
@@ -36,7 +36,7 @@
 SnapshotHandler::SnapshotHandler(std::string misc_name, std::string cow_device,
                                  std::string backing_device, std::string base_path_merge,
                                  std::shared_ptr<IBlockServerOpener> opener, int num_worker_threads,
-                                 bool use_iouring, bool perform_verification) {
+                                 bool use_iouring, bool perform_verification, bool o_direct) {
     misc_name_ = std::move(misc_name);
     cow_device_ = std::move(cow_device);
     backing_store_device_ = std::move(backing_device);
@@ -45,13 +45,14 @@
     num_worker_threads_ = num_worker_threads;
     is_io_uring_enabled_ = use_iouring;
     perform_verification_ = perform_verification;
+    o_direct_ = o_direct;
 }
 
 bool SnapshotHandler::InitializeWorkers() {
     for (int i = 0; i < num_worker_threads_; i++) {
         auto wt = std::make_unique<ReadWorker>(cow_device_, backing_store_device_, misc_name_,
                                                base_path_merge_, GetSharedPtr(),
-                                               block_server_opener_);
+                                               block_server_opener_, o_direct_);
         if (!wt->Init()) {
             SNAP_LOG(ERROR) << "Thread initialization failed";
             return false;
@@ -199,13 +200,13 @@
     while (!cowop_iter->AtEnd()) {
         const CowOperation* cow_op = cowop_iter->Get();
 
-        if (cow_op->type == kCowCopyOp) {
+        if (cow_op->type() == kCowCopyOp) {
             copy_ops += 1;
-        } else if (cow_op->type == kCowReplaceOp) {
+        } else if (cow_op->type() == kCowReplaceOp) {
             replace_ops += 1;
-        } else if (cow_op->type == kCowZeroOp) {
+        } else if (cow_op->type() == kCowZeroOp) {
             zero_ops += 1;
-        } else if (cow_op->type == kCowXorOp) {
+        } else if (cow_op->type() == kCowXorOp) {
             xor_ops += 1;
         }
 
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.h b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.h
index fa1e7a0..9b7238a 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.h
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.h
@@ -47,6 +47,7 @@
 #include <snapuserd/snapuserd_buffer.h>
 #include <snapuserd/snapuserd_kernel.h>
 #include <storage_literals/storage_literals.h>
+#include <system/thread_defs.h>
 #include "snapuserd_readahead.h"
 #include "snapuserd_verify.h"
 
@@ -62,8 +63,6 @@
 
 static constexpr int kNumWorkerThreads = 4;
 
-static constexpr int kNiceValueForMergeThreads = -5;
-
 #define SNAP_LOG(level) LOG(level) << misc_name_ << ": "
 #define SNAP_PLOG(level) PLOG(level) << misc_name_ << ": "
 
@@ -105,7 +104,7 @@
   public:
     SnapshotHandler(std::string misc_name, std::string cow_device, std::string backing_device,
                     std::string base_path_merge, std::shared_ptr<IBlockServerOpener> opener,
-                    int num_workers, bool use_iouring, bool perform_verification);
+                    int num_workers, bool use_iouring, bool perform_verification, bool o_direct);
     bool InitCowDevice();
     bool Start();
 
@@ -247,6 +246,7 @@
     bool perform_verification_ = true;
     bool resume_merge_ = false;
     bool merge_complete_ = false;
+    bool o_direct_ = false;
 
     std::unique_ptr<UpdateVerify> update_verify_;
     std::shared_ptr<IBlockServerOpener> block_server_opener_;
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_readahead.cpp b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_readahead.cpp
index 998d233..2baf20d 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_readahead.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_readahead.cpp
@@ -77,7 +77,7 @@
         SNAP_LOG(ERROR) << "PrepareNextReadAhead operation has no source offset: " << *cow_op;
         return nr_consecutive;
     }
-    if (cow_op->type == kCowXorOp) {
+    if (cow_op->type() == kCowXorOp) {
         xor_op_vec.push_back(cow_op);
     }
 
@@ -106,7 +106,7 @@
             break;
         }
 
-        if (op->type == kCowXorOp) {
+        if (op->type() == kCowXorOp) {
             xor_op_vec.push_back(op);
         }
 
@@ -778,10 +778,14 @@
 
     InitializeIouring();
 
-    if (!SetThreadPriority(kNiceValueForMergeThreads)) {
+    if (!SetThreadPriority(ANDROID_PRIORITY_BACKGROUND)) {
         SNAP_PLOG(ERROR) << "Failed to set thread priority";
     }
 
+    if (!SetProfiles({"CPUSET_SP_BACKGROUND"})) {
+        SNAP_PLOG(ERROR) << "Failed to assign task profile to readahead thread";
+    }
+
     SNAP_LOG(INFO) << "ReadAhead processing.";
     while (!RAIterDone()) {
         if (!ReadAheadIOStart()) {
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.cpp b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.cpp
index 6eee357..0b881b6 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.cpp
@@ -346,7 +346,8 @@
 std::shared_ptr<HandlerThread> UserSnapshotServer::AddHandler(const std::string& misc_name,
                                                               const std::string& cow_device_path,
                                                               const std::string& backing_device,
-                                                              const std::string& base_path_merge) {
+                                                              const std::string& base_path_merge,
+                                                              const bool o_direct) {
     // We will need multiple worker threads only during
     // device boot after OTA. For all other purposes,
     // one thread is sufficient. We don't want to consume
@@ -368,7 +369,7 @@
     auto opener = block_server_factory_->CreateOpener(misc_name);
 
     return handlers_->AddHandler(misc_name, cow_device_path, backing_device, base_path_merge,
-                                 opener, num_worker_threads, io_uring_enabled_);
+                                 opener, num_worker_threads, io_uring_enabled_, o_direct);
 }
 
 bool UserSnapshotServer::WaitForSocket() {
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h
index 9926071..3013c47 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h
@@ -86,7 +86,8 @@
     std::shared_ptr<HandlerThread> AddHandler(const std::string& misc_name,
                                               const std::string& cow_device_path,
                                               const std::string& backing_device,
-                                              const std::string& base_path_merge);
+                                              const std::string& base_path_merge,
+                                              bool o_direct = false);
     bool StartHandler(const std::string& misc_name);
 
     void SetTerminating() { terminating_ = true; }
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_test.cpp b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_test.cpp
index 73c3cbf..76b44b4 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_test.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_test.cpp
@@ -59,15 +59,25 @@
 using testing::AssertionFailure;
 using testing::AssertionResult;
 using testing::AssertionSuccess;
+using ::testing::TestWithParam;
 
-class SnapuserdTestBase : public ::testing::TestWithParam<bool> {
+struct TestParam {
+    bool io_uring;
+    bool o_direct;
+    std::string compression;
+    int block_size;
+    int num_threads;
+};
+
+class SnapuserdTestBase : public ::testing::TestWithParam<TestParam> {
   protected:
-    void SetUp() override;
+    virtual void SetUp() override;
     void TearDown() override;
     void CreateBaseDevice();
     void CreateCowDevice();
     void SetDeviceControlName();
     std::unique_ptr<ICowWriter> CreateCowDeviceInternal();
+    std::unique_ptr<ICowWriter> CreateV3Cow();
 
     std::unique_ptr<ITestHarness> harness_;
     size_t size_ = 10_MiB;
@@ -127,6 +137,24 @@
     return CreateCowWriter(kDefaultCowVersion, options, std::move(fd));
 }
 
+std::unique_ptr<ICowWriter> SnapuserdTestBase::CreateV3Cow() {
+    const TestParam params = GetParam();
+
+    CowOptions options;
+    options.op_count_max = 100000;
+    options.compression = params.compression;
+    options.num_compress_threads = params.num_threads;
+    options.batch_write = true;
+    options.compression_factor = params.block_size;
+
+    cow_system_ = std::make_unique<TemporaryFile>();
+
+    unique_fd fd(cow_system_->fd);
+    cow_system_->fd = -1;
+
+    return CreateCowWriter(3, options, std::move(fd));
+}
+
 void SnapuserdTestBase::CreateCowDevice() {
     unique_fd rnd_fd;
     loff_t offset = 0;
@@ -230,6 +258,7 @@
     void SetupOrderedOpsInverted();
     void SetupCopyOverlap_1();
     void SetupCopyOverlap_2();
+    void SetupDeviceForPassthrough();
     bool Merge();
     void ValidateMerge();
     void ReadSnapshotDeviceAndValidate();
@@ -252,6 +281,9 @@
 
     void SimulateDaemonRestart();
 
+    void CreateCowDeviceWithNoBlockChanges();
+    void ValidateDeviceWithNoBlockChanges();
+
     void CreateCowDeviceOrderedOps();
     void CreateCowDeviceOrderedOpsInverted();
     void CreateCowDeviceWithCopyOverlap_1();
@@ -301,6 +333,12 @@
     ASSERT_NO_FATAL_FAILURE(SetupDaemon());
 }
 
+void SnapuserdTest::SetupDeviceForPassthrough() {
+    ASSERT_NO_FATAL_FAILURE(CreateBaseDevice());
+    ASSERT_NO_FATAL_FAILURE(CreateCowDeviceWithNoBlockChanges());
+    ASSERT_NO_FATAL_FAILURE(SetupDaemon());
+}
+
 void SnapuserdTest::SetupOrderedOpsInverted() {
     ASSERT_NO_FATAL_FAILURE(CreateBaseDevice());
     ASSERT_NO_FATAL_FAILURE(CreateCowDeviceOrderedOpsInverted());
@@ -474,6 +512,47 @@
     }
 }
 
+void SnapuserdTest::CreateCowDeviceWithNoBlockChanges() {
+    auto writer = CreateCowDeviceInternal();
+    ASSERT_NE(writer, nullptr);
+
+    std::unique_ptr<uint8_t[]> buffer = std::make_unique<uint8_t[]>(BLOCK_SZ);
+    std::memset(buffer.get(), 'A', BLOCK_SZ);
+
+    // This test focusses on not changing all the blocks thereby validating
+    // the pass-through I/O
+
+    // Replace the first block
+    ASSERT_TRUE(writer->AddRawBlocks(1, buffer.get(), BLOCK_SZ));
+
+    // Set zero block of Block 3
+    ASSERT_TRUE(writer->AddZeroBlocks(3, 1));
+
+    ASSERT_TRUE(writer->Finalize());
+    orig_buffer_ = std::make_unique<uint8_t[]>(total_base_size_);
+
+    // Read the entire base device
+    ASSERT_EQ(android::base::ReadFullyAtOffset(base_fd_, orig_buffer_.get(), total_base_size_, 0),
+              true);
+
+    off_t offset = BLOCK_SZ;
+    std::memcpy(orig_buffer_.get() + offset, buffer.get(), BLOCK_SZ);
+    offset = 3 * BLOCK_SZ;
+    std::memset(orig_buffer_.get() + offset, 0, BLOCK_SZ);
+}
+
+void SnapuserdTest::ValidateDeviceWithNoBlockChanges() {
+    unique_fd fd(open(dmuser_dev_->GetPath().c_str(), O_RDONLY));
+    ASSERT_GE(fd, 0);
+    std::unique_ptr<uint8_t[]> snapshot_buffer = std::make_unique<uint8_t[]>(size_);
+    std::memset(snapshot_buffer.get(), 'B', size_);
+
+    // All the I/O request should be a pass through to base device except for
+    // Block 1 and Block 3.
+    ASSERT_EQ(ReadFullyAtOffset(fd, snapshot_buffer.get(), size_, 0), true);
+    ASSERT_EQ(memcmp(snapshot_buffer.get(), orig_buffer_.get(), size_), 0);
+}
+
 void SnapuserdTest::CreateCowDeviceWithCopyOverlap_1() {
     auto writer = CreateCowDeviceInternal();
     ASSERT_NE(writer, nullptr);
@@ -628,9 +707,10 @@
     auto factory = harness_->GetBlockServerFactory();
     auto opener = factory->CreateOpener(system_device_ctrl_name_);
     handlers_->DisableVerification();
-    auto handler =
-            handlers_->AddHandler(system_device_ctrl_name_, cow_system_->path, base_dev_->GetPath(),
-                                  base_dev_->GetPath(), opener, 1, GetParam());
+    const TestParam params = GetParam();
+    auto handler = handlers_->AddHandler(system_device_ctrl_name_, cow_system_->path,
+                                         base_dev_->GetPath(), base_dev_->GetPath(), opener, 1,
+                                         params.io_uring, params.o_direct);
     ASSERT_NE(handler, nullptr);
     ASSERT_NE(handler->snapuserd(), nullptr);
 #ifdef __ANDROID__
@@ -774,6 +854,20 @@
     ASSERT_TRUE(Merge());
 }
 
+TEST_P(SnapuserdTest, Snapshot_Passthrough) {
+    if (!harness_->HasUserDevice()) {
+        GTEST_SKIP() << "Skipping snapshot read; not supported";
+    }
+    ASSERT_NO_FATAL_FAILURE(SetupDeviceForPassthrough());
+    // I/O before merge
+    ASSERT_NO_FATAL_FAILURE(ValidateDeviceWithNoBlockChanges());
+    ASSERT_TRUE(Merge());
+    ValidateMerge();
+    // I/O after merge - daemon should read directly
+    // from base device
+    ASSERT_NO_FATAL_FAILURE(ValidateDeviceWithNoBlockChanges());
+}
+
 TEST_P(SnapuserdTest, Snapshot_IO_TEST) {
     if (!harness_->HasUserDevice()) {
         GTEST_SKIP() << "Skipping snapshot read; not supported";
@@ -846,7 +940,7 @@
         GTEST_SKIP() << "Skipping snapshot read; not supported";
     }
     ASSERT_NO_FATAL_FAILURE(SetupCopyOverlap_2());
-    ASSERT_NO_FATAL_FAILURE(MergeInterruptAndValidate(2));
+    ASSERT_NO_FATAL_FAILURE(MergeInterruptFixed(300));
     ValidateMerge();
 }
 
@@ -874,11 +968,243 @@
     ValidateMerge();
 }
 
+class SnapuserdVariableBlockSizeTest : public SnapuserdTest {
+  public:
+    void SetupCowV3ForVariableBlockSize();
+    void ReadSnapshotWithVariableBlockSize();
+
+  protected:
+    void SetUp() override;
+    void TearDown() override;
+
+    void CreateV3CowDeviceForVariableBlockSize();
+};
+
+void SnapuserdVariableBlockSizeTest::SetupCowV3ForVariableBlockSize() {
+    ASSERT_NO_FATAL_FAILURE(CreateBaseDevice());
+    ASSERT_NO_FATAL_FAILURE(CreateV3CowDeviceForVariableBlockSize());
+    ASSERT_NO_FATAL_FAILURE(SetupDaemon());
+}
+
+void SnapuserdVariableBlockSizeTest::CreateV3CowDeviceForVariableBlockSize() {
+    auto writer = CreateV3Cow();
+
+    size_t total_data_to_write = size_;
+
+    size_t total_blocks_to_write = total_data_to_write / BLOCK_SZ;
+    size_t num_blocks_per_op = total_blocks_to_write / 4;
+    size_t source_block = 0;
+
+    size_t seq_len = num_blocks_per_op;
+    uint32_t sequence[seq_len];
+    size_t xor_block_start = seq_len * 3;
+    for (size_t i = 0; i < seq_len; i++) {
+        sequence[i] = xor_block_start + i;
+    }
+    ASSERT_TRUE(writer->AddSequenceData(seq_len, sequence));
+
+    size_t total_replace_blocks = num_blocks_per_op;
+    // Write some data which can be compressed
+    std::string data;
+    data.resize(total_replace_blocks * BLOCK_SZ, '\0');
+    for (size_t i = 0; i < data.size(); i++) {
+        data[i] = static_cast<char>('A' + i / BLOCK_SZ);
+    }
+    // REPLACE ops
+    ASSERT_TRUE(writer->AddRawBlocks(source_block, data.data(), data.size()));
+
+    total_blocks_to_write -= total_replace_blocks;
+    source_block = source_block + total_replace_blocks;
+
+    // ZERO ops
+    size_t total_zero_blocks = total_blocks_to_write / 3;
+    ASSERT_TRUE(writer->AddZeroBlocks(source_block, total_zero_blocks));
+
+    total_blocks_to_write -= total_zero_blocks;
+    source_block = source_block + total_zero_blocks;
+
+    // Generate some random data wherein few blocks cannot be compressed.
+    // This is to test the I/O path for those blocks which aren't compressed.
+    size_t total_random_data_blocks = total_blocks_to_write / 2;
+    unique_fd rnd_fd(open("/dev/random", O_RDONLY));
+
+    ASSERT_GE(rnd_fd, 0);
+    std::string random_buffer;
+    random_buffer.resize(total_random_data_blocks * BLOCK_SZ, '\0');
+    ASSERT_EQ(
+            android::base::ReadFullyAtOffset(rnd_fd, random_buffer.data(), random_buffer.size(), 0),
+            true);
+    // REPLACE ops
+    ASSERT_TRUE(writer->AddRawBlocks(source_block, random_buffer.data(), random_buffer.size()));
+
+    total_blocks_to_write -= total_random_data_blocks;
+    source_block = source_block + total_random_data_blocks;
+
+    // XOR ops will always be 4k blocks
+    std::string xor_buffer;
+    xor_buffer.resize(total_blocks_to_write * BLOCK_SZ, '\0');
+    for (size_t i = 0; i < xor_buffer.size(); i++) {
+        xor_buffer[i] = static_cast<char>('C' + i / BLOCK_SZ);
+    }
+    size_t xor_offset = 21;
+    std::string source_buffer;
+    source_buffer.resize(total_blocks_to_write * BLOCK_SZ, '\0');
+    ASSERT_EQ(android::base::ReadFullyAtOffset(base_fd_, source_buffer.data(), source_buffer.size(),
+                                               size_ + xor_offset),
+              true);
+    for (size_t i = 0; i < xor_buffer.size(); i++) {
+        xor_buffer[i] ^= source_buffer[i];
+    }
+
+    ASSERT_EQ(xor_block_start, source_block);
+
+    ASSERT_TRUE(writer->AddXorBlocks(source_block, xor_buffer.data(), xor_buffer.size(),
+                                     (size_ / BLOCK_SZ), xor_offset));
+    // Flush operations
+    ASSERT_TRUE(writer->Finalize());
+
+    // Construct the buffer required for validation
+    orig_buffer_ = std::make_unique<uint8_t[]>(total_base_size_);
+
+    // Read the entire base device
+    ASSERT_EQ(android::base::ReadFullyAtOffset(base_fd_, orig_buffer_.get(), total_base_size_, 0),
+              true);
+
+    // REPLACE ops which are compressed
+    std::memcpy(orig_buffer_.get(), data.data(), data.size());
+    size_t offset = data.size();
+
+    // ZERO ops
+    std::string zero_buffer(total_zero_blocks * BLOCK_SZ, 0);
+    std::memcpy((char*)orig_buffer_.get() + offset, (void*)zero_buffer.c_str(), zero_buffer.size());
+    offset += zero_buffer.size();
+
+    // REPLACE ops - Random buffers which aren't compressed
+    std::memcpy((char*)orig_buffer_.get() + offset, random_buffer.c_str(), random_buffer.size());
+    offset += random_buffer.size();
+
+    // XOR Ops which default to 4k block size compression irrespective of
+    // compression factor
+    ASSERT_EQ(android::base::ReadFullyAtOffset(base_fd_, (char*)orig_buffer_.get() + offset,
+                                               xor_buffer.size(), size_ + xor_offset),
+              true);
+    for (size_t i = 0; i < xor_buffer.size(); i++) {
+        orig_buffer_.get()[offset + i] = (uint8_t)(orig_buffer_.get()[offset + i] ^ xor_buffer[i]);
+    }
+}
+
+void SnapuserdVariableBlockSizeTest::ReadSnapshotWithVariableBlockSize() {
+    unique_fd fd(open(dmuser_dev_->GetPath().c_str(), O_RDONLY | O_DIRECT));
+    ASSERT_GE(fd, 0);
+
+    void* addr;
+    ssize_t page_size = getpagesize();
+    ASSERT_EQ(posix_memalign(&addr, page_size, size_), 0);
+    std::unique_ptr<void, decltype(&::free)> snapshot_buffer(addr, ::free);
+
+    const TestParam params = GetParam();
+
+    // Issue I/O request with various block sizes
+    size_t num_blocks = size_ / params.block_size;
+    off_t offset = 0;
+    for (size_t i = 0; i < num_blocks; i++) {
+        ASSERT_EQ(ReadFullyAtOffset(fd, (char*)snapshot_buffer.get() + offset, params.block_size,
+                                    offset),
+                  true);
+        offset += params.block_size;
+    }
+    // Validate buffer
+    ASSERT_EQ(memcmp(snapshot_buffer.get(), orig_buffer_.get(), size_), 0);
+
+    // Reset the buffer
+    std::memset(snapshot_buffer.get(), 0, size_);
+
+    // Read one full chunk in a single shot and re-validate.
+    ASSERT_EQ(ReadFullyAtOffset(fd, snapshot_buffer.get(), size_, 0), true);
+    ASSERT_EQ(memcmp(snapshot_buffer.get(), orig_buffer_.get(), size_), 0);
+
+    // Reset the buffer
+    std::memset(snapshot_buffer.get(), 0, size_);
+
+    // Buffered I/O test
+    fd.reset(open(dmuser_dev_->GetPath().c_str(), O_RDONLY));
+    ASSERT_GE(fd, 0);
+
+    // Try not to cache
+    posix_fadvise(fd.get(), 0, size_, POSIX_FADV_DONTNEED);
+
+    size_t num_blocks_per_op = (size_ / BLOCK_SZ) / 4;
+    offset = num_blocks_per_op * BLOCK_SZ;
+    size_t read_size = 1019;  // bytes
+    offset -= 111;
+
+    // Issue a un-aligned read which crosses the boundary between a REPLACE block and a ZERO
+    // block.
+    ASSERT_EQ(ReadFullyAtOffset(fd, snapshot_buffer.get(), read_size, offset), true);
+
+    // Validate the data
+    ASSERT_EQ(std::memcmp(snapshot_buffer.get(), (char*)orig_buffer_.get() + offset, read_size), 0);
+
+    offset = (num_blocks_per_op * 3) * BLOCK_SZ;
+    offset -= (BLOCK_SZ - 119);
+    read_size = 8111;
+
+    // Issue an un-aligned read which crosses the boundary between a REPLACE block of random
+    // un-compressed data and a XOR block
+    ASSERT_EQ(ReadFullyAtOffset(fd, snapshot_buffer.get(), read_size, offset), true);
+
+    // Validate the data
+    ASSERT_EQ(std::memcmp(snapshot_buffer.get(), (char*)orig_buffer_.get() + offset, read_size), 0);
+
+    // Reset the buffer
+    std::memset(snapshot_buffer.get(), 0, size_);
+
+    // Read just one byte at an odd offset which is a REPLACE op
+    offset = 19;
+    read_size = 1;
+    ASSERT_EQ(ReadFullyAtOffset(fd, snapshot_buffer.get(), read_size, offset), true);
+    // Validate the data
+    ASSERT_EQ(std::memcmp(snapshot_buffer.get(), (char*)orig_buffer_.get() + offset, read_size), 0);
+
+    // Reset the buffer
+    std::memset(snapshot_buffer.get(), 0, size_);
+
+    // Read a block which has no mapping to a COW operation. This read should be
+    // a pass-through to the underlying base device.
+    offset = size_ + 9342;
+    read_size = 30;
+    ASSERT_EQ(ReadFullyAtOffset(fd, snapshot_buffer.get(), read_size, offset), true);
+    // Validate the data
+    ASSERT_EQ(std::memcmp(snapshot_buffer.get(), (char*)orig_buffer_.get() + offset, read_size), 0);
+}
+
+void SnapuserdVariableBlockSizeTest::SetUp() {
+    ASSERT_NO_FATAL_FAILURE(SnapuserdTest::SetUp());
+}
+
+void SnapuserdVariableBlockSizeTest::TearDown() {
+    SnapuserdTest::TearDown();
+}
+
+TEST_P(SnapuserdVariableBlockSizeTest, Snapshot_Test_Variable_Block_Size) {
+    if (!harness_->HasUserDevice()) {
+        GTEST_SKIP() << "Skipping snapshot read; not supported";
+    }
+    ASSERT_NO_FATAL_FAILURE(SetupCowV3ForVariableBlockSize());
+    ASSERT_NO_FATAL_FAILURE(ReadSnapshotWithVariableBlockSize());
+    ASSERT_TRUE(StartMerge());
+    CheckMergeCompletion();
+    ValidateMerge();
+    ASSERT_NO_FATAL_FAILURE(ReadSnapshotWithVariableBlockSize());
+}
+
 class HandlerTest : public SnapuserdTestBase {
   protected:
     void SetUp() override;
     void TearDown() override;
 
+    void SetUpV2Cow();
+    void InitializeDevice();
     AssertionResult ReadSectors(sector_t sector, uint64_t size, void* buffer);
 
     TestBlockServerFactory factory_;
@@ -889,18 +1215,20 @@
     std::future<bool> handler_thread_;
 };
 
-void HandlerTest::SetUp() {
-    ASSERT_NO_FATAL_FAILURE(SnapuserdTestBase::SetUp());
-    ASSERT_NO_FATAL_FAILURE(CreateBaseDevice());
+void HandlerTest::SetUpV2Cow() {
     ASSERT_NO_FATAL_FAILURE(CreateCowDevice());
+}
+
+void HandlerTest::InitializeDevice() {
     ASSERT_NO_FATAL_FAILURE(SetDeviceControlName());
 
     opener_ = factory_.CreateTestOpener(system_device_ctrl_name_);
     ASSERT_NE(opener_, nullptr);
 
+    const TestParam params = GetParam();
     handler_ = std::make_shared<SnapshotHandler>(system_device_ctrl_name_, cow_system_->path,
                                                  base_dev_->GetPath(), base_dev_->GetPath(),
-                                                 opener_, 1, false, false);
+                                                 opener_, 1, false, false, params.o_direct);
     ASSERT_TRUE(handler_->InitCowDevice());
     ASSERT_TRUE(handler_->InitializeWorkers());
 
@@ -913,6 +1241,13 @@
     handler_thread_ = std::async(std::launch::async, &SnapshotHandler::Start, handler_.get());
 }
 
+void HandlerTest::SetUp() {
+    ASSERT_NO_FATAL_FAILURE(SnapuserdTestBase::SetUp());
+    ASSERT_NO_FATAL_FAILURE(CreateBaseDevice());
+    ASSERT_NO_FATAL_FAILURE(SetUpV2Cow());
+    ASSERT_NO_FATAL_FAILURE(InitializeDevice());
+}
+
 void HandlerTest::TearDown() {
     ASSERT_TRUE(factory_.DeleteQueue(system_device_ctrl_name_));
     ASSERT_TRUE(handler_thread_.get());
@@ -978,6 +1313,147 @@
     ASSERT_EQ(memcmp(snapuserd_buffer.get(), orig_buffer_.get(), SECTOR_SIZE), 0);
 }
 
+class HandlerTestV3 : public HandlerTest {
+  public:
+    void ReadSnapshotWithVariableBlockSize();
+
+  protected:
+    void SetUp() override;
+    void TearDown() override;
+    void SetUpV3Cow();
+};
+
+void HandlerTestV3::SetUp() {
+    ASSERT_NO_FATAL_FAILURE(SnapuserdTestBase::SetUp());
+    ASSERT_NO_FATAL_FAILURE(CreateBaseDevice());
+    ASSERT_NO_FATAL_FAILURE(SetUpV3Cow());
+    ASSERT_NO_FATAL_FAILURE(InitializeDevice());
+}
+
+void HandlerTestV3::TearDown() {
+    ASSERT_NO_FATAL_FAILURE(HandlerTest::TearDown());
+}
+
+void HandlerTestV3::SetUpV3Cow() {
+    auto writer = CreateV3Cow();
+
+    size_t total_data_to_write = size_;
+
+    size_t total_blocks_to_write = total_data_to_write / BLOCK_SZ;
+    size_t num_blocks_per_op = total_blocks_to_write / 4;
+    size_t source_block = 0;
+
+    size_t total_replace_blocks = num_blocks_per_op;
+    // Write some data which can be compressed
+    std::string data;
+    data.resize(total_replace_blocks * BLOCK_SZ, '\0');
+    for (size_t i = 0; i < data.size(); i++) {
+        data[i] = static_cast<char>('A' + i / BLOCK_SZ);
+    }
+    // REPLACE ops
+    ASSERT_TRUE(writer->AddRawBlocks(source_block, data.data(), data.size()));
+
+    total_blocks_to_write -= total_replace_blocks;
+    source_block = source_block + total_replace_blocks;
+
+    // ZERO ops
+    size_t total_zero_blocks = total_blocks_to_write / 3;
+    ASSERT_TRUE(writer->AddZeroBlocks(source_block, total_zero_blocks));
+
+    total_blocks_to_write -= total_zero_blocks;
+    source_block = source_block + total_zero_blocks;
+
+    // Generate some random data wherein few blocks cannot be compressed.
+    // This is to test the I/O path for those blocks which aren't compressed.
+    size_t total_random_data_blocks = total_blocks_to_write;
+    unique_fd rnd_fd(open("/dev/random", O_RDONLY));
+
+    ASSERT_GE(rnd_fd, 0);
+    std::string random_buffer;
+    random_buffer.resize(total_random_data_blocks * BLOCK_SZ, '\0');
+    ASSERT_EQ(
+            android::base::ReadFullyAtOffset(rnd_fd, random_buffer.data(), random_buffer.size(), 0),
+            true);
+    // REPLACE ops
+    ASSERT_TRUE(writer->AddRawBlocks(source_block, random_buffer.data(), random_buffer.size()));
+    // Flush operations
+    ASSERT_TRUE(writer->Finalize());
+
+    // Construct the buffer required for validation
+    orig_buffer_ = std::make_unique<uint8_t[]>(total_base_size_);
+
+    // Read the entire base device
+    ASSERT_EQ(android::base::ReadFullyAtOffset(base_fd_, orig_buffer_.get(), total_base_size_, 0),
+              true);
+
+    // REPLACE ops which are compressed
+    std::memcpy(orig_buffer_.get(), data.data(), data.size());
+    size_t offset = data.size();
+
+    // ZERO ops
+    std::string zero_buffer(total_zero_blocks * BLOCK_SZ, 0);
+    std::memcpy((char*)orig_buffer_.get() + offset, (void*)zero_buffer.c_str(), zero_buffer.size());
+    offset += zero_buffer.size();
+
+    // REPLACE ops - Random buffers which aren't compressed
+    std::memcpy((char*)orig_buffer_.get() + offset, random_buffer.c_str(), random_buffer.size());
+}
+
+TEST_P(HandlerTestV3, Read) {
+    std::unique_ptr<uint8_t[]> snapuserd_buffer = std::make_unique<uint8_t[]>(size_);
+
+    size_t read_size = SECTOR_SIZE;
+    off_t offset = 0;
+    // Read the first sector
+    ASSERT_TRUE(ReadSectors(1, read_size, snapuserd_buffer.get()));
+    // Validate the data
+    ASSERT_EQ(std::memcmp(snapuserd_buffer.get(), orig_buffer_.get(), read_size), 0);
+
+    // Read the second block at offset 7680 (Sector 15). This will map to the
+    // first COW operation for variable block size
+    offset += (((BLOCK_SZ * 2) - SECTOR_SIZE));
+    read_size = BLOCK_SZ;  // Span across two REPLACE ops
+    ASSERT_TRUE(ReadSectors(offset / SECTOR_SIZE, read_size, snapuserd_buffer.get()));
+    // Validate the data
+    ASSERT_EQ(std::memcmp(snapuserd_buffer.get(), (char*)orig_buffer_.get() + offset, read_size),
+              0);
+
+    // Fill some other data since we are going to read zero blocks
+    std::memset(snapuserd_buffer.get(), 'Z', size_);
+
+    size_t num_blocks_per_op = (size_ / BLOCK_SZ) / 4;
+    offset = num_blocks_per_op * BLOCK_SZ;
+    // Issue read spanning between a REPLACE op and ZERO ops. The starting point
+    // is the last REPLACE op at sector 5118
+    offset -= (SECTOR_SIZE * 2);
+    // This will make sure it falls back to aligned reads after reading the
+    // first unaligned block
+    read_size = BLOCK_SZ * 6;
+    ASSERT_TRUE(ReadSectors(offset / SECTOR_SIZE, read_size, snapuserd_buffer.get()));
+    // Validate the data
+    ASSERT_EQ(std::memcmp(snapuserd_buffer.get(), (char*)orig_buffer_.get() + offset, read_size),
+              0);
+
+    // Issue I/O request at the last block. The first chunk of (SECTOR_SIZE * 2)
+    // will be from REPLACE op which has random buffers
+    offset = (size_ - (SECTOR_SIZE * 2));
+    // Request will span beyond the COW mapping, thereby fetching data from base
+    // device.
+    read_size = BLOCK_SZ * 8;
+    ASSERT_TRUE(ReadSectors(offset / SECTOR_SIZE, read_size, snapuserd_buffer.get()));
+    // Validate the data
+    ASSERT_EQ(std::memcmp(snapuserd_buffer.get(), (char*)orig_buffer_.get() + offset, read_size),
+              0);
+
+    // Issue I/O request which are not mapped to any COW operations
+    offset = (size_ + (SECTOR_SIZE * 3));
+    read_size = BLOCK_SZ * 3;
+    ASSERT_TRUE(ReadSectors(offset / SECTOR_SIZE, read_size, snapuserd_buffer.get()));
+    // Validate the data
+    ASSERT_EQ(std::memcmp(snapuserd_buffer.get(), (char*)orig_buffer_.get() + offset, read_size),
+              0);
+}
+
 std::vector<bool> GetIoUringConfigs() {
 #if __ANDROID__
     if (!android::base::GetBoolProperty("ro.virtual_ab.io_uring.enabled", false)) {
@@ -990,14 +1466,59 @@
     return {false, true};
 }
 
-std::string IoUringConfigName(const testing::TestParamInfo<SnapuserdTest::ParamType>& info) {
-    return info.param ? "io_uring" : "sync";
+std::vector<TestParam> GetTestConfigs() {
+    std::vector<TestParam> testParams;
+    std::vector<bool> uring_configs = GetIoUringConfigs();
+
+    for (bool config : uring_configs) {
+        TestParam param;
+        param.io_uring = config;
+        param.o_direct = false;
+        testParams.push_back(std::move(param));
+    }
+
+    for (bool config : uring_configs) {
+        TestParam param;
+        param.io_uring = config;
+        param.o_direct = true;
+        testParams.push_back(std::move(param));
+    }
+    return testParams;
 }
 
-INSTANTIATE_TEST_SUITE_P(Io, SnapuserdTest, ::testing::ValuesIn(GetIoUringConfigs()),
-                         IoUringConfigName);
-INSTANTIATE_TEST_SUITE_P(Io, HandlerTest, ::testing::ValuesIn(GetIoUringConfigs()),
-                         IoUringConfigName);
+std::vector<TestParam> GetVariableBlockTestConfigs() {
+    std::vector<TestParam> testParams;
+
+    std::vector<int> block_sizes = {4096, 8192, 16384, 32768, 65536, 131072};
+    std::vector<std::string> compression_algo = {"none", "lz4", "zstd", "gz"};
+    std::vector<int> threads = {1, 2};
+    std::vector<bool> uring_configs = GetIoUringConfigs();
+
+    // This should test 96 combination and validates the I/O path
+    for (auto block : block_sizes) {
+        for (auto compression : compression_algo) {
+            for (auto thread : threads) {
+                for (auto io_uring : uring_configs) {
+                    TestParam param;
+                    param.block_size = block;
+                    param.compression = compression;
+                    param.num_threads = thread;
+                    param.io_uring = io_uring;
+                    param.o_direct = false;
+                    testParams.push_back(std::move(param));
+                }
+            }
+        }
+    }
+
+    return testParams;
+}
+
+INSTANTIATE_TEST_SUITE_P(Io, SnapuserdVariableBlockSizeTest,
+                         ::testing::ValuesIn(GetVariableBlockTestConfigs()));
+INSTANTIATE_TEST_SUITE_P(Io, HandlerTestV3, ::testing::ValuesIn(GetVariableBlockTestConfigs()));
+INSTANTIATE_TEST_SUITE_P(Io, SnapuserdTest, ::testing::ValuesIn(GetTestConfigs()));
+INSTANTIATE_TEST_SUITE_P(Io, HandlerTest, ::testing::ValuesIn(GetTestConfigs()));
 
 }  // namespace snapshot
 }  // namespace android
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_verify.h b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_verify.h
index d07d2f8..7c99085 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_verify.h
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_verify.h
@@ -48,10 +48,27 @@
     std::mutex m_lock_;
     std::condition_variable m_cv_;
 
+    /*
+     * Scanning of partitions is an expensive operation both in terms of memory
+     * and CPU usage. The goal here is to scan the partitions fast enough without
+     * significant increase in the boot time.
+     *
+     * Partitions such as system, product which may be huge and may need multiple
+     * threads to speed up the verification process. Using multiple threads for
+     * all partitions may increase CPU usage significantly. Hence, limit that to
+     * 1 thread per partition.
+     *
+     * These numbers were derived by monitoring the memory and CPU pressure
+     * (/proc/pressure/{cpu,memory}; and monitoring the Inactive(file) and
+     * Active(file) pages from /proc/meminfo.
+     *
+     * Additionally, for low memory devices, it is advisible to use O_DIRECT
+     * fucntionality for source block device.
+     */
     int kMinThreadsToVerify = 1;
-    int kMaxThreadsToVerify = 4;
-    uint64_t kThresholdSize = 512_MiB;
-    uint64_t kBlockSizeVerify = 1_MiB;
+    int kMaxThreadsToVerify = 3;
+    uint64_t kThresholdSize = 750_MiB;
+    uint64_t kBlockSizeVerify = 2_MiB;
 
     bool IsBlockAligned(uint64_t read_size) { return ((read_size & (BLOCK_SZ - 1)) == 0); }
     void UpdatePartitionVerificationState(UpdateVerifyState state);
diff --git a/fs_mgr/libsnapshot/snapuserd/utility.cpp b/fs_mgr/libsnapshot/snapuserd/utility.cpp
index fcdb69d..684ca3d 100644
--- a/fs_mgr/libsnapshot/snapuserd/utility.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/utility.cpp
@@ -19,6 +19,9 @@
 #include <unistd.h>
 
 #include <android-base/file.h>
+#include <processgroup/processgroup.h>
+
+#include <private/android_filesystem_config.h>
 
 namespace android {
 namespace snapshot {
@@ -33,6 +36,17 @@
 #endif
 }
 
+bool SetProfiles([[maybe_unused]] std::initializer_list<std::string_view> profiles) {
+#ifdef __ANDROID__
+    if (setgid(AID_SYSTEM)) {
+        return false;
+    }
+    return SetTaskProfiles(gettid(), profiles);
+#else
+    return true;
+#endif
+}
+
 bool KernelSupportsIoUring() {
     struct utsname uts {};
     unsigned int major, minor;
diff --git a/fs_mgr/libsnapshot/snapuserd/utility.h b/fs_mgr/libsnapshot/snapuserd/utility.h
index 255aee1..c3c3cba 100644
--- a/fs_mgr/libsnapshot/snapuserd/utility.h
+++ b/fs_mgr/libsnapshot/snapuserd/utility.h
@@ -14,10 +14,14 @@
 
 #pragma once
 
+#include <initializer_list>
+#include <string_view>
+
 namespace android {
 namespace snapshot {
 
 bool SetThreadPriority(int priority);
+bool SetProfiles(std::initializer_list<std::string_view> profiles);
 bool KernelSupportsIoUring();
 
 }  // namespace snapshot
diff --git a/fs_mgr/libsnapshot/tools/cow_benchmark.cpp b/fs_mgr/libsnapshot/tools/cow_benchmark.cpp
index 4d5e346..fb463c8 100644
--- a/fs_mgr/libsnapshot/tools/cow_benchmark.cpp
+++ b/fs_mgr/libsnapshot/tools/cow_benchmark.cpp
@@ -78,7 +78,7 @@
 
     for (size_t i = 0; i < compressors.size(); i++) {
         const auto start = std::chrono::steady_clock::now();
-        std::basic_string<uint8_t> compressed_data =
+        std::vector<uint8_t> compressed_data =
                 compressors[i]->Compress(buffer.data(), buffer.size());
         const auto end = std::chrono::steady_clock::now();
         const auto latency =
@@ -141,13 +141,13 @@
     std::vector<std::pair<double, std::string>> ratios;
 
     for (size_t i = 0; i < compressors.size(); i++) {
-        std::vector<std::basic_string<uint8_t>> compressed_data_vec;
+        std::vector<std::vector<uint8_t>> compressed_data_vec;
         int num_blocks = buffer.size() / BLOCK_SZ;
         const uint8_t* iter = reinterpret_cast<const uint8_t*>(buffer.data());
 
         const auto start = std::chrono::steady_clock::now();
         while (num_blocks > 0) {
-            std::basic_string<uint8_t> compressed_data = compressors[i]->Compress(iter, BLOCK_SZ);
+            std::vector<uint8_t> compressed_data = compressors[i]->Compress(iter, BLOCK_SZ);
             compressed_data_vec.emplace_back(compressed_data);
             num_blocks--;
             iter += BLOCK_SZ;
diff --git a/fs_mgr/libsnapshot/vts_ota_config_test.cpp b/fs_mgr/libsnapshot/vts_ota_config_test.cpp
index d387eb3..b5618c4 100755
--- a/fs_mgr/libsnapshot/vts_ota_config_test.cpp
+++ b/fs_mgr/libsnapshot/vts_ota_config_test.cpp
@@ -21,6 +21,7 @@
     return android::base::GetIntProperty("ro.vendor.api_level", -1);
 }
 
+// @VsrTest = 3.7.6
 TEST(VAB, Enabled) {
     if (!android::base::GetBoolProperty("ro.build.ab_update", false) && (GetVsrLevel() < __ANDROID_API_T__)) {
         GTEST_SKIP();
diff --git a/fs_mgr/tests/adb-remount-test.sh b/fs_mgr/tests/adb-remount-test.sh
index c87e564..526c761 100755
--- a/fs_mgr/tests/adb-remount-test.sh
+++ b/fs_mgr/tests/adb-remount-test.sh
@@ -1081,7 +1081,9 @@
 LOG RUN "Testing adb disable-verity -R"
 
 T=$(adb_date)
-adb_su disable-verity -R >&2 ||
+adb_su disable-verity -R >&2
+err=${?}
+[[ ${err} -eq 0 || ${err} -eq 255 ]] ||
   die -t "${T}" "disable-verity -R failed"
 sleep 2
 adb_wait "${ADB_WAIT}" ||
@@ -1192,7 +1194,9 @@
 LOG RUN "Testing adb remount -R"
 
 T=$(adb_date)
-adb_su remount -R </dev/null >&2 ||
+adb_su remount -R </dev/null >&2
+err=${?}
+[[ ${err} -eq 0 || ${err} -eq 255 ]] ||
   die -t "${T}" "adb remount -R failed"
 sleep 2
 adb_wait "${ADB_WAIT}" ||
@@ -1233,6 +1237,12 @@
 adb_sh grep -q " /vendor [^ ]* rw," /proc/mounts </dev/null &&
   die "/vendor is not RO"
 
+data_device=$(adb_sh awk '$2 == "/data" { print $1; exit }' /proc/mounts)
+RO=$(adb_sh grep " ro," /proc/mounts </dev/null |
+    grep -v "^${data_device}" |
+    skip_administrative_mounts |
+    awk '{ print $1 }')
+
 T=$(adb_date)
 adb remount >&2 ||
   die -t "${T}" "adb remount"
@@ -1241,6 +1251,12 @@
 adb_sh grep -q " /vendor [^ ]* rw," /proc/mounts </dev/null ||
   die -t "${T}" "/vendor is not RW"
 
+# Only find mounts that are remounted RO -> RW
+RW=$(adb_sh grep " rw," /proc/mounts </dev/null |
+    grep -v "^${data_device}" |
+    skip_administrative_mounts |
+    grep -E "^($(join_with '|' ${RO})) ")
+
 scratch_on_super=false
 if ${overlayfs_needed}; then
   is_overlayfs_mounted /system ||
@@ -1287,27 +1303,19 @@
     fi
   done
 
-  data_device=$(adb_sh awk '$2 == "/data" { print $1; exit }' /proc/mounts)
   # KISS (we do not support sub-mounts for system partitions currently)
   adb_sh grep "^overlay " /proc/mounts </dev/null |
     grep -vE "^overlay.* /(apex|system|vendor)/[^ ]" |
     grep " overlay ro," &&
     die "expected overlay to be RW after remount"
-  adb_sh grep -v noatime /proc/mounts </dev/null |
-    grep -v "^${data_device}" |
-    skip_administrative_mounts |
-    grep -v ' ro,' &&
-    die "mounts are not noatime"
 
-  D=$(adb_sh grep " rw," /proc/mounts </dev/null |
-      grep -v "^${data_device}" |
-      skip_administrative_mounts |
+  D=$(echo "${RW}" |
       awk '{ print $1 }' |
       sed 's|/dev/root|/|' |
       sort -u)
   if [ -n "${D}" ]; then
     adb_sh df -k ${D} </dev/null |
-      sed -e 's/^Filesystem      /Filesystem (rw) /'
+      sed -e 's/^Filesystem     /Filesystem (rw)/'
   fi >&2
   for d in ${D}; do
     if adb_sh tune2fs -l "${d}" </dev/null 2>&1 | grep -q "Filesystem features:.*shared_blocks" ||
@@ -1319,6 +1327,10 @@
   is_overlayfs_mounted && die -t "${T}" "unexpected overlay takeover"
 fi
 
+echo -n "${RW}" |
+  grep -v noatime &&
+  die "mounts (rw) are not noatime"
+
 LOG OK "adb remount RW"
 
 ################################################################################
diff --git a/fs_mgr/tests/vts_fs_test.cpp b/fs_mgr/tests/vts_fs_test.cpp
index 8f15220..9503072 100644
--- a/fs_mgr/tests/vts_fs_test.cpp
+++ b/fs_mgr/tests/vts_fs_test.cpp
@@ -99,12 +99,7 @@
     ASSERT_TRUE(android::base::Readlink("/dev/block/by-name/super", &super_bdev));
     ASSERT_TRUE(android::base::Readlink("/dev/block/by-name/userdata", &userdata_bdev));
 
-    std::vector<std::string> must_be_f2fs = {"/data"};
-    if (vsr_level >= __ANDROID_API_U__ &&
-        !DeviceSupportsFeature("android.hardware.type.automotive")) {
-        must_be_f2fs.emplace_back("/metadata");
-    }
-
+    std::vector<std::string> data_fs = {"/data", "/metadata"};
     for (const auto& entry : fstab) {
         std::string parent_bdev = entry.blk_device;
         while (true) {
@@ -138,11 +133,10 @@
             std::vector<std::string> allowed = {"erofs", "ext4", "f2fs"};
             EXPECT_NE(std::find(allowed.begin(), allowed.end(), entry.fs_type), allowed.end())
                     << entry.mount_point;
-        } else {
-            if (std::find(must_be_f2fs.begin(), must_be_f2fs.end(), entry.mount_point) !=
-                must_be_f2fs.end()) {
-                EXPECT_EQ(entry.fs_type, "f2fs") << entry.mount_point;
-            }
+        } else if (std::find(data_fs.begin(), data_fs.end(), entry.mount_point) != data_fs.end()) {
+            std::vector<std::string> allowed = {"ext4", "f2fs"};
+            EXPECT_NE(std::find(allowed.begin(), allowed.end(), entry.fs_type), allowed.end())
+                    << entry.mount_point << ", " << entry.fs_type;
         }
     }
 }
diff --git a/fs_mgr/tools/dmctl.cpp b/fs_mgr/tools/dmctl.cpp
index 7273087..f843821 100644
--- a/fs_mgr/tools/dmctl.cpp
+++ b/fs_mgr/tools/dmctl.cpp
@@ -52,6 +52,7 @@
     std::cerr << "  list <devices | targets> [-v]" << std::endl;
     std::cerr << "  getpath <dm-name>" << std::endl;
     std::cerr << "  getuuid <dm-name>" << std::endl;
+    std::cerr << "  ima <dm-name>" << std::endl;
     std::cerr << "  info <dm-name>" << std::endl;
     std::cerr << "  replace <dm-name> <targets...>" << std::endl;
     std::cerr << "  status <dm-name>" << std::endl;
@@ -115,6 +116,21 @@
             std::string block_device = NextArg();
             return std::make_unique<DmTargetAndroidVerity>(start_sector, num_sectors, keyid,
                                                            block_device);
+        } else if (target_type == "striped") {
+            if (!HasArgs(3)) {
+                std::cerr << "Expected \"striped\" <block_device0> <block_device1> <chunksize>"
+                          << std::endl;
+                return nullptr;
+            }
+            std::string block_device0 = NextArg();
+            std::string block_device1 = NextArg();
+            uint64_t chunk_size;
+            if (!android::base::ParseUint(NextArg(), &chunk_size)) {
+                std::cerr << "Expected start sector, got: " << PreviousArg() << std::endl;
+                return nullptr;
+            }
+            return std::make_unique<DmTargetStripe>(start_sector, num_sectors, chunk_size,
+                                                    block_device0, block_device1);
         } else if (target_type == "bow") {
             if (!HasArgs(1)) {
                 std::cerr << "Expected \"bow\" <block_device>" << std::endl;
@@ -493,7 +509,14 @@
                       << std::endl;
             return -EINVAL;
         }
+    } else if (mode == "ima") {
+        if (!dm.GetTableStatusIma(argv[0], &table)) {
+            std::cerr << "Could not query table status of device \"" << argv[0] << "\"."
+                      << std::endl;
+            return -EINVAL;
+        }
     }
+
     std::cout << "Targets in the device-mapper table for " << argv[0] << ":" << std::endl;
     for (const auto& target : table) {
         std::cout << target.spec.sector_start << "-"
@@ -515,6 +538,10 @@
     return DumpTable("status", argc, argv);
 }
 
+static int ImaCmdHandler(int argc, char** argv) {
+    return DumpTable("ima", argc, argv);
+}
+
 static int ResumeCmdHandler(int argc, char** argv) {
     if (argc != 1) {
         std::cerr << "Invalid arguments, see \'dmctl help\'" << std::endl;
@@ -555,6 +582,7 @@
         {"info", InfoCmdHandler},
         {"table", TableCmdHandler},
         {"status", StatusCmdHandler},
+        {"ima", ImaCmdHandler},
         {"resume", ResumeCmdHandler},
         {"suspend", SuspendCmdHandler},
         // clang-format on
diff --git a/healthd/Android.bp b/healthd/Android.bp
index 235303f..e158e07 100644
--- a/healthd/Android.bp
+++ b/healthd/Android.bp
@@ -76,7 +76,7 @@
     defaults: ["libbatterymonitor_defaults"],
     srcs: ["BatteryMonitor.cpp"],
     static_libs: [
-        "android.hardware.health-V2-ndk",
+        "android.hardware.health-V3-ndk",
     ],
     whole_static_libs: [
         // Need to translate HIDL to AIDL to support legacy APIs in
@@ -100,44 +100,6 @@
     ],
 }
 
-cc_defaults {
-    name: "android.hardware.health@2.0-service_defaults",
-
-    cflags: [
-        "-Wall",
-        "-Werror",
-    ],
-
-    static_libs: [
-        "android.hardware.health@2.0-impl",
-        "android.hardware.health@1.0-convert",
-        "libhealthservice",
-        "libhealthstoragedefault",
-        "libbatterymonitor",
-    ],
-
-    shared_libs: [
-        "libbase",
-        "libcutils",
-        "libhidlbase",
-        "liblog",
-        "libutils",
-        "android.hardware.health@2.0",
-    ],
-}
-
-cc_binary {
-    name: "android.hardware.health@2.0-service",
-    defaults: ["android.hardware.health@2.0-service_defaults"],
-
-    vendor: true,
-    relative_install_path: "hw",
-    init_rc: ["android.hardware.health@2.0-service.rc"],
-    srcs: [
-        "HealthServiceDefault.cpp",
-    ],
-}
-
 cc_library_static {
     name: "libhealthd_charger_nops",
     recovery_available: true,
@@ -203,12 +165,12 @@
     defaults: ["libhealthd_charger_ui_defaults"],
 
     static_libs: [
-        "android.hardware.health-V2-ndk",
+        "android.hardware.health-V3-ndk",
         "android.hardware.health-translate-ndk",
     ],
 
     export_static_lib_headers: [
-        "android.hardware.health-V2-ndk",
+        "android.hardware.health-V3-ndk",
     ],
 }
 
@@ -280,7 +242,7 @@
     static_libs: [
         // common
         "android.hardware.health@1.0-convert",
-        "android.hardware.health-V2-ndk",
+        "android.hardware.health-V3-ndk",
         "libbatterymonitor",
         "libcharger_sysprop",
         "libhealthd_charger_nops",
diff --git a/healthd/BatteryMonitor.cpp b/healthd/BatteryMonitor.cpp
index 0c97632..b8bb586 100644
--- a/healthd/BatteryMonitor.cpp
+++ b/healthd/BatteryMonitor.cpp
@@ -59,6 +59,7 @@
 using aidl::android::hardware::health::BatteryChargingState;
 using aidl::android::hardware::health::BatteryHealth;
 using aidl::android::hardware::health::BatteryHealthData;
+using aidl::android::hardware::health::BatteryPartStatus;
 using aidl::android::hardware::health::BatteryStatus;
 using aidl::android::hardware::health::HealthInfo;
 
@@ -219,6 +220,7 @@
             {"Warm", BatteryHealth::GOOD},
             {"Cool", BatteryHealth::GOOD},
             {"Hot", BatteryHealth::OVERHEAT},
+            {"Calibration required", BatteryHealth::INCONSISTENT},
             {NULL, BatteryHealth::UNKNOWN},
     };
 
@@ -596,6 +598,9 @@
         if (!mHealthdConfig->batteryStateOfHealthPath.empty())
             return getIntField(mHealthdConfig->batteryStateOfHealthPath);
     }
+    if (id == BATTERY_PROP_PART_STATUS) {
+        return static_cast<int>(BatteryPartStatus::UNSUPPORTED);
+    }
     return 0;
 }
 
@@ -679,6 +684,11 @@
         ret = OK;
         break;
 
+    case BATTERY_PROP_PART_STATUS:
+        val->valueInt64 = getBatteryHealthData(BATTERY_PROP_PART_STATUS);
+        ret = OK;
+        break;
+
     default:
         break;
     }
@@ -686,6 +696,11 @@
     return ret;
 }
 
+status_t BatteryMonitor::getSerialNumber(std::optional<std::string>* out) {
+    *out = std::nullopt;
+    return OK;
+}
+
 void BatteryMonitor::dumpState(int fd) {
     int v;
     char vs[128];
diff --git a/healthd/HealthServiceDefault.cpp b/healthd/HealthServiceDefault.cpp
deleted file mode 100644
index 89ecc2f..0000000
--- a/healthd/HealthServiceDefault.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-#include <health2/service.h>
-#include <healthd/healthd.h>
-
-void healthd_board_init(struct healthd_config*) {
-    // Implementation-defined init logic goes here.
-    // 1. config->periodic_chores_interval_* variables
-    // 2. config->battery*Path variables
-    // 3. config->energyCounter. In this implementation, energyCounter is not defined.
-
-    // use defaults
-}
-
-int healthd_board_battery_update(struct android::BatteryProperties*) {
-    // Implementation-defined update logic goes here. An implementation
-    // can make modifications to prop before broadcasting it to all callbacks.
-
-    // return 0 to log periodic polled battery status to kernel log
-    return 0;
-}
-
-int main() {
-    return health_service_main();
-}
diff --git a/healthd/android.hardware.health@2.0-service.rc b/healthd/android.hardware.health@2.0-service.rc
deleted file mode 100644
index 762771e..0000000
--- a/healthd/android.hardware.health@2.0-service.rc
+++ /dev/null
@@ -1,6 +0,0 @@
-service health-hal-2-0 /vendor/bin/hw/android.hardware.health@2.0-service
-    class hal
-    user system
-    group system
-    capabilities WAKE_ALARM BLOCK_SUSPEND
-    file /dev/kmsg w
diff --git a/healthd/include/healthd/BatteryMonitor.h b/healthd/include/healthd/BatteryMonitor.h
index e9998ba..b30458d 100644
--- a/healthd/include/healthd/BatteryMonitor.h
+++ b/healthd/include/healthd/BatteryMonitor.h
@@ -18,6 +18,7 @@
 #define HEALTHD_BATTERYMONITOR_H
 
 #include <memory>
+#include <optional>
 
 #include <batteryservice/BatteryService.h>
 #include <utils/String8.h>
@@ -86,6 +87,8 @@
     int getChargingPolicy();
     int getBatteryHealthData(int id);
 
+    status_t getSerialNumber(std::optional<std::string>* out);
+
     static void logValues(const android::hardware::health::V2_1::HealthInfo& health_info,
                           const struct healthd_config& healthd_config);
 
diff --git a/init/Android.bp b/init/Android.bp
index e5512e6..12ca15a 100644
--- a/init/Android.bp
+++ b/init/Android.bp
@@ -88,7 +88,6 @@
 init_host_sources = [
     "check_builtins.cpp",
     "host_import_parser.cpp",
-    "host_init_verifier.cpp",
 ]
 
 soong_config_module_type {
@@ -163,6 +162,7 @@
     },
     static_libs: [
         "libavb",
+        "libavf_cc_flags",
         "libbootloader_message",
         "libc++fs",
         "libcgrouprc_format",
@@ -188,7 +188,6 @@
         "libfs_mgr",
         "libgsi",
         "libhidl-gen-utils",
-        "libkeyutils",
         "liblog",
         "liblogwrap",
         "liblp",
@@ -197,6 +196,7 @@
         "libselinux",
         "libunwindstack",
         "libutils",
+        "libvendorsupport",
     ],
     header_libs: ["bionic_libc_platform_headers"],
     bootstrap: true,
@@ -321,7 +321,6 @@
     visibility: ["//packages/modules/Virtualization/microdroid"],
 }
 
-
 soong_config_module_type {
     name: "init_first_stage_cc_defaults",
     module_type: "cc_defaults",
@@ -361,6 +360,7 @@
     static_libs: [
         "libc++fs",
         "libfs_avb",
+        "libavf_cc_flags",
         "libfs_mgr",
         "libfec",
         "libfec_rs",
@@ -461,7 +461,10 @@
 
 cc_binary {
     name: "init_first_stage.microdroid",
-    defaults: ["init_first_stage_defaults"],
+    defaults: [
+        "avf_build_flags_cc",
+        "init_first_stage_defaults",
+    ],
     cflags: ["-DMICRODROID=1"],
     installable: false,
 }
@@ -475,6 +478,7 @@
 // ------------------------------------------------------------------------------
 
 cc_test {
+    // Note: This is NOT a CTS test. See b/320800872
     name: "CtsInitTestCases",
     defaults: ["init_defaults"],
     require_root: true,
@@ -507,7 +511,6 @@
     ],
 
     test_suites: [
-        "cts",
         "device-tests",
     ],
 }
@@ -599,7 +602,6 @@
     },
     generated_headers: [
         "generated_stub_builtin_function_map",
-        "generated_android_ids",
     ],
     target: {
         android: {
@@ -614,13 +616,16 @@
 cc_binary {
     name: "host_init_verifier",
     defaults: ["init_host_defaults"],
-    srcs: init_common_sources + init_host_sources,
+    srcs: ["host_init_verifier.cpp"] + init_common_sources + init_host_sources,
+    generated_headers: [
+        "generated_android_ids",
+    ],
 }
 
 cc_library_host_static {
     name: "libinit_host",
     defaults: ["init_host_defaults"],
-    srcs: init_common_sources,
+    srcs: init_common_sources + init_host_sources,
     export_include_dirs: ["."],
     proto: {
         export_proto_headers: true,
diff --git a/init/block_dev_initializer.cpp b/init/block_dev_initializer.cpp
index 05e00ed..a686d05 100644
--- a/init/block_dev_initializer.cpp
+++ b/init/block_dev_initializer.cpp
@@ -132,11 +132,19 @@
 bool BlockDevInitializer::InitDmDevice(const std::string& device) {
     const std::string device_name(basename(device.c_str()));
     const std::string syspath = "/sys/block/" + device_name;
+    return InitDevice(syspath, device_name);
+}
+
+bool BlockDevInitializer::InitPlatformDevice(const std::string& dev_name) {
+    return InitDevice("/sys/devices/platform", dev_name);
+}
+
+bool BlockDevInitializer::InitDevice(const std::string& syspath, const std::string& device_name) {
     bool found = false;
 
-    auto uevent_callback = [&device_name, &device, this, &found](const Uevent& uevent) {
+    auto uevent_callback = [&device_name, this, &found](const Uevent& uevent) {
         if (uevent.device_name == device_name) {
-            LOG(VERBOSE) << "Creating device-mapper device : " << device;
+            LOG(VERBOSE) << "Creating device : " << device_name;
             device_handler_->HandleUevent(uevent);
             found = true;
             return ListenerAction::kStop;
@@ -146,13 +154,13 @@
 
     uevent_listener_.RegenerateUeventsForPath(syspath, uevent_callback);
     if (!found) {
-        LOG(INFO) << "dm device '" << device << "' not found in /sys, waiting for its uevent";
+        LOG(INFO) << "device '" << device_name << "' not found in /sys, waiting for its uevent";
         Timer t;
         uevent_listener_.Poll(uevent_callback, 10s);
-        LOG(INFO) << "wait for dm device '" << device << "' returned after " << t;
+        LOG(INFO) << "wait for device '" << device_name << "' returned after " << t;
     }
     if (!found) {
-        LOG(ERROR) << "dm device '" << device << "' not found after polling timeout";
+        LOG(ERROR) << "device '" << device_name << "' not found after polling timeout";
         return false;
     }
     return true;
diff --git a/init/block_dev_initializer.h b/init/block_dev_initializer.h
index ec39ce0..d5b1f60 100644
--- a/init/block_dev_initializer.h
+++ b/init/block_dev_initializer.h
@@ -24,6 +24,7 @@
 namespace android {
 namespace init {
 
+// TODO: should this be renamed to FirstStageDevInitialize?
 class BlockDevInitializer final {
   public:
     BlockDevInitializer();
@@ -32,11 +33,13 @@
     bool InitDmUser(const std::string& name);
     bool InitDevices(std::set<std::string> devices);
     bool InitDmDevice(const std::string& device);
+    bool InitPlatformDevice(const std::string& device);
 
   private:
     ListenerAction HandleUevent(const Uevent& uevent, std::set<std::string>* devices);
 
     bool InitMiscDevice(const std::string& name);
+    bool InitDevice(const std::string& syspath, const std::string& device);
 
     std::unique_ptr<DeviceHandler> device_handler_;
     UeventListener uevent_listener_;
diff --git a/init/builtins.cpp b/init/builtins.cpp
index a95a4a3..606ea8c 100644
--- a/init/builtins.cpp
+++ b/init/builtins.cpp
@@ -592,9 +592,6 @@
     } else if (code == FS_MGR_MNTALL_DEV_FILE_ENCRYPTED ||
                code == FS_MGR_MNTALL_DEV_IS_METADATA_ENCRYPTED ||
                code == FS_MGR_MNTALL_DEV_NEEDS_METADATA_ENCRYPTION) {
-        if (!FscryptInstallKeyring()) {
-            return Error() << "FscryptInstallKeyring() failed";
-        }
         SetProperty("ro.crypto.state", "encrypted");
 
         // Although encrypted, vold has already set the device up, so we do not need to
diff --git a/init/check_builtins.cpp b/init/check_builtins.cpp
index 461ed22..9725458 100644
--- a/init/check_builtins.cpp
+++ b/init/check_builtins.cpp
@@ -28,9 +28,9 @@
 #include <android-base/parsedouble.h>
 #include <android-base/parseint.h>
 #include <android-base/strings.h>
+#include <property_info_parser/property_info_parser.h>
 
 #include "builtin_arguments.h"
-#include "host_init_verifier.h"
 #include "interface_utils.h"
 #include "property_type.h"
 #include "rlimit_parser.h"
@@ -39,6 +39,9 @@
 
 using android::base::ParseInt;
 using android::base::StartsWith;
+using android::properties::BuildTrie;
+using android::properties::PropertyInfoArea;
+using android::properties::PropertyInfoEntry;
 
 #define ReturnIfAnyArgsEmpty()     \
     for (const auto& arg : args) { \
@@ -50,6 +53,26 @@
 namespace android {
 namespace init {
 
+const PropertyInfoArea* property_info_area;
+
+Result<void> InitializeHostPropertyInfoArea(const std::vector<PropertyInfoEntry>& property_infos) {
+    static std::string serialized_contexts;
+    std::string trie_error;
+    if (!BuildTrie(property_infos, "u:object_r:default_prop:s0", "string", &serialized_contexts,
+                   &trie_error)) {
+        return Error() << "Unable to serialize property contexts: " << trie_error;
+    }
+
+    property_info_area = reinterpret_cast<const PropertyInfoArea*>(serialized_contexts.c_str());
+    return {};
+}
+
+static Result<void> check_stub(const BuiltinArguments& args) {
+    return {};
+}
+
+#include "generated_stub_builtin_function_map.h"
+
 Result<void> check_chown(const BuiltinArguments& args) {
     if (!args[1].empty()) {
         auto uid = DecodeUid(args[1]);
diff --git a/init/check_builtins.h b/init/check_builtins.h
index dc1b752..9b00a7c 100644
--- a/init/check_builtins.h
+++ b/init/check_builtins.h
@@ -19,6 +19,10 @@
 #include "builtin_arguments.h"
 #include "result.h"
 
+#include <vector>
+
+#include <property_info_serializer/property_info_serializer.h>
+
 namespace android {
 namespace init {
 
@@ -43,5 +47,8 @@
 Result<void> check_wait(const BuiltinArguments& args);
 Result<void> check_wait_for_prop(const BuiltinArguments& args);
 
+Result<void> InitializeHostPropertyInfoArea(
+        const std::vector<properties::PropertyInfoEntry>& property_infos);
+
 }  // namespace init
 }  // namespace android
diff --git a/init/first_stage_console.cpp b/init/first_stage_console.cpp
index 67cac19..f6f9329 100644
--- a/init/first_stage_console.cpp
+++ b/init/first_stage_console.cpp
@@ -16,6 +16,7 @@
 
 #include "first_stage_console.h"
 
+#include <spawn.h>
 #include <stdio.h>
 #include <sys/stat.h>
 #include <sys/sysmacros.h>
@@ -65,19 +66,20 @@
     return true;
 }
 
-static void RunScript() {
-    LOG(INFO) << "Attempting to run /first_stage.sh...";
-    pid_t pid = fork();
-    if (pid != 0) {
-        int status;
-        waitpid(pid, &status, 0);
-        LOG(INFO) << "/first_stage.sh exited with status " << status;
-        return;
-    }
-    const char* path = "/system/bin/sh";
-    const char* args[] = {path, "/first_stage.sh", nullptr};
-    int rv = execv(path, const_cast<char**>(args));
-    LOG(ERROR) << "unable to execv /first_stage.sh, returned " << rv << " errno " << errno;
+static pid_t SpawnImage(const char* file) {
+    const char* argv[] = {file, NULL};
+    const char* envp[] = {NULL};
+
+    char* const* argvp = const_cast<char* const*>(argv);
+    char* const* envpp = const_cast<char* const*>(envp);
+
+    pid_t pid;
+    errno = posix_spawn(&pid, argv[0], NULL, NULL, argvp, envpp);
+    if (!errno) return pid;
+
+    PLOG(ERROR) << "Failed to spawn '" << file << "'";
+
+    return (pid_t)0;
 }
 
 namespace android {
@@ -86,24 +88,28 @@
 void StartConsole(const std::string& cmdline) {
     bool console = KernelConsolePresent(cmdline);
     // Use a simple sigchld handler -- first_stage_console doesn't need to track or log zombies
-    const struct sigaction chld_act { .sa_handler = SIG_DFL, .sa_flags = SA_NOCLDWAIT };
+    const struct sigaction chld_act {
+        .sa_flags = SA_NOCLDWAIT, .sa_handler = SIG_DFL
+    };
 
     sigaction(SIGCHLD, &chld_act, nullptr);
     pid_t pid = fork();
     if (pid != 0) {
-        int status;
-        waitpid(pid, &status, 0);
-        LOG(ERROR) << "console shell exited with status " << status;
+        wait(NULL);
+        LOG(ERROR) << "console shell exited";
         return;
     }
 
     if (console) console = SetupConsole();
-    RunScript();
+
+    LOG(INFO) << "Attempting to run /first_stage.sh...";
+    if (SpawnImage("/first_stage.sh")) {
+        wait(NULL);
+        LOG(INFO) << "/first_stage.sh exited";
+    }
+
     if (console) {
-        const char* path = "/system/bin/sh";
-        const char* args[] = {path, nullptr};
-        int rv = execv(path, const_cast<char**>(args));
-        LOG(ERROR) << "unable to execv, returned " << rv << " errno " << errno;
+        if (SpawnImage("/system/bin/sh")) wait(NULL);
     }
     _exit(127);
 }
diff --git a/init/first_stage_init.cpp b/init/first_stage_init.cpp
index e48fa15..356aaa0 100644
--- a/init/first_stage_init.cpp
+++ b/init/first_stage_init.cpp
@@ -30,12 +30,14 @@
 #include <chrono>
 #include <filesystem>
 #include <string>
+#include <thread>
 #include <vector>
 
 #include <android-base/chrono_utils.h>
 #include <android-base/file.h>
 #include <android-base/logging.h>
 #include <android-base/stringprintf.h>
+#include <android/avf_cc_flags.h>
 #include <modprobe/modprobe.h>
 #include <private/android_filesystem_config.h>
 
@@ -384,7 +386,12 @@
     // /second_stage_resources is used to preserve files from first to second
     // stage init
     CHECKCALL(mount("tmpfs", kSecondStageRes, "tmpfs", MS_NOEXEC | MS_NOSUID | MS_NODEV,
-                    "mode=0755,uid=0,gid=0"))
+                    "mode=0755,uid=0,gid=0"));
+
+    if (IsMicrodroid() && android::virtualization::IsOpenDiceChangesFlagEnabled()) {
+        CHECKCALL(mount("tmpfs", "/microdroid_resources", "tmpfs", MS_NOEXEC | MS_NOSUID | MS_NODEV,
+                        "mode=0750,uid=0,gid=0"));
+    }
 #undef CHECKCALL
 
     SetStdioToDevNull(argv);
diff --git a/init/first_stage_mount.cpp b/init/first_stage_mount.cpp
index d0f68a8..836d536 100644
--- a/init/first_stage_mount.cpp
+++ b/init/first_stage_mount.cpp
@@ -16,6 +16,7 @@
 
 #include "first_stage_mount.h"
 
+#include <signal.h>
 #include <stdlib.h>
 #include <sys/mount.h>
 #include <unistd.h>
@@ -33,6 +34,7 @@
 #include <android-base/logging.h>
 #include <android-base/stringprintf.h>
 #include <android-base/strings.h>
+#include <android/avf_cc_flags.h>
 #include <fs_avb/fs_avb.h>
 #include <fs_mgr.h>
 #include <fs_mgr_dm_linear.h>
@@ -272,6 +274,11 @@
     return true;
 }
 
+// TODO: should this be in a library in packages/modules/Virtualization first_stage_init links?
+static bool IsMicrodroidStrictBoot() {
+    return access("/proc/device-tree/chosen/avf,strict-boot", F_OK) == 0;
+}
+
 bool FirstStageMountVBootV2::InitDevices() {
     std::set<std::string> devices;
     GetSuperDeviceName(&devices);
@@ -283,6 +290,14 @@
         return false;
     }
 
+    if (IsMicrodroid() && android::virtualization::IsOpenDiceChangesFlagEnabled()) {
+        if (IsMicrodroidStrictBoot()) {
+            if (!block_dev_init_.InitPlatformDevice("open-dice0")) {
+                return false;
+            }
+        }
+    }
+
     if (IsDmLinearEnabled()) {
         auto super_symlink = "/dev/block/by-name/"s + super_partition_name_;
         if (!android::base::Realpath(super_symlink, &super_path_)) {
@@ -527,9 +542,48 @@
     return true;
 }
 
+static bool MaybeDeriveMicrodroidVendorDiceNode(Fstab* fstab) {
+    std::optional<std::string> microdroid_vendor_block_dev;
+    for (auto entry = fstab->begin(); entry != fstab->end(); entry++) {
+        if (entry->mount_point == "/vendor") {
+            microdroid_vendor_block_dev.emplace(entry->blk_device);
+            break;
+        }
+    }
+    if (!microdroid_vendor_block_dev.has_value()) {
+        LOG(VERBOSE) << "No microdroid vendor partition to mount";
+        return true;
+    }
+    // clang-format off
+    const std::array<const char*, 7> args = {
+        "/system/bin/derive_microdroid_vendor_dice_node",
+                "--dice-driver", "/dev/open-dice0",
+                "--microdroid-vendor-disk-image", microdroid_vendor_block_dev->data(),
+                "--output", "/microdroid_resources/dice_chain.raw",
+    };
+    // clang-format-on
+    // ForkExecveAndWaitForCompletion calls waitpid to wait for the fork-ed process to finish.
+    // The first_stage_console adds SA_NOCLDWAIT flag to the SIGCHLD handler, which means that
+    // waitpid will always return -ECHLD. Here we re-register a default handler, so that waitpid
+    // works.
+    LOG(INFO) << "Deriving dice node for microdroid vendor partition";
+    signal(SIGCHLD, SIG_DFL);
+    if (!ForkExecveAndWaitForCompletion(args[0], (char**)args.data())) {
+        LOG(ERROR) << "Failed to derive microdroid vendor dice node";
+        return false;
+    }
+    return true;
+}
+
 bool FirstStageMountVBootV2::MountPartitions() {
     if (!TrySwitchSystemAsRoot()) return false;
 
+    if (IsMicrodroid() && android::virtualization::IsOpenDiceChangesFlagEnabled()) {
+        if (!MaybeDeriveMicrodroidVendorDiceNode(&fstab_)) {
+            return false;
+        }
+    }
+
     if (!SkipMountingPartitions(&fstab_, true /* verbose */)) return false;
 
     for (auto current = fstab_.begin(); current != fstab_.end();) {
@@ -732,6 +786,15 @@
     return true;
 }
 
+bool IsHashtreeDisabled(const AvbHandle& vbmeta, const std::string& mount_point) {
+    if (vbmeta.status() == AvbHandleStatus::kHashtreeDisabled ||
+        vbmeta.status() == AvbHandleStatus::kVerificationDisabled) {
+        LOG(ERROR) << "Top-level vbmeta is disabled, skip Hashtree setup for " << mount_point;
+        return true;  // Returns true to mount the partition directly.
+    }
+    return false;
+}
+
 bool FirstStageMountVBootV2::SetUpDmVerity(FstabEntry* fstab_entry) {
     AvbHashtreeResult hashtree_result;
 
@@ -740,34 +803,46 @@
     if (!fstab_entry->avb_keys.empty()) {
         if (!InitAvbHandle()) return false;
         // Checks if hashtree should be disabled from the top-level /vbmeta.
-        if (avb_handle_->status() == AvbHandleStatus::kHashtreeDisabled ||
-            avb_handle_->status() == AvbHandleStatus::kVerificationDisabled) {
-            LOG(ERROR) << "Top-level vbmeta is disabled, skip Hashtree setup for "
-                       << fstab_entry->mount_point;
-            return true;  // Returns true to mount the partition directly.
+        if (IsHashtreeDisabled(*avb_handle_, fstab_entry->mount_point)) {
+            return true;
+        }
+        auto avb_standalone_handle = AvbHandle::LoadAndVerifyVbmeta(
+                *fstab_entry, preload_avb_key_blobs_[fstab_entry->avb_keys]);
+        if (!avb_standalone_handle) {
+            LOG(ERROR) << "Failed to load offline vbmeta for " << fstab_entry->mount_point;
+            // Fallbacks to built-in hashtree if fs_mgr_flags.avb is set.
+            if (!fstab_entry->fs_mgr_flags.avb) return false;
+            LOG(INFO) << "Fallback to built-in hashtree for " << fstab_entry->mount_point;
+            hashtree_result =
+                    avb_handle_->SetUpAvbHashtree(fstab_entry, false /* wait_for_verity_dev */);
         } else {
-            auto avb_standalone_handle = AvbHandle::LoadAndVerifyVbmeta(
-                    *fstab_entry, preload_avb_key_blobs_[fstab_entry->avb_keys]);
-            if (!avb_standalone_handle) {
-                LOG(ERROR) << "Failed to load offline vbmeta for " << fstab_entry->mount_point;
-                // Fallbacks to built-in hashtree if fs_mgr_flags.avb is set.
-                if (!fstab_entry->fs_mgr_flags.avb) return false;
-                LOG(INFO) << "Fallback to built-in hashtree for " << fstab_entry->mount_point;
-                hashtree_result =
-                        avb_handle_->SetUpAvbHashtree(fstab_entry, false /* wait_for_verity_dev */);
-            } else {
-                // Sets up hashtree via the standalone handle.
-                if (IsStandaloneImageRollback(*avb_handle_, *avb_standalone_handle, *fstab_entry)) {
-                    return false;
-                }
-                hashtree_result = avb_standalone_handle->SetUpAvbHashtree(
-                        fstab_entry, false /* wait_for_verity_dev */);
+            // Sets up hashtree via the standalone handle.
+            if (IsStandaloneImageRollback(*avb_handle_, *avb_standalone_handle, *fstab_entry)) {
+                return false;
             }
+            hashtree_result = avb_standalone_handle->SetUpAvbHashtree(
+                    fstab_entry, false /* wait_for_verity_dev */);
         }
     } else if (fstab_entry->fs_mgr_flags.avb) {
         if (!InitAvbHandle()) return false;
         hashtree_result =
                 avb_handle_->SetUpAvbHashtree(fstab_entry, false /* wait_for_verity_dev */);
+    } else if (!fstab_entry->avb_hashtree_digest.empty()) {
+        // When fstab_entry has neither avb_keys nor avb flag, try using
+        // avb_hashtree_digest.
+        if (!InitAvbHandle()) return false;
+        // Checks if hashtree should be disabled from the top-level /vbmeta.
+        if (IsHashtreeDisabled(*avb_handle_, fstab_entry->mount_point)) {
+            return true;
+        }
+        auto avb_standalone_handle = AvbHandle::LoadAndVerifyVbmeta(*fstab_entry);
+        if (!avb_standalone_handle) {
+            LOG(ERROR) << "Failed to load vbmeta based on hashtree descriptor root digest for "
+                       << fstab_entry->mount_point;
+            return false;
+        }
+        hashtree_result = avb_standalone_handle->SetUpAvbHashtree(fstab_entry,
+                                                                  false /* wait_for_verity_dev */);
     } else {
         return true;  // No need AVB, returns true to mount the partition directly.
     }
diff --git a/init/fscrypt_init_extensions.cpp b/init/fscrypt_init_extensions.cpp
index fbd8189..6a561e5 100644
--- a/init/fscrypt_init_extensions.cpp
+++ b/init/fscrypt_init_extensions.cpp
@@ -34,28 +34,12 @@
 #include <cutils/properties.h>
 #include <cutils/sockets.h>
 #include <fscrypt/fscrypt.h>
-#include <keyutils.h>
 #include <logwrap/logwrap.h>
 
 #define TAG "fscrypt"
 
 using namespace android::fscrypt;
 
-bool FscryptInstallKeyring() {
-    if (keyctl_search(KEY_SPEC_SESSION_KEYRING, "keyring", "fscrypt", 0) != -1) {
-        LOG(INFO) << "Keyring is already created";
-        return true;
-    }
-    key_serial_t device_keyring = add_key("keyring", "fscrypt", 0, 0, KEY_SPEC_SESSION_KEYRING);
-
-    if (device_keyring == -1) {
-        PLOG(ERROR) << "Failed to create keyring";
-        return false;
-    }
-    LOG(INFO) << "Keyring created with id " << device_keyring << " in process " << getpid();
-    return true;
-}
-
 // TODO(b/139378601): use a single central implementation of this.
 static void delete_dir_contents(const std::string& dir) {
     char* const paths[2] = {const_cast<char*>(dir.c_str()), nullptr};
diff --git a/init/fscrypt_init_extensions.h b/init/fscrypt_init_extensions.h
index d357bb2..5e0269a 100644
--- a/init/fscrypt_init_extensions.h
+++ b/init/fscrypt_init_extensions.h
@@ -25,6 +25,5 @@
     kDeleteIfNecessary,
 };
 
-bool FscryptInstallKeyring();
 bool FscryptSetDirectoryPolicy(const std::string& ref_basename, FscryptAction action,
                                const std::string& dir);
diff --git a/init/fuzzer/Android.bp b/init/fuzzer/Android.bp
index 856ca8c..9916246 100644
--- a/init/fuzzer/Android.bp
+++ b/init/fuzzer/Android.bp
@@ -32,7 +32,6 @@
         "libbase",
         "libfs_mgr",
         "libhidl-gen-utils",
-        "libkeyutils",
         "liblog",
         "libprocessgroup",
         "libselinux",
diff --git a/init/host_init_verifier.cpp b/init/host_init_verifier.cpp
index 662185c..f746ab9 100644
--- a/init/host_init_verifier.cpp
+++ b/init/host_init_verifier.cpp
@@ -14,8 +14,6 @@
 // limitations under the License.
 //
 
-#include "host_init_verifier.h"
-
 #include <errno.h>
 #include <getopt.h>
 #include <pwd.h>
@@ -36,6 +34,7 @@
 #include <android-base/strings.h>
 #include <generated_android_ids.h>
 #include <hidl/metadata.h>
+#include <property_info_parser/property_info_parser.h>
 #include <property_info_serializer/property_info_serializer.h>
 
 #include "action.h"
@@ -57,9 +56,7 @@
 using android::base::ParseInt;
 using android::base::ReadFileToString;
 using android::base::Split;
-using android::properties::BuildTrie;
 using android::properties::ParsePropertyInfoFile;
-using android::properties::PropertyInfoArea;
 using android::properties::PropertyInfoEntry;
 
 static std::vector<std::string> passwd_files;
@@ -148,12 +145,6 @@
 namespace android {
 namespace init {
 
-static Result<void> check_stub(const BuiltinArguments& args) {
-    return {};
-}
-
-#include "generated_stub_builtin_function_map.h"
-
 void PrintUsage() {
     fprintf(stdout, R"(usage: host_init_verifier [options]
 
@@ -196,8 +187,6 @@
     return result;
 }
 
-const PropertyInfoArea* property_info_area;
-
 void HandlePropertyContexts(const std::string& filename,
                             std::vector<PropertyInfoEntry>* property_infos) {
     auto file_contents = std::string();
@@ -288,16 +277,11 @@
     }
     SetKnownInterfaces(*interface_inheritance_hierarchy_map);
 
-    std::string serialized_contexts;
-    std::string trie_error;
-    if (!BuildTrie(property_infos, "u:object_r:default_prop:s0", "string", &serialized_contexts,
-                   &trie_error)) {
-        LOG(ERROR) << "Unable to serialize property contexts: " << trie_error;
+    if (auto result = InitializeHostPropertyInfoArea(property_infos); !result.ok()) {
+        LOG(ERROR) << result.error();
         return EXIT_FAILURE;
     }
 
-    property_info_area = reinterpret_cast<const PropertyInfoArea*>(serialized_contexts.c_str());
-
     if (!partition_map.empty()) {
         std::vector<std::string> vendor_prefixes;
         for (const auto& partition : {"vendor", "odm"}) {
diff --git a/init/host_init_verifier.h b/init/host_init_verifier.h
deleted file mode 100644
index 5d24f2a..0000000
--- a/init/host_init_verifier.h
+++ /dev/null
@@ -1,27 +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.
- */
-
-#pragma once
-
-#include <property_info_parser/property_info_parser.h>
-
-namespace android {
-namespace init {
-
-extern const android::properties::PropertyInfoArea* property_info_area;
-
-}  // namespace init
-}  // namespace android
diff --git a/init/init.cpp b/init/init.cpp
index 83cb78b..19e909f 100644
--- a/init/init.cpp
+++ b/init/init.cpp
@@ -54,7 +54,6 @@
 #include <android-base/thread_annotations.h>
 #include <fs_avb/fs_avb.h>
 #include <fs_mgr_vendor_overlay.h>
-#include <keyutils.h>
 #include <libavb/libavb.h>
 #include <libgsi/libgsi.h>
 #include <libsnapshot/snapshot.h>
@@ -117,7 +116,6 @@
 
 static int property_triggers_enabled = 0;
 
-int sigchld_fd = -1;
 static int sigterm_fd = -1;
 static int property_fd = -1;
 
@@ -717,7 +715,7 @@
 
 static void HandleSignalFd(int signal) {
     signalfd_siginfo siginfo;
-    const int signal_fd = signal == SIGCHLD ? sigchld_fd : sigterm_fd;
+    const int signal_fd = signal == SIGCHLD ? Service::GetSigchldFd() : sigterm_fd;
     ssize_t bytes_read = TEMP_FAILURE_RETRY(read(signal_fd, &siginfo, sizeof(siginfo)));
     if (bytes_read != sizeof(siginfo)) {
         PLOG(ERROR) << "Failed to read siginfo from signal_fd";
@@ -751,20 +749,24 @@
     }
 }
 
+static Result<void> RegisterSignalFd(Epoll* epoll, int signal, int fd) {
+    return epoll->RegisterHandler(
+            fd, [signal]() { HandleSignalFd(signal); }, EPOLLIN | EPOLLPRI);
+}
+
 static Result<int> CreateAndRegisterSignalFd(Epoll* epoll, int signal) {
     sigset_t mask;
     sigemptyset(&mask);
     sigaddset(&mask, signal);
-    unique_fd signal_fd(signalfd(-1, &mask, SFD_CLOEXEC));
-    if (signal_fd == -1) {
-        return ErrnoError() << "failed to create signalfd for signal " << signal;
+    if (sigprocmask(SIG_BLOCK, &mask, nullptr) == -1) {
+        return ErrnoError() << "failed to block signal " << signal;
     }
 
-    auto result = epoll->RegisterHandler(
-            signal_fd.get(), [signal]() { HandleSignalFd(signal); }, EPOLLIN | EPOLLPRI);
-    if (!result.ok()) {
-        return result.error();
+    unique_fd signal_fd(signalfd(-1, &mask, SFD_CLOEXEC));
+    if (signal_fd.get() < 0) {
+        return ErrnoError() << "failed to create signalfd for signal " << signal;
     }
+    OR_RETURN(RegisterSignalFd(epoll, signal, signal_fd.get()));
 
     return signal_fd.release();
 }
@@ -775,34 +777,18 @@
     const struct sigaction act { .sa_flags = SA_NOCLDSTOP, .sa_handler = SIG_DFL };
     sigaction(SIGCHLD, &act, nullptr);
 
-    sigset_t mask;
-    sigemptyset(&mask);
-    sigaddset(&mask, SIGCHLD);
-
-    if (!IsRebootCapable()) {
-        // If init does not have the CAP_SYS_BOOT capability, it is running in a container.
-        // In that case, receiving SIGTERM will cause the system to shut down.
-        sigaddset(&mask, SIGTERM);
-    }
-
-    if (sigprocmask(SIG_BLOCK, &mask, nullptr) == -1) {
-        PLOG(FATAL) << "failed to block signals";
-    }
-
     // Register a handler to unblock signals in the child processes.
     const int result = pthread_atfork(nullptr, nullptr, &UnblockSignals);
     if (result != 0) {
         LOG(FATAL) << "Failed to register a fork handler: " << strerror(result);
     }
 
-    Result<int> cs_result = CreateAndRegisterSignalFd(epoll, SIGCHLD);
+    Result<void> cs_result = RegisterSignalFd(epoll, SIGCHLD, Service::GetSigchldFd());
     if (!cs_result.ok()) {
         PLOG(FATAL) << cs_result.error();
     }
-    sigchld_fd = cs_result.value();
-    Service::SetSigchldFd(sigchld_fd);
 
-    if (sigismember(&mask, SIGTERM)) {
+    if (!IsRebootCapable()) {
         Result<int> cs_result = CreateAndRegisterSignalFd(epoll, SIGTERM);
         if (!cs_result.ok()) {
             PLOG(FATAL) << cs_result.error();
@@ -984,11 +970,6 @@
                    << " to /proc/1/oom_score_adj: " << result.error();
     }
 
-    // Set up a session keyring that all processes will have access to. It
-    // will hold things like FBE encryption keys. No process should override
-    // its session keyring.
-    keyctl_get_keyring_ID(KEY_SPEC_SESSION_KEYRING, 1);
-
     // Indicate that booting is in progress to background fw loaders, etc.
     close(open("/dev/.booting", O_WRONLY | O_CREAT | O_CLOEXEC, 0000));
 
diff --git a/init/init.h b/init/init.h
index b781167..9c7e918 100644
--- a/init/init.h
+++ b/init/init.h
@@ -28,8 +28,6 @@
 namespace android {
 namespace init {
 
-extern int sigchld_fd;
-
 Parser CreateParser(ActionManager& action_manager, ServiceList& service_list);
 Parser CreateApexConfigParser(ActionManager& action_manager, ServiceList& service_list);
 
diff --git a/init/persistent_properties.cpp b/init/persistent_properties.cpp
index 6f8a4de..59e57b9 100644
--- a/init/persistent_properties.cpp
+++ b/init/persistent_properties.cpp
@@ -23,6 +23,7 @@
 #include <sys/types.h>
 
 #include <memory>
+#include <unordered_map>
 
 #include <android-base/file.h>
 #include <android-base/logging.h>
diff --git a/init/property_service.cpp b/init/property_service.cpp
index bd74358..58a0a7f 100644
--- a/init/property_service.cpp
+++ b/init/property_service.cpp
@@ -58,11 +58,13 @@
 #include <android-base/stringprintf.h>
 #include <android-base/strings.h>
 #include <fs_mgr.h>
+#include <private/android_filesystem_config.h>
 #include <property_info_parser/property_info_parser.h>
 #include <property_info_serializer/property_info_serializer.h>
 #include <selinux/android.h>
 #include <selinux/label.h>
 #include <selinux/selinux.h>
+#include <vendorsupport/api_level.h>
 
 #include "debug_ramdisk.h"
 #include "epoll.h"
@@ -84,6 +86,7 @@
 
 using android::base::ErrnoError;
 using android::base::Error;
+using android::base::GetIntProperty;
 using android::base::GetProperty;
 using android::base::ParseInt;
 using android::base::ReadFileToString;
@@ -112,16 +115,16 @@
 constexpr auto LEGACY_ID_PROP = "ro.build.legacy.id";
 constexpr auto VBMETA_DIGEST_PROP = "ro.boot.vbmeta.digest";
 constexpr auto DIGEST_SIZE_USED = 8;
-constexpr auto API_LEVEL_CURRENT = 10000;
 
 static bool persistent_properties_loaded = false;
 
-static int property_set_fd = -1;
 static int from_init_socket = -1;
 static int init_socket = -1;
 static bool accept_messages = false;
 static std::mutex accept_messages_lock;
+static std::mutex selinux_check_access_lock;
 static std::thread property_service_thread;
+static std::thread property_service_for_system_thread;
 
 static std::unique_ptr<PersistWriteThread> persist_write_thread;
 
@@ -166,6 +169,7 @@
     ucred cr = {.pid = 0, .uid = 0, .gid = 0};
     audit_data.cr = &cr;
 
+    auto lock = std::lock_guard{selinux_check_access_lock};
     return selinux_check_access(source_context.c_str(), target_context, "file", "read",
                                 &audit_data) == 0;
 }
@@ -181,10 +185,9 @@
     audit_data.name = name.c_str();
     audit_data.cr = &cr;
 
-    bool has_access = (selinux_check_access(source_context, target_context, "property_service",
-                                            "set", &audit_data) == 0);
-
-    return has_access;
+    auto lock = std::lock_guard{selinux_check_access_lock};
+    return selinux_check_access(source_context, target_context, "property_service", "set",
+                                &audit_data) == 0;
 }
 
 void NotifyPropertyChange(const std::string& name, const std::string& value) {
@@ -399,30 +402,38 @@
         return {PROP_ERROR_INVALID_VALUE};
     }
 
-    prop_info* pi = (prop_info*)__system_property_find(name.c_str());
-    if (pi != nullptr) {
-        // ro.* properties are actually "write-once".
-        if (StartsWith(name, "ro.")) {
-            *error = "Read-only property was already set";
-            return {PROP_ERROR_READ_ONLY_PROPERTY};
-        }
-
-        __system_property_update(pi, value.c_str(), valuelen);
+    if (name == "sys.powerctl") {
+        // No action here - NotifyPropertyChange will trigger the appropriate action, and since this
+        // can come to the second thread, we mustn't call out to the __system_property_* functions
+        // which support multiple readers but only one mutator.
     } else {
-        int rc = __system_property_add(name.c_str(), name.size(), value.c_str(), valuelen);
-        if (rc < 0) {
-            *error = "__system_property_add failed";
-            return {PROP_ERROR_SET_FAILED};
-        }
-    }
+        prop_info* pi = (prop_info*)__system_property_find(name.c_str());
+        if (pi != nullptr) {
+            // ro.* properties are actually "write-once".
+            if (StartsWith(name, "ro.")) {
+                *error = "Read-only property was already set";
+                return {PROP_ERROR_READ_ONLY_PROPERTY};
+            }
 
-    bool need_persist = StartsWith(name, "persist.") || StartsWith(name, "next_boot.");
-    if (socket && persistent_properties_loaded && need_persist) {
-        if (persist_write_thread) {
-            persist_write_thread->Write(name, value, std::move(*socket));
-            return {};
+            __system_property_update(pi, value.c_str(), valuelen);
+        } else {
+            int rc = __system_property_add(name.c_str(), name.size(), value.c_str(), valuelen);
+            if (rc < 0) {
+                *error = "__system_property_add failed";
+                return {PROP_ERROR_SET_FAILED};
+            }
         }
-        WritePersistentProperty(name, value);
+
+        // Don't write properties to disk until after we have read all default
+        // properties to prevent them from being overwritten by default values.
+        bool need_persist = StartsWith(name, "persist.") || StartsWith(name, "next_boot.");
+        if (socket && persistent_properties_loaded && need_persist) {
+            if (persist_write_thread) {
+                persist_write_thread->Write(name, value, std::move(*socket));
+                return {};
+            }
+            WritePersistentProperty(name, value);
+        }
     }
 
     NotifyPropertyChange(name, value);
@@ -583,10 +594,10 @@
     return *ret;
 }
 
-static void handle_property_set_fd() {
+static void handle_property_set_fd(int fd) {
     static constexpr uint32_t kDefaultSocketTimeout = 2000; /* ms */
 
-    int s = accept4(property_set_fd, nullptr, nullptr, SOCK_CLOEXEC);
+    int s = accept4(fd, nullptr, nullptr, SOCK_CLOEXEC);
     if (s == -1) {
         return;
     }
@@ -1084,36 +1095,45 @@
     }
 }
 
-static int read_api_level_props(const std::vector<std::string>& api_level_props) {
-    int api_level = API_LEVEL_CURRENT;
-    for (const auto& api_level_prop : api_level_props) {
-        api_level = android::base::GetIntProperty(api_level_prop, API_LEVEL_CURRENT);
-        if (api_level != API_LEVEL_CURRENT) {
-            break;
-        }
-    }
-    return api_level;
-}
-
 static void property_initialize_ro_vendor_api_level() {
     // ro.vendor.api_level shows the api_level that the vendor images (vendor, odm, ...) are
     // required to support.
     constexpr auto VENDOR_API_LEVEL_PROP = "ro.vendor.api_level";
 
-    // Api level properties of the board. The order of the properties must be kept.
-    std::vector<std::string> BOARD_API_LEVEL_PROPS = {"ro.board.api_level",
-                                                      "ro.board.first_api_level"};
-    // Api level properties of the device. The order of the properties must be kept.
-    std::vector<std::string> DEVICE_API_LEVEL_PROPS = {"ro.product.first_api_level",
-                                                       "ro.build.version.sdk"};
+    if (__system_property_find(VENDOR_API_LEVEL_PROP) != nullptr) {
+        // The device already have ro.vendor.api_level in its vendor/build.prop.
+        // Skip initializing the ro.vendor.api_level property.
+        return;
+    }
 
-    int api_level = std::min(read_api_level_props(BOARD_API_LEVEL_PROPS),
-                             read_api_level_props(DEVICE_API_LEVEL_PROPS));
+    auto vendor_api_level = GetIntProperty("ro.board.first_api_level", __ANDROID_VENDOR_API_MAX__);
+    if (vendor_api_level != __ANDROID_VENDOR_API_MAX__) {
+        // Update the vendor_api_level with "ro.board.api_level" only if both "ro.board.api_level"
+        // and "ro.board.first_api_level" are defined.
+        vendor_api_level = GetIntProperty("ro.board.api_level", vendor_api_level);
+    }
+
+    auto product_first_api_level =
+            GetIntProperty("ro.product.first_api_level", __ANDROID_API_FUTURE__);
+    if (product_first_api_level == __ANDROID_API_FUTURE__) {
+        // Fallback to "ro.build.version.sdk" if the "ro.product.first_api_level" is not defined.
+        product_first_api_level = GetIntProperty("ro.build.version.sdk", __ANDROID_API_FUTURE__);
+    }
+
+    vendor_api_level =
+            std::min(AVendorSupport_getVendorApiLevelOf(product_first_api_level), vendor_api_level);
+
+    if (vendor_api_level < 0) {
+        LOG(ERROR) << "Unexpected vendor api level for " << VENDOR_API_LEVEL_PROP << ". Check "
+                   << "ro.product.first_api_level and ro.build.version.sdk.";
+        vendor_api_level = __ANDROID_VENDOR_API_MAX__;
+    }
+
     std::string error;
-    auto res = PropertySetNoSocket(VENDOR_API_LEVEL_PROP, std::to_string(api_level), &error);
+    auto res = PropertySetNoSocket(VENDOR_API_LEVEL_PROP, std::to_string(vendor_api_level), &error);
     if (res != PROP_SUCCESS) {
-        LOG(ERROR) << "Failed to set " << VENDOR_API_LEVEL_PROP << " with " << api_level << ": "
-                   << error << "(" << res << ")";
+        LOG(ERROR) << "Failed to set " << VENDOR_API_LEVEL_PROP << " with " << vendor_api_level
+                   << ": " << error << "(" << res << ")";
     }
 }
 
@@ -1291,7 +1311,7 @@
     mkdir(APPCOMPAT_OVERRIDE_PROP_FOLDERNAME, S_IRWXU | S_IXGRP | S_IXOTH);
     if (!WriteStringToFile(serialized_contexts, APPCOMPAT_OVERRIDE_PROP_TREE_FILE, 0444, 0, 0,
                            false)) {
-        PLOG(ERROR) << "Unable to write vendor overrides to file";
+        PLOG(ERROR) << "Unable to write appcompat override property infos to file";
     }
     selinux_android_restorecon(APPCOMPAT_OVERRIDE_PROP_TREE_FILE, 0);
 }
@@ -1428,19 +1448,21 @@
     }
 }
 
-static void PropertyServiceThread() {
+static void PropertyServiceThread(int fd, bool listen_init) {
     Epoll epoll;
     if (auto result = epoll.Open(); !result.ok()) {
         LOG(FATAL) << result.error();
     }
 
-    if (auto result = epoll.RegisterHandler(property_set_fd, handle_property_set_fd);
+    if (auto result = epoll.RegisterHandler(fd, std::bind(handle_property_set_fd, fd));
         !result.ok()) {
         LOG(FATAL) << result.error();
     }
 
-    if (auto result = epoll.RegisterHandler(init_socket, HandleInitSocket); !result.ok()) {
-        LOG(FATAL) << result.error();
+    if (listen_init) {
+        if (auto result = epoll.RegisterHandler(init_socket, HandleInitSocket); !result.ok()) {
+            LOG(FATAL) << result.error();
+        }
     }
 
     while (true) {
@@ -1489,6 +1511,23 @@
     cv_.notify_all();
 }
 
+void StartThread(const char* name, int mode, int gid, std::thread& t, bool listen_init) {
+    int fd = -1;
+    if (auto result = CreateSocket(name, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
+                                   /*passcred=*/false, /*should_listen=*/false, mode, /*uid=*/0,
+                                   /*gid=*/gid, /*socketcon=*/{});
+        result.ok()) {
+        fd = *result;
+    } else {
+        LOG(FATAL) << "start_property_service socket creation failed: " << result.error();
+    }
+
+    listen(fd, 8);
+
+    auto new_thread = std::thread(PropertyServiceThread, fd, listen_init);
+    t.swap(new_thread);
+}
+
 void StartPropertyService(int* epoll_socket) {
     InitPropertySet("ro.property_service.version", "2");
 
@@ -1500,19 +1539,9 @@
     init_socket = sockets[1];
     StartSendingMessages();
 
-    if (auto result = CreateSocket(PROP_SERVICE_NAME, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
-                                   /*passcred=*/false, /*should_listen=*/false, 0666, /*uid=*/0,
-                                   /*gid=*/0, /*socketcon=*/{});
-        result.ok()) {
-        property_set_fd = *result;
-    } else {
-        LOG(FATAL) << "start_property_service socket creation failed: " << result.error();
-    }
-
-    listen(property_set_fd, 8);
-
-    auto new_thread = std::thread{PropertyServiceThread};
-    property_service_thread.swap(new_thread);
+    StartThread(PROP_SERVICE_FOR_SYSTEM_NAME, 0660, AID_SYSTEM, property_service_for_system_thread,
+                true);
+    StartThread(PROP_SERVICE_NAME, 0666, 0, property_service_thread, false);
 
     auto async_persist_writes =
             android::base::GetBoolProperty("ro.property_service.async_persist_writes", false);
diff --git a/init/reboot.cpp b/init/reboot.cpp
index 5757922..150f8f4 100644
--- a/init/reboot.cpp
+++ b/init/reboot.cpp
@@ -563,7 +563,7 @@
         }
     }
     if (timeout > 0ms) {
-        WaitToBeReaped(sigchld_fd, pids, timeout);
+        WaitToBeReaped(Service::GetSigchldFd(), pids, timeout);
     } else {
         // Even if we don't to wait for services to stop, we still optimistically reap zombies.
         ReapAnyOutstandingChildren();
@@ -1083,7 +1083,8 @@
                         return;
                     }
                 }
-            } else if (reboot_target == "quiescent") {
+            } else if (std::find(cmd_params.begin(), cmd_params.end(), "quiescent")
+                    != cmd_params.end()) { // Quiescent can be either subreason or details.
                 bootloader_message boot = {};
                 if (std::string err; !read_bootloader_message(&boot, &err)) {
                     LOG(ERROR) << "Failed to read bootloader message: " << err;
diff --git a/init/selinux.cpp b/init/selinux.cpp
index 1f211dd..e191b60 100644
--- a/init/selinux.cpp
+++ b/init/selinux.cpp
@@ -111,97 +111,6 @@
     return true;
 }
 
-// Forks, executes the provided program in the child, and waits for the completion in the parent.
-// Child's stderr is captured and logged using LOG(ERROR).
-bool ForkExecveAndWaitForCompletion(const char* filename, char* const argv[]) {
-    // Create a pipe used for redirecting child process's output.
-    // * pipe_fds[0] is the FD the parent will use for reading.
-    // * pipe_fds[1] is the FD the child will use for writing.
-    int pipe_fds[2];
-    if (pipe(pipe_fds) == -1) {
-        PLOG(ERROR) << "Failed to create pipe";
-        return false;
-    }
-
-    pid_t child_pid = fork();
-    if (child_pid == -1) {
-        PLOG(ERROR) << "Failed to fork for " << filename;
-        return false;
-    }
-
-    if (child_pid == 0) {
-        // fork succeeded -- this is executing in the child process
-
-        // Close the pipe FD not used by this process
-        close(pipe_fds[0]);
-
-        // Redirect stderr to the pipe FD provided by the parent
-        if (TEMP_FAILURE_RETRY(dup2(pipe_fds[1], STDERR_FILENO)) == -1) {
-            PLOG(ERROR) << "Failed to redirect stderr of " << filename;
-            _exit(127);
-            return false;
-        }
-        close(pipe_fds[1]);
-
-        if (execv(filename, argv) == -1) {
-            PLOG(ERROR) << "Failed to execve " << filename;
-            return false;
-        }
-        // Unreachable because execve will have succeeded and replaced this code
-        // with child process's code.
-        _exit(127);
-        return false;
-    } else {
-        // fork succeeded -- this is executing in the original/parent process
-
-        // Close the pipe FD not used by this process
-        close(pipe_fds[1]);
-
-        // Log the redirected output of the child process.
-        // It's unfortunate that there's no standard way to obtain an istream for a file descriptor.
-        // As a result, we're buffering all output and logging it in one go at the end of the
-        // invocation, instead of logging it as it comes in.
-        const int child_out_fd = pipe_fds[0];
-        std::string child_output;
-        if (!android::base::ReadFdToString(child_out_fd, &child_output)) {
-            PLOG(ERROR) << "Failed to capture full output of " << filename;
-        }
-        close(child_out_fd);
-        if (!child_output.empty()) {
-            // Log captured output, line by line, because LOG expects to be invoked for each line
-            std::istringstream in(child_output);
-            std::string line;
-            while (std::getline(in, line)) {
-                LOG(ERROR) << filename << ": " << line;
-            }
-        }
-
-        // Wait for child to terminate
-        int status;
-        if (TEMP_FAILURE_RETRY(waitpid(child_pid, &status, 0)) != child_pid) {
-            PLOG(ERROR) << "Failed to wait for " << filename;
-            return false;
-        }
-
-        if (WIFEXITED(status)) {
-            int status_code = WEXITSTATUS(status);
-            if (status_code == 0) {
-                return true;
-            } else {
-                LOG(ERROR) << filename << " exited with status " << status_code;
-            }
-        } else if (WIFSIGNALED(status)) {
-            LOG(ERROR) << filename << " killed by signal " << WTERMSIG(status);
-        } else if (WIFSTOPPED(status)) {
-            LOG(ERROR) << filename << " stopped by signal " << WSTOPSIG(status);
-        } else {
-            LOG(ERROR) << "waitpid for " << filename << " returned unexpected status: " << status;
-        }
-
-        return false;
-    }
-}
-
 bool ReadFirstLine(const char* file, std::string* line) {
     line->clear();
 
diff --git a/init/service.cpp b/init/service.cpp
index d351a8f..eb24dd5 100644
--- a/init/service.cpp
+++ b/init/service.cpp
@@ -37,6 +37,7 @@
 #include <cutils/sockets.h>
 #include <processgroup/processgroup.h>
 #include <selinux/selinux.h>
+#include <sys/signalfd.h>
 
 #include <string>
 
@@ -68,6 +69,7 @@
 using android::base::SetProperty;
 using android::base::StartsWith;
 using android::base::StringPrintf;
+using android::base::unique_fd;
 using android::base::WriteStringToFile;
 
 namespace android {
@@ -136,7 +138,6 @@
 
 unsigned long Service::next_start_order_ = 1;
 bool Service::is_exec_service_running_ = false;
-int Service::sigchld_fd_ = -1;
 
 Service::Service(const std::string& name, Subcontext* subcontext_for_restart_commands,
                  const std::string& filename, const std::vector<std::string>& args)
@@ -792,6 +793,35 @@
     mount_namespace_ = IsDefaultMountNamespaceReady() ? NS_DEFAULT : NS_BOOTSTRAP;
 }
 
+static int ThreadCount() {
+    std::unique_ptr<DIR, decltype(&closedir)> dir(opendir("/proc/self/task"), closedir);
+    if (!dir) {
+        return -1;
+    }
+
+    int count = 0;
+    dirent* entry;
+    while ((entry = readdir(dir.get())) != nullptr) {
+        if (entry->d_name[0] != '.') {
+            count++;
+        }
+    }
+    return count;
+}
+
+// Must be called BEFORE any threads are created. See also the sigprocmask() man page.
+unique_fd Service::CreateSigchldFd() {
+    CHECK_EQ(ThreadCount(), 1);
+    sigset_t mask;
+    sigemptyset(&mask);
+    sigaddset(&mask, SIGCHLD);
+    if (sigprocmask(SIG_BLOCK, &mask, nullptr) < 0) {
+        PLOG(FATAL) << "Failed to block SIGCHLD";
+    }
+
+    return unique_fd(signalfd(-1, &mask, SFD_CLOEXEC));
+}
+
 void Service::SetStartedInFirstStage(pid_t pid) {
     LOG(INFO) << "adding first-stage service '" << name_ << "'...";
 
diff --git a/init/service.h b/init/service.h
index 13c8b5f..5e9af25 100644
--- a/init/service.h
+++ b/init/service.h
@@ -156,7 +156,10 @@
     const Subcontext* subcontext() const { return subcontext_; }
     const std::string& filename() const { return filename_; }
     void set_filename(const std::string& name) { filename_ = name; }
-    static void SetSigchldFd(int sigchld_fd) { sigchld_fd_ = sigchld_fd; }
+    static int GetSigchldFd() {
+        static int sigchld_fd = CreateSigchldFd().release();
+        return sigchld_fd;
+    }
 
   private:
     void NotifyStateChange(const std::string& new_state) const;
@@ -169,10 +172,10 @@
     void RunService(const std::vector<Descriptor>& descriptors, InterprocessFifo cgroups_activated,
                     InterprocessFifo setsid_finished);
     void SetMountNamespace();
+    static ::android::base::unique_fd CreateSigchldFd();
 
     static unsigned long next_start_order_;
     static bool is_exec_service_running_;
-    static int sigchld_fd_;
 
     const std::string name_;
     std::set<std::string> classnames_;
diff --git a/init/service_test.cpp b/init/service_test.cpp
index 87a2ce5..a3590b5 100644
--- a/init/service_test.cpp
+++ b/init/service_test.cpp
@@ -17,18 +17,45 @@
 #include "service.h"
 
 #include <algorithm>
+#include <fstream>
 #include <memory>
 #include <type_traits>
 #include <vector>
 
 #include <gtest/gtest.h>
 
+#include <android-base/file.h>
+#include <android-base/stringprintf.h>
+#include <android-base/strings.h>
+#include <selinux/selinux.h>
+#include <sys/signalfd.h>
 #include "lmkd_service.h"
+#include "reboot.h"
+#include "service.h"
+#include "service_list.h"
+#include "service_parser.h"
 #include "util.h"
 
+using ::android::base::ReadFileToString;
+using ::android::base::StringPrintf;
+using ::android::base::StringReplace;
+using ::android::base::unique_fd;
+using ::android::base::WriteStringToFd;
+using ::android::base::WriteStringToFile;
+
 namespace android {
 namespace init {
 
+static std::string GetSecurityContext() {
+    char* ctx;
+    if (getcon(&ctx) == -1) {
+        ADD_FAILURE() << "Failed to call getcon : " << strerror(errno);
+    }
+    std::string result{ctx};
+    freecon(ctx);
+    return result;
+}
+
 TEST(service, pod_initialized) {
     constexpr auto memory_size = sizeof(Service);
     alignas(alignof(Service)) unsigned char old_memory[memory_size];
@@ -190,5 +217,69 @@
     Test_make_temporary_oneshot_service(false, false, false, false, false);
 }
 
+// Returns the path in the v2 cgroup hierarchy for a given process in the format /uid_%d/pid_%d.
+static std::string CgroupPath(pid_t pid) {
+    std::string cgroup_path = StringPrintf("/proc/%d/cgroup", pid);
+    std::ifstream is(cgroup_path, std::ios::in);
+    std::string line;
+    while (std::getline(is, line)) {
+        if (line.substr(0, 3) == "0::") {
+            return line.substr(3);
+        }
+    }
+    return {};
+}
+
+class ServiceStopTest : public testing::TestWithParam<bool> {};
+
+// Before November 2023, processes that were migrated to another v2 cgroup were ignored by
+// Service::Stop() if their uid_%d/pid_%d cgroup directory got removed. This test, if run with the
+// parameter set to 'true', verifies that such services are stopped.
+TEST_P(ServiceStopTest, stop) {
+    if (getuid() != 0) {
+        GTEST_SKIP() << "Must be run as root.";
+        return;
+    }
+
+    static constexpr std::string_view kServiceName = "ServiceA";
+    static constexpr std::string_view kScriptTemplate = R"init(
+service $name /system/bin/yes
+    user shell
+    group shell
+    seclabel $selabel
+)init";
+
+    std::string script = StringReplace(StringReplace(kScriptTemplate, "$name", kServiceName, false),
+                                       "$selabel", GetSecurityContext(), false);
+    ServiceList& service_list = ServiceList::GetInstance();
+    Parser parser;
+    parser.AddSectionParser("service",
+                            std::make_unique<ServiceParser>(&service_list, nullptr, std::nullopt));
+
+    TemporaryFile tf;
+    ASSERT_GE(tf.fd, 0);
+    ASSERT_TRUE(WriteStringToFd(script, tf.fd));
+    ASSERT_TRUE(parser.ParseConfig(tf.path));
+
+    Service* const service = ServiceList::GetInstance().FindService(kServiceName);
+    ASSERT_NE(service, nullptr);
+    ASSERT_RESULT_OK(service->Start());
+    ASSERT_TRUE(service->IsRunning());
+    if (GetParam()) {
+        const pid_t pid = service->pid();
+        const std::string cgroup_path = CgroupPath(pid);
+        EXPECT_NE(cgroup_path, "");
+        EXPECT_NE(cgroup_path, "/");
+        const std::string pid_str = std::to_string(pid);
+        EXPECT_TRUE(WriteStringToFile(pid_str, "/sys/fs/cgroup/cgroup.procs"));
+        EXPECT_EQ(CgroupPath(pid), "/");
+        EXPECT_EQ(rmdir(("/sys/fs/cgroup" + cgroup_path).c_str()), 0);
+    }
+    EXPECT_EQ(0, StopServicesAndLogViolations({service->name()}, 10s, /*terminate=*/true));
+    ServiceList::GetInstance().RemoveService(*service);
+}
+
+INSTANTIATE_TEST_SUITE_P(service, ServiceStopTest, testing::Values(false, true));
+
 }  // namespace init
 }  // namespace android
diff --git a/init/sigchld_handler.cpp b/init/sigchld_handler.cpp
index 9d4c7c8..8e9e713 100644
--- a/init/sigchld_handler.cpp
+++ b/init/sigchld_handler.cpp
@@ -118,12 +118,27 @@
     return pid;
 }
 
-void ReapAnyOutstandingChildren() {
-    while (ReapOneProcess() != 0) {
+std::set<pid_t> ReapAnyOutstandingChildren() {
+    std::set<pid_t> reaped_pids;
+    for (;;) {
+        const pid_t pid = ReapOneProcess();
+        if (pid <= 0) {
+            return reaped_pids;
+        }
+        reaped_pids.emplace(pid);
     }
 }
 
-static void DiscardSiginfo(int signal_fd) {
+static void ReapAndRemove(std::vector<pid_t>& alive_pids) {
+    for (auto pid : ReapAnyOutstandingChildren()) {
+        const auto it = std::find(alive_pids.begin(), alive_pids.end(), pid);
+        if (it != alive_pids.end()) {
+            alive_pids.erase(it);
+        }
+    }
+}
+
+static void HandleSignal(int signal_fd) {
     signalfd_siginfo siginfo;
     ssize_t bytes_read = TEMP_FAILURE_RETRY(read(signal_fd, &siginfo, sizeof(siginfo)));
     if (bytes_read != sizeof(siginfo)) {
@@ -136,27 +151,36 @@
                     std::chrono::milliseconds timeout) {
     Timer t;
     Epoll epoll;
-    // The init process passes a valid sigchld_fd argument but unit tests do not.
     if (sigchld_fd >= 0) {
-        epoll.RegisterHandler(sigchld_fd, [sigchld_fd]() { DiscardSiginfo(sigchld_fd); });
+        if (auto result = epoll.Open(); result.ok()) {
+            result =
+                    epoll.RegisterHandler(sigchld_fd, [sigchld_fd]() { HandleSignal(sigchld_fd); });
+            if (!result.ok()) {
+                LOG(WARNING) << __func__
+                             << " RegisterHandler() failed. Falling back to sleep_for(): "
+                             << result.error();
+                sigchld_fd = -1;
+            }
+        } else {
+            LOG(WARNING) << __func__ << " Epoll::Open() failed. Falling back to sleep_for(): "
+                         << result.error();
+            sigchld_fd = -1;
+        }
     }
-    std::vector<pid_t> alive_pids(pids.begin(), pids.end());
+    std::vector<pid_t> alive_pids(pids);
+    ReapAndRemove(alive_pids);
     while (!alive_pids.empty() && t.duration() < timeout) {
-        pid_t pid;
-        while ((pid = ReapOneProcess()) != 0) {
-            auto it = std::find(alive_pids.begin(), alive_pids.end(), pid);
-            if (it != alive_pids.end()) {
-                alive_pids.erase(it);
+        if (sigchld_fd >= 0) {
+            auto result = epoll.Wait(std::max(timeout - t.duration(), 0ms));
+            if (result.ok()) {
+                ReapAndRemove(alive_pids);
+                continue;
+            } else {
+                LOG(WARNING) << "Epoll::Wait() failed " << result.error();
             }
         }
-        if (alive_pids.empty()) {
-            break;
-        }
-        if (sigchld_fd >= 0) {
-            epoll.Wait(std::max(timeout - t.duration(), 0ms));
-        } else {
-            std::this_thread::sleep_for(50ms);
-        }
+        std::this_thread::sleep_for(50ms);
+        ReapAndRemove(alive_pids);
     }
     LOG(INFO) << "Waiting for " << pids.size() << " pids to be reaped took " << t << " with "
               << alive_pids.size() << " of them still running";
diff --git a/init/sigchld_handler.h b/init/sigchld_handler.h
index e07a7d6..5351302 100644
--- a/init/sigchld_handler.h
+++ b/init/sigchld_handler.h
@@ -18,12 +18,13 @@
 #define _INIT_SIGCHLD_HANDLER_H_
 
 #include <chrono>
+#include <set>
 #include <vector>
 
 namespace android {
 namespace init {
 
-void ReapAnyOutstandingChildren();
+std::set<pid_t> ReapAnyOutstandingChildren();
 
 void WaitToBeReaped(int sigchld_fd, const std::vector<pid_t>& pids,
                     std::chrono::milliseconds timeout);
diff --git a/init/snapuserd_transition.cpp b/init/snapuserd_transition.cpp
index 3a9ff5b..dea7af9 100644
--- a/init/snapuserd_transition.cpp
+++ b/init/snapuserd_transition.cpp
@@ -25,6 +25,7 @@
 #include <filesystem>
 #include <string>
 #include <string_view>
+#include <thread>
 
 #include <android-base/file.h>
 #include <android-base/logging.h>
@@ -194,22 +195,20 @@
             return;
         }
         auto start = reinterpret_cast<const void*>(map.start);
-        auto len = map.end - map.start;
+        uint64_t len = android::procinfo::MappedFileSize(map);
         if (!len) {
             return;
         }
+
         if (mlock(start, len) < 0) {
-            LOG(ERROR) << "mlock failed, " << start << " for " << len << " bytes.";
+            PLOG(ERROR) << "\"" << map.name << "\": mlock(" << start << ", " << len
+                        << ") failed: pgoff = " << map.pgoff;
             ok = false;
         }
     };
 
     if (!android::procinfo::ReadProcessMaps(getpid(), callback) || !ok) {
-        LOG(FATAL) << "Could not process /proc/" << getpid() << "/maps file for init, "
-                   << "falling back to mlockall().";
-        if (mlockall(MCL_CURRENT) < 0) {
-            LOG(FATAL) << "mlockall failed";
-        }
+        LOG(FATAL) << "Could not process /proc/" << getpid() << "/maps file for init";
     }
 }
 
diff --git a/init/ueventd.cpp b/init/ueventd.cpp
index 586e2cf..3f0d0e9 100644
--- a/init/ueventd.cpp
+++ b/init/ueventd.cpp
@@ -297,6 +297,10 @@
 }
 
 static UeventdConfiguration GetConfiguration() {
+    if (IsMicrodroid()) {
+        return ParseConfig({"/system/etc/ueventd.rc", "/vendor/etc/ueventd.rc"});
+    }
+
     auto hardware = android::base::GetProperty("ro.hardware", "");
 
     struct LegacyPathInfo {
diff --git a/init/util.cpp b/init/util.cpp
index e760a59..e5efc7d 100644
--- a/init/util.cpp
+++ b/init/util.cpp
@@ -27,6 +27,7 @@
 #include <string.h>
 #include <sys/socket.h>
 #include <sys/un.h>
+#include <sys/wait.h>
 #include <time.h>
 #include <unistd.h>
 
@@ -747,5 +748,96 @@
     return filtered_configs;
 }
 
+// Forks, executes the provided program in the child, and waits for the completion in the parent.
+// Child's stderr is captured and logged using LOG(ERROR).
+bool ForkExecveAndWaitForCompletion(const char* filename, char* const argv[]) {
+    // Create a pipe used for redirecting child process's output.
+    // * pipe_fds[0] is the FD the parent will use for reading.
+    // * pipe_fds[1] is the FD the child will use for writing.
+    int pipe_fds[2];
+    if (pipe(pipe_fds) == -1) {
+        PLOG(ERROR) << "Failed to create pipe";
+        return false;
+    }
+
+    pid_t child_pid = fork();
+    if (child_pid == -1) {
+        PLOG(ERROR) << "Failed to fork for " << filename;
+        return false;
+    }
+
+    if (child_pid == 0) {
+        // fork succeeded -- this is executing in the child process
+
+        // Close the pipe FD not used by this process
+        close(pipe_fds[0]);
+
+        // Redirect stderr to the pipe FD provided by the parent
+        if (TEMP_FAILURE_RETRY(dup2(pipe_fds[1], STDERR_FILENO)) == -1) {
+            PLOG(ERROR) << "Failed to redirect stderr of " << filename;
+            _exit(127);
+            return false;
+        }
+        close(pipe_fds[1]);
+
+        if (execv(filename, argv) == -1) {
+            PLOG(ERROR) << "Failed to execve " << filename;
+            return false;
+        }
+        // Unreachable because execve will have succeeded and replaced this code
+        // with child process's code.
+        _exit(127);
+        return false;
+    } else {
+        // fork succeeded -- this is executing in the original/parent process
+
+        // Close the pipe FD not used by this process
+        close(pipe_fds[1]);
+
+        // Log the redirected output of the child process.
+        // It's unfortunate that there's no standard way to obtain an istream for a file descriptor.
+        // As a result, we're buffering all output and logging it in one go at the end of the
+        // invocation, instead of logging it as it comes in.
+        const int child_out_fd = pipe_fds[0];
+        std::string child_output;
+        if (!android::base::ReadFdToString(child_out_fd, &child_output)) {
+            PLOG(ERROR) << "Failed to capture full output of " << filename;
+        }
+        close(child_out_fd);
+        if (!child_output.empty()) {
+            // Log captured output, line by line, because LOG expects to be invoked for each line
+            std::istringstream in(child_output);
+            std::string line;
+            while (std::getline(in, line)) {
+                LOG(ERROR) << filename << ": " << line;
+            }
+        }
+
+        // Wait for child to terminate
+        int status;
+        if (TEMP_FAILURE_RETRY(waitpid(child_pid, &status, 0)) != child_pid) {
+            PLOG(ERROR) << "Failed to wait for " << filename;
+            return false;
+        }
+
+        if (WIFEXITED(status)) {
+            int status_code = WEXITSTATUS(status);
+            if (status_code == 0) {
+                return true;
+            } else {
+                LOG(ERROR) << filename << " exited with status " << status_code;
+            }
+        } else if (WIFSIGNALED(status)) {
+            LOG(ERROR) << filename << " killed by signal " << WTERMSIG(status);
+        } else if (WIFSTOPPED(status)) {
+            LOG(ERROR) << filename << " stopped by signal " << WSTOPSIG(status);
+        } else {
+            LOG(ERROR) << "waitpid for " << filename << " returned unexpected status: " << status;
+        }
+
+        return false;
+    }
+}
+
 }  // namespace init
 }  // namespace android
diff --git a/init/util.h b/init/util.h
index 2d02182..aa24123 100644
--- a/init/util.h
+++ b/init/util.h
@@ -117,5 +117,10 @@
 // (.rc == .0rc for ranking purposes)
 std::vector<std::string> FilterVersionedConfigs(const std::vector<std::string>& configs,
                                                   int active_sdk);
+
+// Forks, executes the provided program in the child, and waits for the completion in the parent.
+// Child's stderr is captured and logged using LOG(ERROR).
+bool ForkExecveAndWaitForCompletion(const char* filename, char* const argv[]);
+
 }  // namespace init
 }  // namespace android
diff --git a/janitors/OWNERS b/janitors/OWNERS
index d871201..a28737e 100644
--- a/janitors/OWNERS
+++ b/janitors/OWNERS
@@ -3,5 +3,4 @@
 cferris@google.com
 dwillemsen@google.com
 enh@google.com
-narayan@google.com
 sadafebrahimi@google.com
diff --git a/libcutils/Android.bp b/libcutils/Android.bp
index 8ae7d9e..b7752d9 100644
--- a/libcutils/Android.bp
+++ b/libcutils/Android.bp
@@ -116,27 +116,6 @@
     },
 }
 
-cc_test {
-    name: "libcutils_sockets_test",
-    test_suites: ["device-tests"],
-    static_libs: ["libbase", "libcutils_sockets"],
-    cflags: [
-        "-Wall",
-        "-Wextra",
-        "-Werror",
-    ],
-
-    srcs: ["sockets_test.cpp"],
-    target: {
-        android: {
-            srcs: [
-                "android_get_control_file_test.cpp",
-                "android_get_control_socket_test.cpp",
-            ],
-        },
-    },
-}
-
 // some files must not be compiled when building against Mingw
 // they correspond to features not used by our host development tools
 // which are also hard or even impossible to port to native Win32
@@ -347,7 +326,10 @@
 
 cc_test {
     name: "KernelLibcutilsTest",
-    test_suites: ["general-tests", "vts"],
+    test_suites: [
+        "general-tests",
+        "vts",
+    ],
     defaults: ["libcutils_test_static_defaults"],
     test_config: "KernelLibcutilsTest.xml",
 }
diff --git a/libcutils/ashmem-dev.cpp b/libcutils/ashmem-dev.cpp
index 410dbfd..46b8ef2 100644
--- a/libcutils/ashmem-dev.cpp
+++ b/libcutils/ashmem-dev.cpp
@@ -301,6 +301,12 @@
         return -1;
     }
 
+    // forbid size changes to match ashmem behaviour
+    if (fcntl(fd, F_ADD_SEALS, F_SEAL_GROW | F_SEAL_SHRINK) == -1) {
+        ALOGE("memfd_create(%s, %zd) F_ADD_SEALS failed: %m", name, size);
+        return -1;
+    }
+
     if (debug_log) {
         ALOGE("memfd_create(%s, %zd) success. fd=%d\n", name, size, fd.get());
     }
@@ -352,14 +358,29 @@
 }
 
 static int memfd_set_prot_region(int fd, int prot) {
-    /* Only proceed if an fd needs to be write-protected */
+    int seals = fcntl(fd, F_GET_SEALS);
+    if (seals == -1) {
+        ALOGE("memfd_set_prot_region(%d, %d): F_GET_SEALS failed: %s\n", fd, prot, strerror(errno));
+        return -1;
+    }
+
     if (prot & PROT_WRITE) {
+        /* Now we want the buffer to be read-write, let's check if the buffer
+         * has been previously marked as read-only before, if so return error
+         */
+        if (seals & F_SEAL_FUTURE_WRITE) {
+            ALOGE("memfd_set_prot_region(%d, %d): region is write protected\n", fd, prot);
+            errno = EINVAL;  // inline with ashmem error code, if already in
+                             // read-only mode
+            return -1;
+        }
         return 0;
     }
 
-    if (fcntl(fd, F_ADD_SEALS, F_SEAL_FUTURE_WRITE) == -1) {
-        ALOGE("memfd_set_prot_region(%d, %d): F_SEAL_FUTURE_WRITE seal failed: %s\n", fd, prot,
-              strerror(errno));
+    /* We would only allow read-only for any future file operations */
+    if (fcntl(fd, F_ADD_SEALS, F_SEAL_FUTURE_WRITE | F_SEAL_SEAL) == -1) {
+        ALOGE("memfd_set_prot_region(%d, %d): F_SEAL_FUTURE_WRITE | F_SEAL_SEAL seal failed: %s\n",
+              fd, prot, strerror(errno));
         return -1;
     }
 
diff --git a/libcutils/ashmem_test.cpp b/libcutils/ashmem_test.cpp
index d158427..571b410 100644
--- a/libcutils/ashmem_test.cpp
+++ b/libcutils/ashmem_test.cpp
@@ -22,6 +22,8 @@
 #include <sys/types.h>
 #include <unistd.h>
 
+#include <vector>
+
 #include <android-base/macros.h>
 #include <android-base/unique_fd.h>
 #include <cutils/ashmem.h>
@@ -61,16 +63,16 @@
     EXPECT_EQ(prot, ioctl(fd, ASHMEM_GET_PROT_MASK));
 }
 
-void FillData(uint8_t* data, size_t dataLen) {
-    for (size_t i = 0; i < dataLen; i++) {
+void FillData(std::vector<uint8_t>& data) {
+    for (size_t i = 0; i < data.size(); i++) {
         data[i] = i & 0xFF;
     }
 }
 
 TEST(AshmemTest, BasicTest) {
-    constexpr size_t size = PAGE_SIZE;
-    uint8_t data[size];
-    FillData(data, size);
+    const size_t size = getpagesize();
+    std::vector<uint8_t> data(size);
+    FillData(data);
 
     unique_fd fd;
     ASSERT_NO_FATAL_FAILURE(TestCreateRegion(size, fd, PROT_READ | PROT_WRITE));
@@ -78,21 +80,21 @@
     void* region1 = nullptr;
     ASSERT_NO_FATAL_FAILURE(TestMmap(fd, size, PROT_READ | PROT_WRITE, &region1));
 
-    memcpy(region1, &data, size);
-    ASSERT_EQ(0, memcmp(region1, &data, size));
+    memcpy(region1, data.data(), size);
+    ASSERT_EQ(0, memcmp(region1, data.data(), size));
 
     EXPECT_EQ(0, munmap(region1, size));
 
     void *region2;
     ASSERT_NO_FATAL_FAILURE(TestMmap(fd, size, PROT_READ, &region2));
-    ASSERT_EQ(0, memcmp(region2, &data, size));
+    ASSERT_EQ(0, memcmp(region2, data.data(), size));
     EXPECT_EQ(0, munmap(region2, size));
 }
 
 TEST(AshmemTest, ForkTest) {
-    constexpr size_t size = PAGE_SIZE;
-    uint8_t data[size];
-    FillData(data, size);
+    const size_t size = getpagesize();
+    std::vector<uint8_t> data(size);
+    FillData(data);
 
     unique_fd fd;
     ASSERT_NO_FATAL_FAILURE(TestCreateRegion(size, fd, PROT_READ | PROT_WRITE));
@@ -100,8 +102,8 @@
     void* region1 = nullptr;
     ASSERT_NO_FATAL_FAILURE(TestMmap(fd, size, PROT_READ | PROT_WRITE, &region1));
 
-    memcpy(region1, &data, size);
-    ASSERT_EQ(0, memcmp(region1, &data, size));
+    memcpy(region1, data.data(), size);
+    ASSERT_EQ(0, memcmp(region1, data.data(), size));
     EXPECT_EQ(0, munmap(region1, size));
 
     ASSERT_EXIT(
@@ -113,7 +115,7 @@
             if (region2 == MAP_FAILED) {
                 _exit(1);
             }
-            if (memcmp(region2, &data, size) != 0) {
+            if (memcmp(region2, data.data(), size) != 0) {
                 _exit(2);
             }
             memset(region2, 0, size);
@@ -122,10 +124,10 @@
         },
         ::testing::ExitedWithCode(0), "");
 
-    memset(&data, 0, size);
+    memset(data.data(), 0, size);
     void *region2;
     ASSERT_NO_FATAL_FAILURE(TestMmap(fd, size, PROT_READ | PROT_WRITE, &region2));
-    ASSERT_EQ(0, memcmp(region2, &data, size));
+    ASSERT_EQ(0, memcmp(region2, data.data(), size));
     EXPECT_EQ(0, munmap(region2, size));
 }
 
@@ -134,18 +136,19 @@
     void* region = nullptr;
 
     // Allocate a 4-page buffer, but leave page-sized holes on either side
-    constexpr size_t size = PAGE_SIZE * 4;
-    constexpr size_t dataSize = PAGE_SIZE * 2;
-    constexpr size_t holeSize = PAGE_SIZE;
+    const size_t pageSize = getpagesize();
+    const size_t size = pageSize * 4;
+    const size_t dataSize = pageSize * 2;
+    const size_t holeSize = pageSize;
     ASSERT_NO_FATAL_FAILURE(TestCreateRegion(size, fd, PROT_READ | PROT_WRITE));
     ASSERT_NO_FATAL_FAILURE(TestMmap(fd, dataSize, PROT_READ | PROT_WRITE, &region, holeSize));
 
-    uint8_t data[dataSize];
-    FillData(data, dataSize);
-    memcpy(region, data, dataSize);
+    std::vector<uint8_t> data(dataSize);
+    FillData(data);
+    memcpy(region, data.data(), dataSize);
 
-    constexpr off_t dataStart = holeSize;
-    constexpr off_t dataEnd = dataStart + dataSize;
+    const off_t dataStart = holeSize;
+    const off_t dataEnd = dataStart + dataSize;
 
     // The sequence of seeks below looks something like this:
     //
@@ -163,9 +166,12 @@
         // Expected lseek() return value
         off_t ret;
     } seeks[] = {
-        {99, SEEK_SET, 99},         {dataStart, SEEK_CUR, dataStart + 99},
-        {0, SEEK_DATA, dataStart},  {dataStart, SEEK_HOLE, dataEnd},
-        {-99, SEEK_END, size - 99}, {-dataStart, SEEK_CUR, dataEnd - 99},
+            {99, SEEK_SET, 99},
+            {dataStart, SEEK_CUR, dataStart + 99},
+            {0, SEEK_DATA, dataStart},
+            {dataStart, SEEK_HOLE, dataEnd},
+            {-99, SEEK_END, static_cast<off_t>(size) - 99},
+            {-dataStart, SEEK_CUR, dataEnd - 99},
     };
     for (const auto& cfg : seeks) {
         errno = 0;
@@ -180,7 +186,7 @@
             uint8_t buf[readSize];
 
             ASSERT_EQ(readSize, TEMP_FAILURE_RETRY(read(fd, buf, readSize)));
-            EXPECT_EQ(0, memcmp(buf, data + dataOff, readSize));
+            EXPECT_EQ(0, memcmp(buf, &data[dataOff], readSize));
         }
     }
 
@@ -189,7 +195,7 @@
 
 TEST(AshmemTest, ProtTest) {
     unique_fd fd;
-    constexpr size_t size = PAGE_SIZE;
+    const size_t size = getpagesize();
     void *region;
 
     ASSERT_NO_FATAL_FAILURE(TestCreateRegion(size, fd, PROT_READ));
@@ -217,7 +223,7 @@
 
 TEST(AshmemTest, ForkProtTest) {
     unique_fd fd;
-    constexpr size_t size = PAGE_SIZE;
+    const size_t size = getpagesize();
 
     int protFlags[] = { PROT_READ, PROT_WRITE };
     for (size_t i = 0; i < arraysize(protFlags); i++) {
@@ -238,9 +244,9 @@
 }
 
 TEST(AshmemTest, ForkMultiRegionTest) {
-    constexpr size_t size = PAGE_SIZE;
-    uint8_t data[size];
-    FillData(data, size);
+    const size_t size = getpagesize();
+    std::vector<uint8_t> data(size);
+    FillData(data);
 
     constexpr int nRegions = 16;
     unique_fd fd[nRegions];
@@ -248,8 +254,8 @@
         ASSERT_NO_FATAL_FAILURE(TestCreateRegion(size, fd[i], PROT_READ | PROT_WRITE));
         void* region = nullptr;
         ASSERT_NO_FATAL_FAILURE(TestMmap(fd[i], size, PROT_READ | PROT_WRITE, &region));
-        memcpy(region, &data, size);
-        ASSERT_EQ(0, memcmp(region, &data, size));
+        memcpy(region, data.data(), size);
+        ASSERT_EQ(0, memcmp(region, data.data(), size));
         EXPECT_EQ(0, munmap(region, size));
     }
 
@@ -262,7 +268,7 @@
             if (region == MAP_FAILED) {
                 _exit(1);
             }
-            if (memcmp(region, &data, size) != 0) {
+            if (memcmp(region, data.data(), size) != 0) {
                 munmap(region, size);
                 _exit(2);
             }
@@ -272,11 +278,11 @@
         _exit(0);
     }, ::testing::ExitedWithCode(0), "");
 
-    memset(&data, 0, size);
+    memset(data.data(), 0, size);
     for (int i = 0; i < nRegions; i++) {
         void *region;
         ASSERT_NO_FATAL_FAILURE(TestMmap(fd[i], size, PROT_READ | PROT_WRITE, &region));
-        ASSERT_EQ(0, memcmp(region, &data, size));
+        ASSERT_EQ(0, memcmp(region, data.data(), size));
         EXPECT_EQ(0, munmap(region, size));
     }
 }
diff --git a/libcutils/include/private/android_filesystem_config.h b/libcutils/include/private/android_filesystem_config.h
index 1e035bb..ea61cc2 100644
--- a/libcutils/include/private/android_filesystem_config.h
+++ b/libcutils/include/private/android_filesystem_config.h
@@ -141,6 +141,7 @@
 #define AID_SDK_SANDBOX 1090      /* SDK sandbox virtual UID */
 #define AID_SECURITY_LOG_WRITER 1091 /* write to security log */
 #define AID_PRNG_SEEDER 1092         /* PRNG seeder daemon */
+#define AID_UPROBESTATS 1093         /* uid for uprobestats */
 /* Changes to this file must be made in AOSP, *not* in internal branches. */
 
 #define AID_SHELL 2000 /* adb and debug shell user */
@@ -169,6 +170,7 @@
 #define AID_WAKELOCK 3010     /* Allow system wakelock read/write access */
 #define AID_UHID 3011         /* Allow read/write to /dev/uhid node */
 #define AID_READTRACEFS 3012  /* Allow tracefs read */
+#define AID_VIRTUALMACHINE 3013 /* Allows VMs to tune for performance*/
 
 /* The range 5000-5999 is also reserved for vendor partition. */
 #define AID_OEM_RESERVED_2_START 5000
diff --git a/libmodprobe/Android.bp b/libmodprobe/Android.bp
index 1d94a96..12906cc 100644
--- a/libmodprobe/Android.bp
+++ b/libmodprobe/Android.bp
@@ -10,6 +10,7 @@
     vendor_available: true,
     ramdisk_available: true,
     recovery_available: true,
+    vendor_ramdisk_available: true,
     host_supported: true,
     srcs: [
         "libmodprobe.cpp",
diff --git a/libmodprobe/include/modprobe/modprobe.h b/libmodprobe/include/modprobe/modprobe.h
index 5d79d6a..d7a90c4 100644
--- a/libmodprobe/include/modprobe/modprobe.h
+++ b/libmodprobe/include/modprobe/modprobe.h
@@ -41,6 +41,7 @@
                             std::vector<std::string>* post_dependencies);
     void ResetModuleCount() { module_count_ = 0; }
     int GetModuleCount() { return module_count_; }
+    bool IsBlocklisted(const std::string& module_name);
 
   private:
     std::string MakeCanonical(const std::string& module_path);
@@ -52,7 +53,6 @@
     void AddOption(const std::string& module_name, const std::string& option_name,
                    const std::string& value);
     std::string GetKernelCmdline();
-    bool IsBlocklisted(const std::string& module_name);
 
     bool ParseDepCallback(const std::string& base_path, const std::vector<std::string>& args);
     bool ParseAliasCallback(const std::vector<std::string>& args);
diff --git a/libprocessgroup/TEST_MAPPING b/libprocessgroup/TEST_MAPPING
new file mode 100644
index 0000000..29a9ff0
--- /dev/null
+++ b/libprocessgroup/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "postsubmit": [
+    {
+      "name": "StagedRollbackTest"
+    }
+  ]
+}
diff --git a/libprocessgroup/cgroup_map.cpp b/libprocessgroup/cgroup_map.cpp
index ce7f10b..c8ae216 100644
--- a/libprocessgroup/cgroup_map.cpp
+++ b/libprocessgroup/cgroup_map.cpp
@@ -104,7 +104,7 @@
     return proc_path.append(CGROUP_PROCS_FILE);
 }
 
-bool CgroupController::GetTaskGroup(int tid, std::string* group) const {
+bool CgroupController::GetTaskGroup(pid_t tid, std::string* group) const {
     std::string file_name = StringPrintf("/proc/%d/cgroup", tid);
     std::string content;
     if (!android::base::ReadFileToString(file_name, &content)) {
diff --git a/libprocessgroup/cgroup_map.h b/libprocessgroup/cgroup_map.h
index 5cdf8b2..5c6d3e2 100644
--- a/libprocessgroup/cgroup_map.h
+++ b/libprocessgroup/cgroup_map.h
@@ -43,7 +43,8 @@
 
     std::string GetTasksFilePath(const std::string& path) const;
     std::string GetProcsFilePath(const std::string& path, uid_t uid, pid_t pid) const;
-    bool GetTaskGroup(int tid, std::string* group) const;
+    bool GetTaskGroup(pid_t tid, std::string* group) const;
+
   private:
     enum ControllerState {
         UNKNOWN = 0,
diff --git a/libprocessgroup/include/processgroup/processgroup.h b/libprocessgroup/include/processgroup/processgroup.h
index 9107838..ffffeb4 100644
--- a/libprocessgroup/include/processgroup/processgroup.h
+++ b/libprocessgroup/include/processgroup/processgroup.h
@@ -33,19 +33,20 @@
 bool CgroupGetControllerPath(const std::string& cgroup_name, std::string* path);
 bool CgroupGetControllerFromPath(const std::string& path, std::string* cgroup_name);
 bool CgroupGetAttributePath(const std::string& attr_name, std::string* path);
-bool CgroupGetAttributePathForTask(const std::string& attr_name, int tid, std::string* path);
+bool CgroupGetAttributePathForTask(const std::string& attr_name, pid_t tid, std::string* path);
 
-bool SetTaskProfiles(int tid, const std::vector<std::string>& profiles, bool use_fd_cache = false);
+bool SetTaskProfiles(pid_t tid, const std::vector<std::string>& profiles,
+                     bool use_fd_cache = false);
 bool SetProcessProfiles(uid_t uid, pid_t pid, const std::vector<std::string>& profiles);
 bool SetUserProfiles(uid_t uid, const std::vector<std::string>& profiles);
 
 __END_DECLS
 
-bool SetTaskProfiles(int tid, std::initializer_list<std::string_view> profiles,
+bool SetTaskProfiles(pid_t tid, std::initializer_list<std::string_view> profiles,
                      bool use_fd_cache = false);
 bool SetProcessProfiles(uid_t uid, pid_t pid, std::initializer_list<std::string_view> profiles);
 #if _LIBCPP_STD_VER > 17
-bool SetTaskProfiles(int tid, std::span<const std::string_view> profiles,
+bool SetTaskProfiles(pid_t tid, std::span<const std::string_view> profiles,
                      bool use_fd_cache = false);
 bool SetProcessProfiles(uid_t uid, pid_t pid, std::span<const std::string_view> profiles);
 #endif
@@ -65,37 +66,37 @@
 // should be active again. E.g. Zygote specialization for child process.
 void DropTaskProfilesResourceCaching();
 
-// Return 0 and removes the cgroup if there are no longer any processes in it.
-// Returns -1 in the case of an error occurring or if there are processes still running
-// even after retrying for up to 200ms.
-int killProcessGroup(uid_t uid, int initialPid, int signal);
+// Return 0 if all processes were killed and the cgroup was successfully removed.
+// Returns -1 in the case of an error occurring or if there are processes still running.
+int killProcessGroup(uid_t uid, pid_t initialPid, int signal);
 
 // Returns the same as killProcessGroup(), however it does not retry, which means
 // that it only returns 0 in the case that the cgroup exists and it contains no processes.
-int killProcessGroupOnce(uid_t uid, int initialPid, int signal);
+int killProcessGroupOnce(uid_t uid, pid_t initialPid, int signal);
 
 // Sends the provided signal to all members of a process group, but does not wait for processes to
 // exit, or for the cgroup to be removed. Callers should also ensure that killProcessGroup is called
-// later to ensure the cgroup is fully removed, otherwise system resources may leak.
-int sendSignalToProcessGroup(uid_t uid, int initialPid, int signal);
+// later to ensure the cgroup is fully removed, otherwise system resources will leak.
+// Returns true if no errors are encountered sending signals, otherwise false.
+bool sendSignalToProcessGroup(uid_t uid, pid_t initialPid, int signal);
 
-int createProcessGroup(uid_t uid, int initialPid, bool memControl = false);
+int createProcessGroup(uid_t uid, pid_t initialPid, bool memControl = false);
 
 // Set various properties of a process group. For these functions to work, the process group must
 // have been created by passing memControl=true to createProcessGroup.
-bool setProcessGroupSwappiness(uid_t uid, int initialPid, int swappiness);
-bool setProcessGroupSoftLimit(uid_t uid, int initialPid, int64_t softLimitInBytes);
-bool setProcessGroupLimit(uid_t uid, int initialPid, int64_t limitInBytes);
+bool setProcessGroupSwappiness(uid_t uid, pid_t initialPid, int swappiness);
+bool setProcessGroupSoftLimit(uid_t uid, pid_t initialPid, int64_t softLimitInBytes);
+bool setProcessGroupLimit(uid_t uid, pid_t initialPid, int64_t limitInBytes);
 
 void removeAllEmptyProcessGroups(void);
 
 // Provides the path for an attribute in a specific process group
 // Returns false in case of error, true in case of success
-bool getAttributePathForTask(const std::string& attr_name, int tid, std::string* path);
+bool getAttributePathForTask(const std::string& attr_name, pid_t tid, std::string* path);
 
 // Check if a profile can be applied without failing.
 // Returns true if it can be applied without failing, false otherwise
-bool isProfileValidForProcess(const std::string& profile_name, int uid, int pid);
+bool isProfileValidForProcess(const std::string& profile_name, uid_t uid, pid_t pid);
 
 #endif // __ANDROID_VNDK__
 
diff --git a/libprocessgroup/processgroup.cpp b/libprocessgroup/processgroup.cpp
index b4482d0..94d9502 100644
--- a/libprocessgroup/processgroup.cpp
+++ b/libprocessgroup/processgroup.cpp
@@ -22,6 +22,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <inttypes.h>
+#include <poll.h>
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -30,6 +31,7 @@
 #include <unistd.h>
 
 #include <chrono>
+#include <cstring>
 #include <map>
 #include <memory>
 #include <mutex>
@@ -53,7 +55,9 @@
 
 using namespace std::chrono_literals;
 
-#define PROCESSGROUP_CGROUP_PROCS_FILE "/cgroup.procs"
+#define PROCESSGROUP_CGROUP_PROCS_FILE "cgroup.procs"
+#define PROCESSGROUP_CGROUP_KILL_FILE "cgroup.kill"
+#define PROCESSGROUP_CGROUP_EVENTS_FILE "cgroup.events"
 
 bool CgroupsAvailable() {
     static bool cgroups_available = access("/proc/cgroups", F_OK) == 0;
@@ -74,6 +78,29 @@
     return true;
 }
 
+static std::string ConvertUidToPath(const char* cgroup, uid_t uid) {
+    return StringPrintf("%s/uid_%u", cgroup, uid);
+}
+
+static std::string ConvertUidPidToPath(const char* cgroup, uid_t uid, pid_t pid) {
+    return StringPrintf("%s/uid_%u/pid_%d", cgroup, uid, pid);
+}
+
+static bool CgroupKillAvailable() {
+    static std::once_flag f;
+    static bool cgroup_kill_available = false;
+    std::call_once(f, []() {
+        std::string cg_kill;
+        CgroupGetControllerPath(CGROUPV2_HIERARCHY_NAME, &cg_kill);
+        // cgroup.kill is not on the root cgroup, so check a non-root cgroup that should always
+        // exist
+        cg_kill = ConvertUidToPath(cg_kill.c_str(), AID_ROOT) + '/' + PROCESSGROUP_CGROUP_KILL_FILE;
+        cgroup_kill_available = access(cg_kill.c_str(), F_OK) == 0;
+    });
+
+    return cgroup_kill_available;
+}
+
 static bool CgroupGetMemcgAppsPath(std::string* path) {
     CgroupController controller = CgroupMap::GetInstance().FindController("memory");
 
@@ -120,7 +147,7 @@
     return true;
 }
 
-bool CgroupGetAttributePathForTask(const std::string& attr_name, int tid, std::string* path) {
+bool CgroupGetAttributePathForTask(const std::string& attr_name, pid_t tid, std::string* path) {
     const TaskProfiles& tp = TaskProfiles::GetInstance();
     const IProfileAttribute* attr = tp.GetAttribute(attr_name);
 
@@ -171,17 +198,18 @@
             uid, pid, std::span<const std::string>(profiles), true);
 }
 
-bool SetTaskProfiles(int tid, const std::vector<std::string>& profiles, bool use_fd_cache) {
+bool SetTaskProfiles(pid_t tid, const std::vector<std::string>& profiles, bool use_fd_cache) {
     return TaskProfiles::GetInstance().SetTaskProfiles(tid, std::span<const std::string>(profiles),
                                                        use_fd_cache);
 }
 
-bool SetTaskProfiles(int tid, std::initializer_list<std::string_view> profiles, bool use_fd_cache) {
+bool SetTaskProfiles(pid_t tid, std::initializer_list<std::string_view> profiles,
+                     bool use_fd_cache) {
     return TaskProfiles::GetInstance().SetTaskProfiles(
             tid, std::span<const std::string_view>(profiles), use_fd_cache);
 }
 
-bool SetTaskProfiles(int tid, std::span<const std::string_view> profiles, bool use_fd_cache) {
+bool SetTaskProfiles(pid_t tid, std::span<const std::string_view> profiles, bool use_fd_cache) {
     return TaskProfiles::GetInstance().SetTaskProfiles(tid, profiles, use_fd_cache);
 }
 
@@ -205,29 +233,21 @@
                                                        false);
 }
 
-static std::string ConvertUidToPath(const char* cgroup, uid_t uid) {
-    return StringPrintf("%s/uid_%u", cgroup, uid);
-}
-
-static std::string ConvertUidPidToPath(const char* cgroup, uid_t uid, int pid) {
-    return StringPrintf("%s/uid_%u/pid_%d", cgroup, uid, pid);
-}
-
-static int RemoveCgroup(const char* cgroup, uid_t uid, int pid, unsigned int retries) {
-    int ret = 0;
-    auto uid_pid_path = ConvertUidPidToPath(cgroup, uid, pid);
-
-    while (retries--) {
-        ret = rmdir(uid_pid_path.c_str());
-        if (!ret || errno != EBUSY || !retries) break;
-        std::this_thread::sleep_for(5ms);
-    }
+static int RemoveCgroup(const char* cgroup, uid_t uid, pid_t pid) {
+    auto path = ConvertUidPidToPath(cgroup, uid, pid);
+    int ret = TEMP_FAILURE_RETRY(rmdir(path.c_str()));
 
     if (!ret && uid >= AID_ISOLATED_START && uid <= AID_ISOLATED_END) {
         // Isolated UIDs are unlikely to be reused soon after removal,
         // so free up the kernel resources for the UID level cgroup.
-        const auto uid_path = ConvertUidToPath(cgroup, uid);
-        ret = rmdir(uid_path.c_str());
+        path = ConvertUidToPath(cgroup, uid);
+        ret = TEMP_FAILURE_RETRY(rmdir(path.c_str()));
+    }
+
+    if (ret < 0 && errno == ENOENT) {
+        // This function is idempoetent, but still warn here.
+        LOG(WARNING) << "RemoveCgroup: " << path << " does not exist.";
+        ret = 0;
     }
 
     return ret;
@@ -351,35 +371,55 @@
     return false;
 }
 
-// Returns number of processes killed on success
-// Returns 0 if there are no processes in the process cgroup left to kill
-// Returns -1 on error
-static int DoKillProcessGroupOnce(const char* cgroup, uid_t uid, int initialPid, int signal) {
-    // We separate all of the pids in the cgroup into those pids that are also the leaders of
-    // process groups (stored in the pgids set) and those that are not (stored in the pids set).
-    std::set<pid_t> pgids;
-    pgids.emplace(initialPid);
-    std::set<pid_t> pids;
-    int processes = 0;
-
-    std::unique_ptr<FILE, decltype(&fclose)> fd(nullptr, fclose);
+bool sendSignalToProcessGroup(uid_t uid, pid_t initialPid, int signal) {
+    std::set<pid_t> pgids, pids;
 
     if (CgroupsAvailable()) {
-        auto path = ConvertUidPidToPath(cgroup, uid, initialPid) + PROCESSGROUP_CGROUP_PROCS_FILE;
-        fd.reset(fopen(path.c_str(), "re"));
-        if (!fd) {
-            if (errno == ENOENT) {
-                // This happens when process is already dead
-                return 0;
+        std::string hierarchy_root_path, cgroup_v2_path;
+        CgroupGetControllerPath(CGROUPV2_HIERARCHY_NAME, &hierarchy_root_path);
+        cgroup_v2_path = ConvertUidPidToPath(hierarchy_root_path.c_str(), uid, initialPid);
+
+        if (signal == SIGKILL && CgroupKillAvailable()) {
+            LOG(VERBOSE) << "Using " << PROCESSGROUP_CGROUP_KILL_FILE << " to SIGKILL "
+                         << cgroup_v2_path;
+
+            // We need to kill the process group in addition to the cgroup. For normal apps they
+            // should completely overlap, but system_server kills depend on process group kills to
+            // take down apps which are in their own cgroups and not individually targeted.
+            if (kill(-initialPid, signal) == -1 && errno != ESRCH) {
+                PLOG(WARNING) << "kill(" << -initialPid << ", " << signal << ") failed";
             }
-            PLOG(WARNING) << __func__ << " failed to open process cgroup uid " << uid << " pid "
-                          << initialPid;
-            return -1;
+
+            const std::string killfilepath = cgroup_v2_path + '/' + PROCESSGROUP_CGROUP_KILL_FILE;
+            if (WriteStringToFile("1", killfilepath)) {
+                return true;
+            } else {
+                PLOG(ERROR) << "Failed to write 1 to " << killfilepath;
+                // Fallback to cgroup.procs below
+            }
         }
+
+        // Since cgroup.kill only sends SIGKILLs, we read cgroup.procs to find each process to
+        // signal individually. This is more costly than using cgroup.kill for SIGKILLs.
+        LOG(VERBOSE) << "Using " << PROCESSGROUP_CGROUP_PROCS_FILE << " to signal (" << signal
+                     << ") " << cgroup_v2_path;
+
+        // We separate all of the pids in the cgroup into those pids that are also the leaders of
+        // process groups (stored in the pgids set) and those that are not (stored in the pids set).
+        const auto procsfilepath = cgroup_v2_path + '/' + PROCESSGROUP_CGROUP_PROCS_FILE;
+        std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(procsfilepath.c_str(), "re"), fclose);
+        if (!fp) {
+            // This should only happen if the cgroup has already been removed with a successful call
+            // to killProcessGroup. Callers should only retry sendSignalToProcessGroup or
+            // killProcessGroup calls if they fail without ENOENT.
+            PLOG(ERROR) << "Failed to open " << procsfilepath;
+            kill(-initialPid, signal);
+            return false;
+        }
+
         pid_t pid;
         bool file_is_empty = true;
-        while (fscanf(fd.get(), "%d\n", &pid) == 1 && pid >= 0) {
-            processes++;
+        while (fscanf(fp.get(), "%d\n", &pid) == 1 && pid >= 0) {
             file_is_empty = false;
             if (pid == 0) {
                 // Should never happen...  but if it does, trying to kill this
@@ -409,6 +449,8 @@
         }
     }
 
+    pgids.emplace(initialPid);
+
     // Kill all process groups.
     for (const auto pgid : pgids) {
         LOG(VERBOSE) << "Killing process group " << -pgid << " in uid " << uid
@@ -429,104 +471,177 @@
         }
     }
 
-    return (!fd || feof(fd.get())) ? processes : -1;
+    return true;
 }
 
-static int KillProcessGroup(uid_t uid, int initialPid, int signal, int retries) {
+template <typename T>
+static std::chrono::milliseconds toMillisec(T&& duration) {
+    return std::chrono::duration_cast<std::chrono::milliseconds>(duration);
+}
+
+enum class populated_status
+{
+    populated,
+    not_populated,
+    error
+};
+
+static populated_status cgroupIsPopulated(int events_fd) {
+    const std::string POPULATED_KEY("populated ");
+    const std::string::size_type MAX_EVENTS_FILE_SIZE = 32;
+
+    std::string buf;
+    buf.resize(MAX_EVENTS_FILE_SIZE);
+    ssize_t len = TEMP_FAILURE_RETRY(pread(events_fd, buf.data(), buf.size(), 0));
+    if (len == -1) {
+        PLOG(ERROR) << "Could not read cgroup.events: ";
+        // Potentially ENODEV if the cgroup has been removed since we opened this file, but that
+        // shouldn't have happened yet.
+        return populated_status::error;
+    }
+
+    if (len == 0) {
+        LOG(ERROR) << "cgroup.events EOF";
+        return populated_status::error;
+    }
+
+    buf.resize(len);
+
+    const std::string::size_type pos = buf.find(POPULATED_KEY);
+    if (pos == std::string::npos) {
+        LOG(ERROR) << "Could not find populated key in cgroup.events";
+        return populated_status::error;
+    }
+
+    if (pos + POPULATED_KEY.size() + 1 > len) {
+        LOG(ERROR) << "Partial read of cgroup.events";
+        return populated_status::error;
+    }
+
+    return buf[pos + POPULATED_KEY.size()] == '1' ?
+        populated_status::populated : populated_status::not_populated;
+}
+
+// The default timeout of 2200ms comes from the default number of retries in a previous
+// implementation of this function. The default retry value was 40 for killing and 400 for cgroup
+// removal with 5ms sleeps between each retry.
+static int KillProcessGroup(
+        uid_t uid, pid_t initialPid, int signal, bool once = false,
+        std::chrono::steady_clock::time_point until = std::chrono::steady_clock::now() + 2200ms) {
     CHECK_GE(uid, 0);
     CHECK_GT(initialPid, 0);
 
+    // Always attempt to send a kill signal to at least the initialPid, at least once, regardless of
+    // whether its cgroup exists or not. This should only be necessary if a bug results in the
+    // migration of the targeted process out of its cgroup, which we will also attempt to kill.
+    const bool signal_ret = sendSignalToProcessGroup(uid, initialPid, signal);
+
+    if (!CgroupsAvailable() || !signal_ret) return signal_ret ? 0 : -1;
+
     std::string hierarchy_root_path;
-    if (CgroupsAvailable()) {
-        CgroupGetControllerPath(CGROUPV2_HIERARCHY_NAME, &hierarchy_root_path);
-    }
-    const char* cgroup = hierarchy_root_path.c_str();
+    CgroupGetControllerPath(CGROUPV2_HIERARCHY_NAME, &hierarchy_root_path);
 
-    std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
+    const std::string cgroup_v2_path =
+            ConvertUidPidToPath(hierarchy_root_path.c_str(), uid, initialPid);
 
-    int retry = retries;
-    int processes;
-    while ((processes = DoKillProcessGroupOnce(cgroup, uid, initialPid, signal)) > 0) {
-        LOG(VERBOSE) << "Killed " << processes << " processes for processgroup " << initialPid;
-        if (!CgroupsAvailable()) {
-            // makes no sense to retry, because there are no cgroup_procs file
-            processes = 0;  // no remaining processes
-            break;
-        }
-        if (retry > 0) {
-            std::this_thread::sleep_for(5ms);
-            --retry;
-        } else {
-            break;
-        }
-    }
-
-    if (processes < 0) {
-        PLOG(ERROR) << "Error encountered killing process cgroup uid " << uid << " pid "
-                    << initialPid;
+    const std::string eventsfile = cgroup_v2_path + '/' + PROCESSGROUP_CGROUP_EVENTS_FILE;
+    android::base::unique_fd events_fd(open(eventsfile.c_str(), O_RDONLY));
+    if (events_fd.get() == -1) {
+        PLOG(WARNING) << "Error opening " << eventsfile << " for KillProcessGroup";
         return -1;
     }
 
-    std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
-    auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
+    struct pollfd fds = {
+        .fd = events_fd,
+        .events = POLLPRI,
+    };
 
-    // We only calculate the number of 'processes' when killing the processes.
-    // In the retries == 0 case, we only kill the processes once and therefore
-    // will not have waited then recalculated how many processes are remaining
-    // after the first signals have been sent.
-    // Logging anything regarding the number of 'processes' here does not make sense.
+    const std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
 
-    if (processes == 0) {
-        if (retries > 0) {
-            LOG(INFO) << "Successfully killed process cgroup uid " << uid << " pid " << initialPid
-                      << " in " << static_cast<int>(ms) << "ms";
+    // The primary reason to loop here is to capture any new forks or migrations that could occur
+    // after we send signals to the original set of processes, but before all of those processes
+    // exit and the cgroup becomes unpopulated, or before we remove the cgroup. We try hard to
+    // ensure this completes successfully to avoid permanent memory leaks, but we still place a
+    // large default upper bound on the amount of time we spend in this loop. The amount of CPU
+    // contention, and the amount of work that needs to be done in do_exit for each process
+    // determines how long this will take.
+    int ret;
+    do {
+        populated_status populated;
+        while ((populated = cgroupIsPopulated(events_fd.get())) == populated_status::populated &&
+               std::chrono::steady_clock::now() < until) {
+
+            sendSignalToProcessGroup(uid, initialPid, signal);
+            if (once) {
+                populated = cgroupIsPopulated(events_fd.get());
+                break;
+            }
+
+            const std::chrono::steady_clock::time_point poll_start =
+                    std::chrono::steady_clock::now();
+
+            if (poll_start < until)
+                ret = TEMP_FAILURE_RETRY(poll(&fds, 1, toMillisec(until - poll_start).count()));
+
+            if (ret == -1) {
+                // Fallback to 5ms sleeps if poll fails
+                PLOG(ERROR) << "Poll on " << eventsfile << "failed";
+                const std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
+                if (now < until)
+                    std::this_thread::sleep_for(std::min(5ms, toMillisec(until - now)));
+            }
+
+            LOG(VERBOSE) << "Waited "
+                         << toMillisec(std::chrono::steady_clock::now() - poll_start).count()
+                         << " ms for " << eventsfile << " poll";
         }
 
-        if (!CgroupsAvailable()) {
-            // nothing to do here, if cgroups isn't available
-            return 0;
+        const std::chrono::milliseconds kill_duration =
+                toMillisec(std::chrono::steady_clock::now() - start);
+
+        if (populated == populated_status::populated) {
+            LOG(WARNING) << "Still waiting on process(es) to exit for cgroup " << cgroup_v2_path
+                         << " after " << kill_duration.count() << " ms";
+            // We'll still try the cgroup removal below which we expect to log an error.
+        } else if (populated == populated_status::not_populated) {
+            LOG(VERBOSE) << "Killed all processes under cgroup " << cgroup_v2_path
+                         << " after " << kill_duration.count() << " ms";
         }
 
-        // 400 retries correspond to 2 secs max timeout
-        int err = RemoveCgroup(cgroup, uid, initialPid, 400);
+        ret = RemoveCgroup(hierarchy_root_path.c_str(), uid, initialPid);
+        if (ret)
+            PLOG(ERROR) << "Unable to remove cgroup " << cgroup_v2_path;
+        else
+            LOG(INFO) << "Removed cgroup " << cgroup_v2_path;
 
         if (isMemoryCgroupSupported() && UsePerAppMemcg()) {
+            // This per-application memcg v1 case should eventually be removed after migration to
+            // memcg v2.
             std::string memcg_apps_path;
             if (CgroupGetMemcgAppsPath(&memcg_apps_path) &&
-                RemoveCgroup(memcg_apps_path.c_str(), uid, initialPid, 400) < 0) {
-                return -1;
+                (ret = RemoveCgroup(memcg_apps_path.c_str(), uid, initialPid)) < 0) {
+                const auto memcg_v1_cgroup_path =
+                        ConvertUidPidToPath(memcg_apps_path.c_str(), uid, initialPid);
+                PLOG(ERROR) << "Unable to remove memcg v1 cgroup " << memcg_v1_cgroup_path;
             }
         }
 
-        return err;
-    } else {
-        if (retries > 0) {
-            LOG(ERROR) << "Failed to kill process cgroup uid " << uid << " pid " << initialPid
-                       << " in " << static_cast<int>(ms) << "ms, " << processes
-                       << " processes remain";
-        }
-        return -1;
-    }
+        if (once) break;
+        if (std::chrono::steady_clock::now() >= until) break;
+    } while (ret && errno == EBUSY);
+
+    return ret;
 }
 
-int killProcessGroup(uid_t uid, int initialPid, int signal) {
-    return KillProcessGroup(uid, initialPid, signal, 40 /*retries*/);
+int killProcessGroup(uid_t uid, pid_t initialPid, int signal) {
+    return KillProcessGroup(uid, initialPid, signal);
 }
 
-int killProcessGroupOnce(uid_t uid, int initialPid, int signal) {
-    return KillProcessGroup(uid, initialPid, signal, 0 /*retries*/);
+int killProcessGroupOnce(uid_t uid, pid_t initialPid, int signal) {
+    return KillProcessGroup(uid, initialPid, signal, true);
 }
 
-int sendSignalToProcessGroup(uid_t uid, int initialPid, int signal) {
-    std::string hierarchy_root_path;
-    if (CgroupsAvailable()) {
-        CgroupGetControllerPath(CGROUPV2_HIERARCHY_NAME, &hierarchy_root_path);
-    }
-    const char* cgroup = hierarchy_root_path.c_str();
-    return DoKillProcessGroupOnce(cgroup, uid, initialPid, signal);
-}
-
-static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgroup,
+static int createProcessGroupInternal(uid_t uid, pid_t initialPid, std::string cgroup,
                                       bool activate_controllers) {
     auto uid_path = ConvertUidToPath(cgroup.c_str(), uid);
 
@@ -563,7 +678,7 @@
         return -errno;
     }
 
-    auto uid_pid_procs_file = uid_pid_path + PROCESSGROUP_CGROUP_PROCS_FILE;
+    auto uid_pid_procs_file = uid_pid_path + '/' + PROCESSGROUP_CGROUP_PROCS_FILE;
 
     if (!WriteStringToFile(std::to_string(initialPid), uid_pid_procs_file)) {
         ret = -errno;
@@ -573,7 +688,7 @@
     return ret;
 }
 
-int createProcessGroup(uid_t uid, int initialPid, bool memControl) {
+int createProcessGroup(uid_t uid, pid_t initialPid, bool memControl) {
     CHECK_GE(uid, 0);
     CHECK_GT(initialPid, 0);
 
@@ -598,7 +713,7 @@
     return createProcessGroupInternal(uid, initialPid, cgroup, true);
 }
 
-static bool SetProcessGroupValue(int tid, const std::string& attr_name, int64_t value) {
+static bool SetProcessGroupValue(pid_t tid, const std::string& attr_name, int64_t value) {
     if (!isMemoryCgroupSupported()) {
         LOG(ERROR) << "Memcg is not mounted.";
         return false;
@@ -617,23 +732,23 @@
     return true;
 }
 
-bool setProcessGroupSwappiness(uid_t, int pid, int swappiness) {
+bool setProcessGroupSwappiness(uid_t, pid_t pid, int swappiness) {
     return SetProcessGroupValue(pid, "MemSwappiness", swappiness);
 }
 
-bool setProcessGroupSoftLimit(uid_t, int pid, int64_t soft_limit_in_bytes) {
+bool setProcessGroupSoftLimit(uid_t, pid_t pid, int64_t soft_limit_in_bytes) {
     return SetProcessGroupValue(pid, "MemSoftLimit", soft_limit_in_bytes);
 }
 
-bool setProcessGroupLimit(uid_t, int pid, int64_t limit_in_bytes) {
+bool setProcessGroupLimit(uid_t, pid_t pid, int64_t limit_in_bytes) {
     return SetProcessGroupValue(pid, "MemLimit", limit_in_bytes);
 }
 
-bool getAttributePathForTask(const std::string& attr_name, int tid, std::string* path) {
+bool getAttributePathForTask(const std::string& attr_name, pid_t tid, std::string* path) {
     return CgroupGetAttributePathForTask(attr_name, tid, path);
 }
 
-bool isProfileValidForProcess(const std::string& profile_name, int uid, int pid) {
+bool isProfileValidForProcess(const std::string& profile_name, uid_t uid, pid_t pid) {
     const TaskProfile* tp = TaskProfiles::GetInstance().GetProfile(profile_name);
 
     if (tp == nullptr) {
diff --git a/libprocessgroup/profiles/cgroups.json b/libprocessgroup/profiles/cgroups.json
index d013ec8..3e4393d 100644
--- a/libprocessgroup/profiles/cgroups.json
+++ b/libprocessgroup/profiles/cgroups.json
@@ -1,6 +1,13 @@
 {
   "Cgroups": [
     {
+      "Controller": "blkio",
+      "Path": "/dev/blkio",
+      "Mode": "0775",
+      "UID": "system",
+      "GID": "system"
+    },
+    {
       "Controller": "cpu",
       "Path": "/dev/cpuctl",
       "Mode": "0755",
@@ -32,12 +39,6 @@
       {
         "Controller": "freezer",
         "Path": "."
-      },
-      {
-        "Controller": "io",
-        "Path": ".",
-        "NeedsActivation": true,
-        "Optional": true
       }
     ]
   }
diff --git a/libprocessgroup/profiles/task_profiles.json b/libprocessgroup/profiles/task_profiles.json
index 2c08b0b..1fc66ba 100644
--- a/libprocessgroup/profiles/task_profiles.json
+++ b/libprocessgroup/profiles/task_profiles.json
@@ -76,21 +76,6 @@
       "Name": "FreezerState",
       "Controller": "freezer",
       "File": "cgroup.freeze"
-    },
-    {
-      "Name": "BfqWeight",
-      "Controller": "io",
-      "File": "io.bfq.weight"
-    },
-    {
-      "Name": "CfqGroupIdle",
-      "Controller": "io",
-      "File": "io.group_idle"
-    },
-    {
-      "Name": "CfqWeight",
-      "Controller": "io",
-      "File": "io.weight"
     }
   ],
 
@@ -454,30 +439,11 @@
       "Name": "LowIoPriority",
       "Actions": [
         {
-          "Name": "SetAttribute",
+          "Name": "JoinCgroup",
           "Params":
           {
-            "Name": "BfqWeight",
-            "Value": "10",
-            "Optional": "true"
-          }
-        },
-        {
-          "Name": "SetAttribute",
-          "Params":
-          {
-            "Name": "CfqGroupIdle",
-            "Value": "0",
-            "Optional": "true"
-          }
-        },
-        {
-          "Name": "SetAttribute",
-          "Params":
-          {
-            "Name": "CfqWeight",
-            "Value": "200",
-            "Optional": "true"
+            "Controller": "blkio",
+            "Path": "background"
           }
         }
       ]
@@ -486,30 +452,11 @@
       "Name": "NormalIoPriority",
       "Actions": [
         {
-          "Name": "SetAttribute",
+          "Name": "JoinCgroup",
           "Params":
           {
-            "Name": "BfqWeight",
-            "Value": "100",
-            "Optional": "true"
-          }
-        },
-        {
-          "Name": "SetAttribute",
-          "Params":
-          {
-            "Name": "CfqGroupIdle",
-            "Value": "0",
-            "Optional": "true"
-          }
-        },
-        {
-          "Name": "SetAttribute",
-          "Params":
-          {
-            "Name": "CfqWeight",
-            "Value": "1000",
-            "Optional": "true"
+            "Controller": "blkio",
+            "Path": ""
           }
         }
       ]
@@ -518,30 +465,11 @@
       "Name": "HighIoPriority",
       "Actions": [
         {
-          "Name": "SetAttribute",
+          "Name": "JoinCgroup",
           "Params":
           {
-            "Name": "BfqWeight",
-            "Value": "100",
-            "Optional": "true"
-          }
-        },
-        {
-          "Name": "SetAttribute",
-          "Params":
-          {
-            "Name": "CfqGroupIdle",
-            "Value": "0",
-            "Optional": "true"
-          }
-        },
-        {
-          "Name": "SetAttribute",
-          "Params":
-          {
-            "Name": "CfqWeight",
-            "Value": "1000",
-            "Optional": "true"
+            "Controller": "blkio",
+            "Path": ""
           }
         }
       ]
@@ -550,30 +478,11 @@
       "Name": "MaxIoPriority",
       "Actions": [
         {
-          "Name": "SetAttribute",
+          "Name": "JoinCgroup",
           "Params":
           {
-            "Name": "BfqWeight",
-            "Value": "100",
-            "Optional": "true"
-          }
-        },
-        {
-          "Name": "SetAttribute",
-          "Params":
-          {
-            "Name": "CfqGroupIdle",
-            "Value": "0",
-            "Optional": "true"
-          }
-        },
-        {
-          "Name": "SetAttribute",
-          "Params":
-          {
-            "Name": "CfqWeight",
-            "Value": "1000",
-            "Optional": "true"
+            "Controller": "blkio",
+            "Path": ""
           }
         }
       ]
diff --git a/libprocessgroup/sched_policy.cpp b/libprocessgroup/sched_policy.cpp
index 169b1d3..1005b1e 100644
--- a/libprocessgroup/sched_policy.cpp
+++ b/libprocessgroup/sched_policy.cpp
@@ -38,7 +38,7 @@
 
 #if defined(__ANDROID__)
 
-int set_cpuset_policy(int tid, SchedPolicy policy) {
+int set_cpuset_policy(pid_t tid, SchedPolicy policy) {
     if (tid == 0) {
         tid = GetThreadId();
     }
@@ -64,7 +64,7 @@
     return 0;
 }
 
-int set_sched_policy(int tid, SchedPolicy policy) {
+int set_sched_policy(pid_t tid, SchedPolicy policy) {
     if (tid == 0) {
         tid = GetThreadId();
     }
@@ -154,7 +154,7 @@
     return enabled;
 }
 
-static int getCGroupSubsys(int tid, const char* subsys, std::string& subgroup) {
+static int getCGroupSubsys(pid_t tid, const char* subsys, std::string& subgroup) {
     auto controller = CgroupMap::GetInstance().FindController(subsys);
 
     if (!controller.IsUsable()) return -1;
@@ -185,7 +185,7 @@
     return 0;
 }
 
-int get_sched_policy(int tid, SchedPolicy* policy) {
+int get_sched_policy(pid_t tid, SchedPolicy* policy) {
     if (tid == 0) {
         tid = GetThreadId();
     }
diff --git a/libprocessgroup/task_profiles.cpp b/libprocessgroup/task_profiles.cpp
index d5bd47c..2353cf1 100644
--- a/libprocessgroup/task_profiles.cpp
+++ b/libprocessgroup/task_profiles.cpp
@@ -136,7 +136,7 @@
     return GetPathForTask(pid, path);
 }
 
-bool ProfileAttribute::GetPathForTask(int tid, std::string* path) const {
+bool ProfileAttribute::GetPathForTask(pid_t tid, std::string* path) const {
     std::string subgroup;
     if (!controller()->GetTaskGroup(tid, &subgroup)) {
         return false;
@@ -179,13 +179,13 @@
 // To avoid issues in sdk_mac build
 #if defined(__ANDROID__)
 
-bool SetTimerSlackAction::IsTimerSlackSupported(int tid) {
+bool SetTimerSlackAction::IsTimerSlackSupported(pid_t tid) {
     auto file = StringPrintf("/proc/%d/timerslack_ns", tid);
 
     return (access(file.c_str(), W_OK) == 0);
 }
 
-bool SetTimerSlackAction::ExecuteForTask(int tid) const {
+bool SetTimerSlackAction::ExecuteForTask(pid_t tid) const {
     static bool sys_supports_timerslack = IsTimerSlackSupported(tid);
 
     // v4.6+ kernels support the /proc/<tid>/timerslack_ns interface.
@@ -250,7 +250,7 @@
     return WriteValueToFile(path);
 }
 
-bool SetAttributeAction::ExecuteForTask(int tid) const {
+bool SetAttributeAction::ExecuteForTask(pid_t tid) const {
     std::string path;
 
     if (!attribute_->GetPathForTask(tid, &path)) {
@@ -288,7 +288,7 @@
     return IsValidForTask(pid);
 }
 
-bool SetAttributeAction::IsValidForTask(int tid) const {
+bool SetAttributeAction::IsValidForTask(pid_t tid) const {
     std::string path;
 
     if (!attribute_->GetPathForTask(tid, &path)) {
@@ -316,7 +316,7 @@
     FdCacheHelper::Init(controller_.GetProcsFilePath(path_, 0, 0), fd_[ProfileAction::RCT_PROCESS]);
 }
 
-bool SetCgroupAction::AddTidToCgroup(int tid, int fd, ResourceCacheType cache_type) const {
+bool SetCgroupAction::AddTidToCgroup(pid_t tid, int fd, ResourceCacheType cache_type) const {
     if (tid <= 0) {
         return true;
     }
@@ -401,7 +401,7 @@
     return true;
 }
 
-bool SetCgroupAction::ExecuteForTask(int tid) const {
+bool SetCgroupAction::ExecuteForTask(pid_t tid) const {
     CacheUseResult result = UseCachedFd(ProfileAction::RCT_TASK, tid);
     if (result != ProfileAction::UNUSED) {
         return result == ProfileAction::SUCCESS;
@@ -489,7 +489,7 @@
 }
 
 bool WriteFileAction::WriteValueToFile(const std::string& value_, ResourceCacheType cache_type,
-                                       int uid, int pid, bool logfailures) const {
+                                       uid_t uid, pid_t pid, bool logfailures) const {
     std::string value(value_);
 
     value = StringReplace(value, "<uid>", std::to_string(uid), true);
@@ -564,7 +564,7 @@
     DIR* d;
     struct dirent* de;
     char proc_path[255];
-    int t_pid;
+    pid_t t_pid;
 
     sprintf(proc_path, "/proc/%d/task", pid);
     if (!(d = opendir(proc_path))) {
@@ -590,7 +590,7 @@
     return true;
 }
 
-bool WriteFileAction::ExecuteForTask(int tid) const {
+bool WriteFileAction::ExecuteForTask(pid_t tid) const {
     return WriteValueToFile(value_, ProfileAction::RCT_TASK, getuid(), tid, logfailures_);
 }
 
@@ -655,7 +655,7 @@
     return true;
 }
 
-bool ApplyProfileAction::ExecuteForTask(int tid) const {
+bool ApplyProfileAction::ExecuteForTask(pid_t tid) const {
     for (const auto& profile : profiles_) {
         profile->ExecuteForTask(tid);
     }
@@ -683,7 +683,7 @@
     return true;
 }
 
-bool ApplyProfileAction::IsValidForTask(int tid) const {
+bool ApplyProfileAction::IsValidForTask(pid_t tid) const {
     for (const auto& profile : profiles_) {
         if (!profile->IsValidForTask(tid)) {
             return false;
@@ -707,7 +707,7 @@
     return true;
 }
 
-bool TaskProfile::ExecuteForTask(int tid) const {
+bool TaskProfile::ExecuteForTask(pid_t tid) const {
     if (tid == 0) {
         tid = GetThreadId();
     }
@@ -761,7 +761,7 @@
     return true;
 }
 
-bool TaskProfile::IsValidForTask(int tid) const {
+bool TaskProfile::IsValidForTask(pid_t tid) const {
     for (const auto& element : elements_) {
         if (!element->IsValidForTask(tid)) return false;
     }
@@ -1043,7 +1043,7 @@
 }
 
 template <typename T>
-bool TaskProfiles::SetTaskProfiles(int tid, std::span<const T> profiles, bool use_fd_cache) {
+bool TaskProfiles::SetTaskProfiles(pid_t tid, std::span<const T> profiles, bool use_fd_cache) {
     bool success = true;
     for (const auto& name : profiles) {
         TaskProfile* profile = GetProfile(name);
@@ -1069,9 +1069,9 @@
 template bool TaskProfiles::SetProcessProfiles(uid_t uid, pid_t pid,
                                                std::span<const std::string_view> profiles,
                                                bool use_fd_cache);
-template bool TaskProfiles::SetTaskProfiles(int tid, std::span<const std::string> profiles,
+template bool TaskProfiles::SetTaskProfiles(pid_t tid, std::span<const std::string> profiles,
                                             bool use_fd_cache);
-template bool TaskProfiles::SetTaskProfiles(int tid, std::span<const std::string_view> profiles,
+template bool TaskProfiles::SetTaskProfiles(pid_t tid, std::span<const std::string_view> profiles,
                                             bool use_fd_cache);
 template bool TaskProfiles::SetUserProfiles(uid_t uid, std::span<const std::string> profiles,
                                             bool use_fd_cache);
diff --git a/libprocessgroup/task_profiles.h b/libprocessgroup/task_profiles.h
index 16ffe63..2fa1931 100644
--- a/libprocessgroup/task_profiles.h
+++ b/libprocessgroup/task_profiles.h
@@ -37,7 +37,7 @@
     virtual const CgroupController* controller() const = 0;
     virtual const std::string& file_name() const = 0;
     virtual bool GetPathForProcess(uid_t uid, pid_t pid, std::string* path) const = 0;
-    virtual bool GetPathForTask(int tid, std::string* path) const = 0;
+    virtual bool GetPathForTask(pid_t tid, std::string* path) const = 0;
     virtual bool GetPathForUID(uid_t uid, std::string* path) const = 0;
 };
 
@@ -57,7 +57,7 @@
                const std::string& file_v2_name) override;
 
     bool GetPathForProcess(uid_t uid, pid_t pid, std::string* path) const override;
-    bool GetPathForTask(int tid, std::string* path) const override;
+    bool GetPathForTask(pid_t tid, std::string* path) const override;
     bool GetPathForUID(uid_t uid, std::string* path) const override;
 
   private:
@@ -83,7 +83,7 @@
     virtual void EnableResourceCaching(ResourceCacheType) {}
     virtual void DropResourceCaching(ResourceCacheType) {}
     virtual bool IsValidForProcess(uid_t uid, pid_t pid) const { return false; }
-    virtual bool IsValidForTask(int tid) const { return false; }
+    virtual bool IsValidForTask(pid_t tid) const { return false; }
 
   protected:
     enum CacheUseResult { SUCCESS, FAIL, UNUSED };
@@ -96,7 +96,7 @@
 
     const char* Name() const override { return "SetClamps"; }
     bool ExecuteForProcess(uid_t uid, pid_t pid) const override;
-    bool ExecuteForTask(int tid) const override;
+    bool ExecuteForTask(pid_t tid) const override;
 
   protected:
     int boost_;
@@ -108,14 +108,14 @@
     SetTimerSlackAction(unsigned long slack) noexcept : slack_(slack) {}
 
     const char* Name() const override { return "SetTimerSlack"; }
-    bool ExecuteForTask(int tid) const override;
+    bool ExecuteForTask(pid_t tid) const override;
     bool IsValidForProcess(uid_t uid, pid_t pid) const override { return true; }
-    bool IsValidForTask(int tid) const override { return true; }
+    bool IsValidForTask(pid_t tid) const override { return true; }
 
   private:
     unsigned long slack_;
 
-    static bool IsTimerSlackSupported(int tid);
+    static bool IsTimerSlackSupported(pid_t tid);
 };
 
 // Set attribute profile element
@@ -126,10 +126,10 @@
 
     const char* Name() const override { return "SetAttribute"; }
     bool ExecuteForProcess(uid_t uid, pid_t pid) const override;
-    bool ExecuteForTask(int tid) const override;
+    bool ExecuteForTask(pid_t tid) const override;
     bool ExecuteForUID(uid_t uid) const override;
     bool IsValidForProcess(uid_t uid, pid_t pid) const override;
-    bool IsValidForTask(int tid) const override;
+    bool IsValidForTask(pid_t tid) const override;
 
   private:
     const IProfileAttribute* attribute_;
@@ -146,11 +146,11 @@
 
     const char* Name() const override { return "SetCgroup"; }
     bool ExecuteForProcess(uid_t uid, pid_t pid) const override;
-    bool ExecuteForTask(int tid) const override;
+    bool ExecuteForTask(pid_t tid) const override;
     void EnableResourceCaching(ResourceCacheType cache_type) override;
     void DropResourceCaching(ResourceCacheType cache_type) override;
     bool IsValidForProcess(uid_t uid, pid_t pid) const override;
-    bool IsValidForTask(int tid) const override;
+    bool IsValidForTask(pid_t tid) const override;
 
     const CgroupController* controller() const { return &controller_; }
 
@@ -160,7 +160,7 @@
     android::base::unique_fd fd_[ProfileAction::RCT_COUNT];
     mutable std::mutex fd_mutex_;
 
-    bool AddTidToCgroup(int tid, int fd, ResourceCacheType cache_type) const;
+    bool AddTidToCgroup(pid_t tid, int fd, ResourceCacheType cache_type) const;
     CacheUseResult UseCachedFd(ResourceCacheType cache_type, int id) const;
 };
 
@@ -172,11 +172,11 @@
 
     const char* Name() const override { return "WriteFile"; }
     bool ExecuteForProcess(uid_t uid, pid_t pid) const override;
-    bool ExecuteForTask(int tid) const override;
+    bool ExecuteForTask(pid_t tid) const override;
     void EnableResourceCaching(ResourceCacheType cache_type) override;
     void DropResourceCaching(ResourceCacheType cache_type) override;
     bool IsValidForProcess(uid_t uid, pid_t pid) const override;
-    bool IsValidForTask(int tid) const override;
+    bool IsValidForTask(pid_t tid) const override;
 
   private:
     std::string task_path_, proc_path_, value_;
@@ -184,8 +184,8 @@
     android::base::unique_fd fd_[ProfileAction::RCT_COUNT];
     mutable std::mutex fd_mutex_;
 
-    bool WriteValueToFile(const std::string& value, ResourceCacheType cache_type, int uid, int pid,
-                          bool logfailures) const;
+    bool WriteValueToFile(const std::string& value, ResourceCacheType cache_type, uid_t uid,
+                          pid_t pid, bool logfailures) const;
     CacheUseResult UseCachedFd(ResourceCacheType cache_type, const std::string& value) const;
 };
 
@@ -198,12 +198,12 @@
     void MoveTo(TaskProfile* profile);
 
     bool ExecuteForProcess(uid_t uid, pid_t pid) const;
-    bool ExecuteForTask(int tid) const;
+    bool ExecuteForTask(pid_t tid) const;
     bool ExecuteForUID(uid_t uid) const;
     void EnableResourceCaching(ProfileAction::ResourceCacheType cache_type);
     void DropResourceCaching(ProfileAction::ResourceCacheType cache_type);
     bool IsValidForProcess(uid_t uid, pid_t pid) const;
-    bool IsValidForTask(int tid) const;
+    bool IsValidForTask(pid_t tid) const;
 
   private:
     const std::string name_;
@@ -219,11 +219,11 @@
 
     const char* Name() const override { return "ApplyProfileAction"; }
     bool ExecuteForProcess(uid_t uid, pid_t pid) const override;
-    bool ExecuteForTask(int tid) const override;
+    bool ExecuteForTask(pid_t tid) const override;
     void EnableResourceCaching(ProfileAction::ResourceCacheType cache_type) override;
     void DropResourceCaching(ProfileAction::ResourceCacheType cache_type) override;
     bool IsValidForProcess(uid_t uid, pid_t pid) const override;
-    bool IsValidForTask(int tid) const override;
+    bool IsValidForTask(pid_t tid) const override;
 
   private:
     std::vector<std::shared_ptr<TaskProfile>> profiles_;
@@ -240,7 +240,7 @@
     template <typename T>
     bool SetProcessProfiles(uid_t uid, pid_t pid, std::span<const T> profiles, bool use_fd_cache);
     template <typename T>
-    bool SetTaskProfiles(int tid, std::span<const T> profiles, bool use_fd_cache);
+    bool SetTaskProfiles(pid_t tid, std::span<const T> profiles, bool use_fd_cache);
     template <typename T>
     bool SetUserProfiles(uid_t uid, std::span<const T> profiles, bool use_fd_cache);
 
diff --git a/libstats/pull_rust/Android.bp b/libstats/pull_rust/Android.bp
index 4609e6b..6902026 100644
--- a/libstats/pull_rust/Android.bp
+++ b/libstats/pull_rust/Android.bp
@@ -60,8 +60,8 @@
     crate_name: "statspull_rust",
     srcs: ["stats_pull.rs"],
     rustlibs: [
-        "liblazy_static",
         "liblog_rust",
+        "libonce_cell",
         "libstatslog_rust_header",
         "libstatspull_bindgen",
     ],
diff --git a/libstats/pull_rust/stats_pull.rs b/libstats/pull_rust/stats_pull.rs
index d188b5f..b2bebcc 100644
--- a/libstats/pull_rust/stats_pull.rs
+++ b/libstats/pull_rust/stats_pull.rs
@@ -14,7 +14,7 @@
 
 //! A Rust interface for the StatsD pull API.
 
-use lazy_static::lazy_static;
+use once_cell::sync::Lazy;
 use statslog_rust_header::{Atoms, Stat, StatsError};
 use statspull_bindgen::*;
 use std::collections::HashMap;
@@ -107,9 +107,8 @@
     }
 }
 
-lazy_static! {
-    static ref COOKIES: Mutex<HashMap<i32, fn() -> StatsPullResult>> = Mutex::new(HashMap::new());
-}
+static COOKIES: Lazy<Mutex<HashMap<i32, fn() -> StatsPullResult>>> =
+    Lazy::new(|| Mutex::new(HashMap::new()));
 
 /// # Safety
 ///
diff --git a/libstats/socket_lazy/libstatssocket_lazy.cpp b/libstats/socket_lazy/libstatssocket_lazy.cpp
index dd93eeb..fe94ef2 100644
--- a/libstats/socket_lazy/libstatssocket_lazy.cpp
+++ b/libstats/socket_lazy/libstatssocket_lazy.cpp
@@ -45,6 +45,7 @@
     k_AStatsEvent_writeBool,
     k_AStatsEvent_writeByteArray,
     k_AStatsEvent_writeString,
+    k_AStatsEvent_writeStringArray,
     k_AStatsEvent_writeAttributionChain,
     k_AStatsEvent_addBoolAnnotation,
     k_AStatsEvent_addInt32Annotation,
@@ -104,6 +105,7 @@
     BIND_SYMBOL(AStatsEvent_writeBool);
     BIND_SYMBOL(AStatsEvent_writeByteArray);
     BIND_SYMBOL(AStatsEvent_writeString);
+    BIND_SYMBOL(AStatsEvent_writeStringArray);
     BIND_SYMBOL(AStatsEvent_writeAttributionChain);
     BIND_SYMBOL(AStatsEvent_addBoolAnnotation);
     BIND_SYMBOL(AStatsEvent_addInt32Annotation);
@@ -179,6 +181,11 @@
     INVOKE_METHOD(AStatsEvent_writeString, event, value);
 }
 
+void AStatsEvent_writeStringArray(AStatsEvent* event, const char* const* elements,
+                                  size_t numElements) {
+    INVOKE_METHOD(AStatsEvent_writeStringArray, event, elements, numElements);
+}
+
 void AStatsEvent_writeAttributionChain(AStatsEvent* event, const uint32_t* uids,
                                        const char* const* tags, uint8_t numNodes) {
     INVOKE_METHOD(AStatsEvent_writeAttributionChain, event, uids, tags, numNodes);
@@ -198,4 +205,4 @@
 
 void AStatsSocket_close() {
     INVOKE_METHOD(AStatsSocket_close);
-}
\ No newline at end of file
+}
diff --git a/libstats/socket_lazy/tests/libstatssocket_lazy_test.cpp b/libstats/socket_lazy/tests/libstatssocket_lazy_test.cpp
index fe13598..3de6cd7 100644
--- a/libstats/socket_lazy/tests/libstatssocket_lazy_test.cpp
+++ b/libstats/socket_lazy/tests/libstatssocket_lazy_test.cpp
@@ -47,6 +47,7 @@
     EXPECT_DEATH(AStatsEvent_writeBool(event, false), kLoadFailed);
     EXPECT_DEATH(AStatsEvent_writeByteArray(event, NULL, 0), kLoadFailed);
     EXPECT_DEATH(AStatsEvent_writeString(event, NULL), kLoadFailed);
+    EXPECT_DEATH(AStatsEvent_writeStringArray(event, NULL, 0), kLoadFailed);
     EXPECT_DEATH(AStatsEvent_writeAttributionChain(event, NULL, NULL, 0), kLoadFailed);
 
     EXPECT_DEATH(AStatsEvent_addBoolAnnotation(event, 0, false), kLoadFailed);
@@ -55,4 +56,4 @@
 
 TEST_F(LibstatssocketLazyTest, NoLibstatssocketForStatsSocket) {
     EXPECT_DEATH(AStatsSocket_close(), kLoadFailed);
-}
\ No newline at end of file
+}
diff --git a/libutils/Android.bp b/libutils/Android.bp
index 4d4294b..ad5b752 100644
--- a/libutils/Android.bp
+++ b/libutils/Android.bp
@@ -56,7 +56,7 @@
 }
 
 cc_defaults {
-    name: "libutils_defaults",
+    name: "libutils_defaults_nodeps",
     vendor_available: true,
     product_available: true,
     recovery_available: true,
@@ -69,10 +69,6 @@
         "-DANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION",
     ],
 
-    shared_libs: [
-        "libcutils",
-        "liblog",
-    ],
     sanitize: {
         misc_undefined: ["integer"],
     },
@@ -118,6 +114,18 @@
 }
 
 cc_defaults {
+    name: "libutils_defaults",
+    defaults: [
+        "libutils_defaults_nodeps",
+    ],
+
+    shared_libs: [
+        "libcutils",
+        "liblog",
+    ],
+}
+
+cc_defaults {
     name: "libutils_impl_defaults",
     defaults: [
         "libutils_defaults",
@@ -183,6 +191,7 @@
     target: {
         product: {
             header_abi_checker: {
+                enabled: true,
                 // AFDO affects weak symbols.
                 diff_flags: ["-allow-adding-removing-weak-symbols"],
                 ref_dump_dirs: ["abi-dumps"],
@@ -190,6 +199,7 @@
         },
         vendor: {
             header_abi_checker: {
+                enabled: true,
                 // AFDO affects weak symbols.
                 diff_flags: ["-allow-adding-removing-weak-symbols"],
                 ref_dump_dirs: ["abi-dumps"],
@@ -203,6 +213,7 @@
     defaults: ["libutils_impl_defaults"],
 
     cflags: [
+        "-DDEBUG_CALLBACKS=1",
         "-DDEBUG_POLL_AND_WAKE=1",
         "-DDEBUG_REFS=1",
         "-DDEBUG_TOKENIZER=1",
diff --git a/libutils/Looper.cpp b/libutils/Looper.cpp
index 402e43c..7700c90 100644
--- a/libutils/Looper.cpp
+++ b/libutils/Looper.cpp
@@ -532,9 +532,33 @@
     return removeSequenceNumberLocked(it->second);
 }
 
+int Looper::repoll(int fd) {
+    AutoMutex _l(mLock);
+    const auto& it = mSequenceNumberByFd.find(fd);
+    if (it == mSequenceNumberByFd.end()) {
+        return 0;
+    }
+
+    const auto& request_it = mRequests.find(it->second);
+    if (request_it == mRequests.end()) {
+        return 0;
+    }
+    const auto& [seq, request] = *request_it;
+
+    LOG_ALWAYS_FATAL_IF(
+            fd != request.fd,
+            "Looper has inconsistent data structure. When looking up FD %d found FD %d.", fd,
+            request_it->second.fd);
+
+    epoll_event eventItem = createEpollEvent(request.getEpollEvents(), seq);
+    if (epoll_ctl(mEpollFd.get(), EPOLL_CTL_MOD, fd, &eventItem) == -1) return 0;
+
+    return 1;  // success
+}
+
 int Looper::removeSequenceNumberLocked(SequenceNumber seq) {
 #if DEBUG_CALLBACKS
-    ALOGD("%p ~ removeFd - fd=%d, seq=%u", this, fd, seq);
+    ALOGD("%p ~ removeFd - seq=%" PRIu64, this, seq);
 #endif
 
     const auto& request_it = mRequests.find(seq);
diff --git a/libutils/StopWatch.cpp b/libutils/StopWatch.cpp
index c88d60f..c91cd5c 100644
--- a/libutils/StopWatch.cpp
+++ b/libutils/StopWatch.cpp
@@ -18,10 +18,6 @@
 
 #include <utils/StopWatch.h>
 
-/* for PRId64 */
-#ifndef __STDC_FORMAT_MACROS
-#define __STDC_FORMAT_MACROS 1
-#endif
 #include <inttypes.h>
 
 #include <log/log.h>
diff --git a/libutils/abi-dumps/arm64/source-based/libutils.so.lsdump b/libutils/abi-dumps/arm64/source-based/libutils.so.lsdump
index 8881b44..82ddca8 100644
--- a/libutils/abi-dumps/arm64/source-based/libutils.so.lsdump
+++ b/libutils/abi-dumps/arm64/source-based/libutils.so.lsdump
@@ -16,7 +16,7 @@
    "referenced_type" : "_ZTIDs",
    "self_type" : "_ZTIA1_Ds",
    "size" : 2,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 1,
@@ -46,6 +46,7 @@
    "source_file" : "system/core/libsystem/include/system/graphics.h"
   },
   {
+   "is_of_unknown_bound" : true,
    "linker_set_key" : "_ZTIA_f",
    "name" : "float[]",
    "referenced_type" : "_ZTIf",
@@ -491,6 +492,18 @@
    "name" : "_ZN7android27add_sysprop_change_callbackEPFvvEi"
   },
   {
+   "binding" : "weak",
+   "name" : "_ZN7android2spINS_14LooperCallbackEE5clearEv"
+  },
+  {
+   "binding" : "weak",
+   "name" : "_ZN7android2spINS_6LooperEEaSEOS2_"
+  },
+  {
+   "binding" : "weak",
+   "name" : "_ZN7android2spINS_6ThreadEE5clearEv"
+  },
+  {
    "name" : "_ZN7android30get_report_sysprop_change_funcEv"
   },
   {
@@ -545,6 +558,9 @@
    "name" : "_ZN7android6Looper6awokenEv"
   },
   {
+   "name" : "_ZN7android6Looper6repollEi"
+  },
+  {
    "name" : "_ZN7android6Looper7pollAllEiPiS1_PPv"
   },
   {
@@ -1216,6 +1232,14 @@
   },
   {
    "binding" : "weak",
+   "name" : "_ZNSt3__112__hash_tableINS_17__hash_value_typeImN7android6Looper7RequestEEENS_22__unordered_map_hasherImS5_NS_4hashImEELb1EEENS_21__unordered_map_equalImS5_NS_8equal_toImEELb1EEENS_9allocatorIS5_EEE4findImEENS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEERKT_"
+  },
+  {
+   "binding" : "weak",
+   "name" : "_ZNSt3__112__hash_tableINS_17__hash_value_typeImN7android6Looper7RequestEEENS_22__unordered_map_hasherImS5_NS_4hashImEELb1EEENS_21__unordered_map_equalImS5_NS_8equal_toImEELb1EEENS_9allocatorIS5_EEE5eraseENS_21__hash_const_iteratorIPNS_11__hash_nodeIS5_PvEEEE"
+  },
+  {
+   "binding" : "weak",
    "name" : "_ZNSt3__112__hash_tableINS_17__hash_value_typeImN7android6Looper7RequestEEENS_22__unordered_map_hasherImS5_NS_4hashImEELb1EEENS_21__unordered_map_equalImS5_NS_8equal_toImEELb1EEENS_9allocatorIS5_EEE6rehashEm"
   },
   {
@@ -1411,6 +1435,10 @@
   },
   {
    "name" : "_ZTVN7android9FdPrinterE"
+  },
+  {
+   "binding" : "weak",
+   "name" : "__llvm_fs_discriminator__"
   }
  ],
  "enum_types" :
@@ -2251,6 +2279,23 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 13,
+     "name" : "HAL_COLOR_MODE_DISPLAY_BT2020"
+    }
+   ],
+   "linker_set_key" : "_ZTI25android_color_mode_v1_2_t",
+   "name" : "android_color_mode_v1_2_t",
+   "referenced_type" : "_ZTI25android_color_mode_v1_2_t",
+   "self_type" : "_ZTI25android_color_mode_v1_2_t",
+   "size" : 4,
+   "source_file" : "system/core/libsystem/include/system/graphics-base-v1.2.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 0,
      "name" : "HAL_COLOR_TRANSFORM_IDENTITY"
     },
@@ -2490,6 +2535,31 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 1,
+     "name" : "android::VectorImpl::HAS_TRIVIAL_CTOR"
+    },
+    {
+     "enum_field_value" : 2,
+     "name" : "android::VectorImpl::HAS_TRIVIAL_DTOR"
+    },
+    {
+     "enum_field_value" : 4,
+     "name" : "android::VectorImpl::HAS_TRIVIAL_COPY"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android10VectorImpl17$HAS_TRIVIAL_COPYE",
+   "name" : "android::VectorImpl::(unnamed)",
+   "referenced_type" : "_ZTIN7android10VectorImpl17$HAS_TRIVIAL_COPYE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android10VectorImpl17$HAS_TRIVIAL_COPYE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 0,
      "name" : "android::trait_pointer<android::sysprop_change_callback_info>::value"
     }
@@ -2634,6 +2704,99 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 0,
+     "name" : "android::OK"
+    },
+    {
+     "enum_field_value" : 0,
+     "name" : "android::NO_ERROR"
+    },
+    {
+     "enum_field_value" : -2147483648,
+     "name" : "android::UNKNOWN_ERROR"
+    },
+    {
+     "enum_field_value" : -12,
+     "name" : "android::NO_MEMORY"
+    },
+    {
+     "enum_field_value" : -38,
+     "name" : "android::INVALID_OPERATION"
+    },
+    {
+     "enum_field_value" : -22,
+     "name" : "android::BAD_VALUE"
+    },
+    {
+     "enum_field_value" : -2147483647,
+     "name" : "android::BAD_TYPE"
+    },
+    {
+     "enum_field_value" : -2,
+     "name" : "android::NAME_NOT_FOUND"
+    },
+    {
+     "enum_field_value" : -1,
+     "name" : "android::PERMISSION_DENIED"
+    },
+    {
+     "enum_field_value" : -19,
+     "name" : "android::NO_INIT"
+    },
+    {
+     "enum_field_value" : -17,
+     "name" : "android::ALREADY_EXISTS"
+    },
+    {
+     "enum_field_value" : -32,
+     "name" : "android::DEAD_OBJECT"
+    },
+    {
+     "enum_field_value" : -2147483646,
+     "name" : "android::FAILED_TRANSACTION"
+    },
+    {
+     "enum_field_value" : -75,
+     "name" : "android::BAD_INDEX"
+    },
+    {
+     "enum_field_value" : -61,
+     "name" : "android::NOT_ENOUGH_DATA"
+    },
+    {
+     "enum_field_value" : -11,
+     "name" : "android::WOULD_BLOCK"
+    },
+    {
+     "enum_field_value" : -110,
+     "name" : "android::TIMED_OUT"
+    },
+    {
+     "enum_field_value" : -74,
+     "name" : "android::UNKNOWN_TRANSACTION"
+    },
+    {
+     "enum_field_value" : -2147483641,
+     "name" : "android::FDS_NOT_ALLOWED"
+    },
+    {
+     "enum_field_value" : -2147483640,
+     "name" : "android::UNEXPECTED_NULL"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android15$ALREADY_EXISTSE",
+   "name" : "android::(unnamed)",
+   "referenced_type" : "_ZTIN7android15$ALREADY_EXISTSE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/Errors.sdump",
+   "self_type" : "_ZTIN7android15$ALREADY_EXISTSE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/Errors.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/Errors.h",
+   "underlying_type" : "_ZTIi"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 19,
      "name" : "android::PRIORITY_LOWEST"
     },
@@ -2764,6 +2927,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<bool>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIbE6$valueE",
+   "name" : "android::trait_trivial_copy<bool>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<char>::value"
     }
    ],
@@ -2781,6 +2961,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIcE6$valueE",
+   "name" : "android::trait_trivial_copy<char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<double>::value"
     }
    ],
@@ -2798,6 +2995,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<double>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIdE6$valueE",
+   "name" : "android::trait_trivial_copy<double>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<float>::value"
     }
    ],
@@ -2815,6 +3029,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<float>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIfE6$valueE",
+   "name" : "android::trait_trivial_copy<float>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<unsigned char>::value"
     }
    ],
@@ -2832,6 +3063,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<unsigned char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIhE6$valueE",
+   "name" : "android::trait_trivial_copy<unsigned char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<int>::value"
     }
    ],
@@ -2849,6 +3097,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIiE6$valueE",
+   "name" : "android::trait_trivial_copy<int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<unsigned int>::value"
     }
    ],
@@ -2866,6 +3131,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<unsigned int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIjE6$valueE",
+   "name" : "android::trait_trivial_copy<unsigned int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<long>::value"
     }
    ],
@@ -2883,6 +3165,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIlE6$valueE",
+   "name" : "android::trait_trivial_copy<long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<unsigned long>::value"
     }
    ],
@@ -2900,6 +3199,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<unsigned long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyImE6$valueE",
+   "name" : "android::trait_trivial_copy<unsigned long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<short>::value"
     }
    ],
@@ -2917,6 +3233,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIsE6$valueE",
+   "name" : "android::trait_trivial_copy<short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<unsigned short>::value"
     }
    ],
@@ -2934,6 +3267,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<unsigned short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyItE6$valueE",
+   "name" : "android::trait_trivial_copy<unsigned short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<void>::value"
     }
    ],
@@ -2951,6 +3301,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<void>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIvE6$valueE",
+   "name" : "android::trait_trivial_copy<void>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<long long>::value"
     }
    ],
@@ -2968,6 +3335,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIxE6$valueE",
+   "name" : "android::trait_trivial_copy<long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<unsigned long long>::value"
     }
    ],
@@ -2984,6 +3368,23 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<unsigned long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIyE6$valueE",
+   "name" : "android::trait_trivial_copy<unsigned long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 0,
      "name" : "android::trait_trivial_ctor<android::sysprop_change_callback_info>::value"
     }
@@ -3053,6 +3454,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<bool>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIbE6$valueE",
+   "name" : "android::trait_trivial_ctor<bool>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<char>::value"
     }
    ],
@@ -3070,6 +3488,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIcE6$valueE",
+   "name" : "android::trait_trivial_ctor<char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<double>::value"
     }
    ],
@@ -3087,6 +3522,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<double>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIdE6$valueE",
+   "name" : "android::trait_trivial_ctor<double>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<float>::value"
     }
    ],
@@ -3104,6 +3556,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<float>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIfE6$valueE",
+   "name" : "android::trait_trivial_ctor<float>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<unsigned char>::value"
     }
    ],
@@ -3121,6 +3590,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<unsigned char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIhE6$valueE",
+   "name" : "android::trait_trivial_ctor<unsigned char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<int>::value"
     }
    ],
@@ -3138,6 +3624,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIiE6$valueE",
+   "name" : "android::trait_trivial_ctor<int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<unsigned int>::value"
     }
    ],
@@ -3155,6 +3658,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<unsigned int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIjE6$valueE",
+   "name" : "android::trait_trivial_ctor<unsigned int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<long>::value"
     }
    ],
@@ -3172,6 +3692,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIlE6$valueE",
+   "name" : "android::trait_trivial_ctor<long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<unsigned long>::value"
     }
    ],
@@ -3189,6 +3726,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<unsigned long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorImE6$valueE",
+   "name" : "android::trait_trivial_ctor<unsigned long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<short>::value"
     }
    ],
@@ -3206,6 +3760,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIsE6$valueE",
+   "name" : "android::trait_trivial_ctor<short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<unsigned short>::value"
     }
    ],
@@ -3223,6 +3794,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<unsigned short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorItE6$valueE",
+   "name" : "android::trait_trivial_ctor<unsigned short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<void>::value"
     }
    ],
@@ -3240,6 +3828,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<void>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIvE6$valueE",
+   "name" : "android::trait_trivial_ctor<void>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<long long>::value"
     }
    ],
@@ -3257,6 +3862,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIxE6$valueE",
+   "name" : "android::trait_trivial_ctor<long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<unsigned long long>::value"
     }
    ],
@@ -3273,6 +3895,23 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<unsigned long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIyE6$valueE",
+   "name" : "android::trait_trivial_ctor<unsigned long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 0,
      "name" : "android::trait_trivial_dtor<android::sysprop_change_callback_info>::value"
     }
@@ -3342,6 +3981,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<bool>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIbE6$valueE",
+   "name" : "android::trait_trivial_dtor<bool>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<char>::value"
     }
    ],
@@ -3359,6 +4015,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIcE6$valueE",
+   "name" : "android::trait_trivial_dtor<char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<double>::value"
     }
    ],
@@ -3376,6 +4049,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<double>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIdE6$valueE",
+   "name" : "android::trait_trivial_dtor<double>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<float>::value"
     }
    ],
@@ -3393,6 +4083,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<float>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIfE6$valueE",
+   "name" : "android::trait_trivial_dtor<float>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<unsigned char>::value"
     }
    ],
@@ -3410,6 +4117,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<unsigned char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIhE6$valueE",
+   "name" : "android::trait_trivial_dtor<unsigned char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<int>::value"
     }
    ],
@@ -3427,6 +4151,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIiE6$valueE",
+   "name" : "android::trait_trivial_dtor<int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<unsigned int>::value"
     }
    ],
@@ -3444,6 +4185,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<unsigned int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIjE6$valueE",
+   "name" : "android::trait_trivial_dtor<unsigned int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<long>::value"
     }
    ],
@@ -3461,6 +4219,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIlE6$valueE",
+   "name" : "android::trait_trivial_dtor<long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<unsigned long>::value"
     }
    ],
@@ -3478,6 +4253,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<unsigned long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorImE6$valueE",
+   "name" : "android::trait_trivial_dtor<unsigned long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<short>::value"
     }
    ],
@@ -3495,6 +4287,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIsE6$valueE",
+   "name" : "android::trait_trivial_dtor<short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<unsigned short>::value"
     }
    ],
@@ -3512,6 +4321,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<unsigned short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorItE6$valueE",
+   "name" : "android::trait_trivial_dtor<unsigned short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<void>::value"
     }
    ],
@@ -3529,6 +4355,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<void>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIvE6$valueE",
+   "name" : "android::trait_trivial_dtor<void>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<long long>::value"
     }
    ],
@@ -3546,6 +4389,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIxE6$valueE",
+   "name" : "android::trait_trivial_dtor<long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<unsigned long long>::value"
     }
    ],
@@ -3562,6 +4422,23 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<unsigned long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIyE6$valueE",
+   "name" : "android::trait_trivial_dtor<unsigned long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 0,
      "name" : "android::trait_trivial_move<android::sysprop_change_callback_info>::value"
     }
@@ -3631,6 +4508,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<android::String8>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveINS_7String8EE6$valueE",
+   "name" : "android::trait_trivial_move<android::String8>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveINS_7String8EE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveINS_7String8EE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<android::String16>::value"
     }
    ],
@@ -3639,7 +4533,7 @@
    "referenced_type" : "_ZTIN7android18trait_trivial_moveINS_8String16EE6$valueE",
    "self_type" : "_ZTIN7android18trait_trivial_moveINS_8String16EE6$valueE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String16.h",
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h",
    "underlying_type" : "_ZTIj"
   },
   {
@@ -3665,6 +4559,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<bool>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIbE6$valueE",
+   "name" : "android::trait_trivial_move<bool>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<char>::value"
     }
    ],
@@ -3682,6 +4593,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIcE6$valueE",
+   "name" : "android::trait_trivial_move<char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<double>::value"
     }
    ],
@@ -3699,6 +4627,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<double>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIdE6$valueE",
+   "name" : "android::trait_trivial_move<double>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<float>::value"
     }
    ],
@@ -3716,6 +4661,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<float>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIfE6$valueE",
+   "name" : "android::trait_trivial_move<float>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<unsigned char>::value"
     }
    ],
@@ -3733,6 +4695,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<unsigned char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIhE6$valueE",
+   "name" : "android::trait_trivial_move<unsigned char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<int>::value"
     }
    ],
@@ -3750,6 +4729,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIiE6$valueE",
+   "name" : "android::trait_trivial_move<int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<unsigned int>::value"
     }
    ],
@@ -3767,6 +4763,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<unsigned int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIjE6$valueE",
+   "name" : "android::trait_trivial_move<unsigned int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<long>::value"
     }
    ],
@@ -3784,6 +4797,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIlE6$valueE",
+   "name" : "android::trait_trivial_move<long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<unsigned long>::value"
     }
    ],
@@ -3801,6 +4831,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<unsigned long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveImE6$valueE",
+   "name" : "android::trait_trivial_move<unsigned long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<short>::value"
     }
    ],
@@ -3818,6 +4865,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIsE6$valueE",
+   "name" : "android::trait_trivial_move<short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<unsigned short>::value"
     }
    ],
@@ -3835,6 +4899,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<unsigned short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveItE6$valueE",
+   "name" : "android::trait_trivial_move<unsigned short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<void>::value"
     }
    ],
@@ -3852,6 +4933,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<void>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIvE6$valueE",
+   "name" : "android::trait_trivial_move<void>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<long long>::value"
     }
    ],
@@ -3869,6 +4967,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIxE6$valueE",
+   "name" : "android::trait_trivial_move<long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<unsigned long long>::value"
     }
    ],
@@ -3885,6 +5000,23 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<unsigned long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIyE6$valueE",
+   "name" : "android::trait_trivial_move<unsigned long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 0,
      "name" : "android::Mutex::PRIVATE"
     },
@@ -4157,6 +5289,24 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 1,
+     "name" : "android::RefBase::FIRST_INC_STRONG"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android7RefBase17$FIRST_INC_STRONGE",
+   "name" : "android::RefBase::(unnamed)",
+   "referenced_type" : "_ZTIN7android7RefBase17$FIRST_INC_STRONGE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android7RefBase17$FIRST_INC_STRONGE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "access" : "protected",
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 0,
      "name" : "android::RefBase::OBJECT_LIFETIME_STRONG"
     },
@@ -4178,6 +5328,32 @@
    "underlying_type" : "_ZTIj"
   },
   {
+   "access" : "protected",
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 0,
+     "name" : "android::RefBase::OBJECT_LIFETIME_STRONG"
+    },
+    {
+     "enum_field_value" : 1,
+     "name" : "android::RefBase::OBJECT_LIFETIME_WEAK"
+    },
+    {
+     "enum_field_value" : 1,
+     "name" : "android::RefBase::OBJECT_LIFETIME_MASK"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android7RefBase21$OBJECT_LIFETIME_MASKE",
+   "name" : "android::RefBase::(unnamed)",
+   "referenced_type" : "_ZTIN7android7RefBase21$OBJECT_LIFETIME_MASKE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android7RefBase21$OBJECT_LIFETIME_MASKE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
    "alignment" : 4,
    "enum_fields" :
    [
@@ -4286,7 +5462,7 @@
    "referenced_type" : "_ZTIFiPKvS0_E",
    "return_type" : "_ZTIi",
    "self_type" : "_ZTIFiPKvS0_E",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 4,
@@ -4307,7 +5483,7 @@
    "referenced_type" : "_ZTIFiPKvS0_PvE",
    "return_type" : "_ZTIi",
    "self_type" : "_ZTIFiPKvS0_PvE",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 4,
@@ -4463,7 +5639,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::setCapacity",
@@ -4479,7 +5655,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::appendVector",
@@ -4495,7 +5671,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::editArrayImpl",
@@ -4508,7 +5684,7 @@
     }
    ],
    "return_type" : "_ZTIPv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::finish_vector",
@@ -4521,7 +5697,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::insertArrayAt",
@@ -4543,7 +5719,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::removeItemsAt",
@@ -4563,7 +5739,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::insertVectorAt",
@@ -4582,7 +5758,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "access" : "protected",
@@ -4596,7 +5772,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::editItemLocation",
@@ -4612,7 +5788,7 @@
     }
    ],
    "return_type" : "_ZTIPv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::add",
@@ -4628,7 +5804,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::add",
@@ -4641,7 +5817,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::pop",
@@ -4654,7 +5830,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::push",
@@ -4670,7 +5846,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::push",
@@ -4683,7 +5859,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::sort",
@@ -4699,7 +5875,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::sort",
@@ -4718,7 +5894,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "access" : "private",
@@ -4738,7 +5914,7 @@
     }
    ],
    "return_type" : "_ZTIPv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::clear",
@@ -4751,7 +5927,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::resize",
@@ -4767,7 +5943,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "access" : "private",
@@ -4787,7 +5963,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::insertAt",
@@ -4810,7 +5986,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::insertAt",
@@ -4830,7 +6006,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::replaceAt",
@@ -4849,7 +6025,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::replaceAt",
@@ -4865,7 +6041,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::VectorImpl",
@@ -4881,7 +6057,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::VectorImpl",
@@ -4900,7 +6076,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::~VectorImpl",
@@ -4913,7 +6089,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::~VectorImpl",
@@ -4926,7 +6102,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::~VectorImpl",
@@ -4939,7 +6115,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::operator=",
@@ -4955,7 +6131,7 @@
     }
    ],
    "return_type" : "_ZTIRN7android10VectorImplE",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::uptimeNanos",
@@ -5256,7 +6432,7 @@
     }
    ],
    "return_type" : "_ZTINSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE",
-   "source_file" : "system/core/libutils/include/utils/Errors.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Errors.h"
   },
   {
    "function_name" : "android::elapsedRealtime",
@@ -5278,7 +6454,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::merge",
@@ -5294,7 +6470,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::merge",
@@ -5310,7 +6486,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::remove",
@@ -5326,7 +6502,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::SortedVectorImpl",
@@ -5342,7 +6518,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::SortedVectorImpl",
@@ -5361,7 +6537,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::~SortedVectorImpl",
@@ -5374,7 +6550,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::~SortedVectorImpl",
@@ -5387,7 +6563,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::~SortedVectorImpl",
@@ -5400,7 +6576,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::operator=",
@@ -5416,7 +6592,7 @@
     }
    ],
    "return_type" : "_ZTIRN7android16SortedVectorImplE",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::JenkinsHashWhiten",
@@ -5680,6 +6856,48 @@
    "source_file" : "system/core/libutils/include/utils/misc.h"
   },
   {
+   "function_name" : "android::sp<android::LooperCallback>::clear",
+   "linker_set_key" : "_ZN7android2spINS_14LooperCallbackEE5clearEv",
+   "parameters" :
+   [
+    {
+     "is_this_ptr" : true,
+     "referenced_type" : "_ZTIPN7android2spINS_14LooperCallbackEEE"
+    }
+   ],
+   "return_type" : "_ZTIv",
+   "source_file" : "system/core/libutils/include/utils/StrongPointer.h"
+  },
+  {
+   "function_name" : "android::sp<android::Looper>::operator=",
+   "linker_set_key" : "_ZN7android2spINS_6LooperEEaSEOS2_",
+   "parameters" :
+   [
+    {
+     "is_this_ptr" : true,
+     "referenced_type" : "_ZTIPN7android2spINS_6LooperEEE"
+    },
+    {
+     "referenced_type" : "_ZTION7android2spINS_6LooperEEE"
+    }
+   ],
+   "return_type" : "_ZTIRN7android2spINS_6LooperEEE",
+   "source_file" : "system/core/libutils/include/utils/StrongPointer.h"
+  },
+  {
+   "function_name" : "android::sp<android::Thread>::clear",
+   "linker_set_key" : "_ZN7android2spINS_6ThreadEE5clearEv",
+   "parameters" :
+   [
+    {
+     "is_this_ptr" : true,
+     "referenced_type" : "_ZTIPN7android2spINS_6ThreadEEE"
+    }
+   ],
+   "return_type" : "_ZTIv",
+   "source_file" : "system/core/libutils/include/utils/StrongPointer.h"
+  },
+  {
    "function_name" : "android::LightRefBase_reportIncStrongRequireStrongFailed",
    "linker_set_key" : "_ZN7android47LightRefBase_reportIncStrongRequireStrongFailedEPKv",
    "parameters" :
@@ -5956,6 +7174,22 @@
    "source_file" : "system/core/libutils/include/utils/Looper.h"
   },
   {
+   "function_name" : "android::Looper::repoll",
+   "linker_set_key" : "_ZN7android6Looper6repollEi",
+   "parameters" :
+   [
+    {
+     "is_this_ptr" : true,
+     "referenced_type" : "_ZTIPN7android6LooperE"
+    },
+    {
+     "referenced_type" : "_ZTIi"
+    }
+   ],
+   "return_type" : "_ZTIi",
+   "source_file" : "system/core/libutils/include/utils/Looper.h"
+  },
+  {
    "function_name" : "android::Looper::pollAll",
    "linker_set_key" : "_ZN7android6Looper7pollAllEiPiS1_PPv",
    "parameters" :
@@ -6493,11 +7727,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "private",
@@ -6513,7 +7747,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "private",
@@ -6522,7 +7756,7 @@
    "parameters" :
    [
     {
-     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE"
+     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
@@ -6532,7 +7766,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "private",
@@ -6541,7 +7775,7 @@
    "parameters" :
    [
     {
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
@@ -6551,7 +7785,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::attemptIncWeak",
@@ -6560,14 +7794,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE"
+     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::attemptIncStrong",
@@ -6576,14 +7810,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE"
+     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::incWeakRequireWeak",
@@ -6592,14 +7826,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE"
+     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::decWeak",
@@ -6608,14 +7842,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE"
+     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::incWeak",
@@ -6624,14 +7858,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE"
+     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::trackMe",
@@ -6640,7 +7874,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE"
+     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIb"
@@ -6650,7 +7884,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6660,14 +7894,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6677,14 +7911,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6694,14 +7928,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIi"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6711,7 +7945,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIj"
@@ -6721,7 +7955,7 @@
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6731,11 +7965,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6745,11 +7979,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6759,11 +7993,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6773,11 +8007,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6787,11 +8021,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::String8::lockBuffer",
@@ -6800,14 +8034,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIm"
     }
    ],
    "return_type" : "_ZTIPc",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "access" : "private",
@@ -6817,7 +8051,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
@@ -6827,7 +8061,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::appendFormat",
@@ -6836,14 +8070,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::unlockBuffer",
@@ -6852,14 +8086,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIm"
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::unlockBuffer",
@@ -6868,11 +8102,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::appendFormatV",
@@ -6881,7 +8115,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
@@ -6891,7 +8125,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::clear",
@@ -6900,11 +8134,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::setTo",
@@ -6913,7 +8147,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDi"
@@ -6923,7 +8157,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::setTo",
@@ -6932,7 +8166,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDs"
@@ -6942,7 +8176,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::setTo",
@@ -6951,14 +8185,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::setTo",
@@ -6967,7 +8201,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
@@ -6977,7 +8211,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::setTo",
@@ -6986,14 +8220,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
-     "referenced_type" : "_ZTIRKN7android7String8E"
+     "referenced_type" : "_ZTIRKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::append",
@@ -7002,14 +8236,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::append",
@@ -7018,7 +8252,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
@@ -7028,7 +8262,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::append",
@@ -7037,14 +8271,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
-     "referenced_type" : "_ZTIRKN7android7String8E"
+     "referenced_type" : "_ZTIRKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::format",
@@ -7055,8 +8289,8 @@
      "referenced_type" : "_ZTIPKc"
     }
    ],
-   "return_type" : "_ZTIN7android7String8E",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "return_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::formatV",
@@ -7070,8 +8304,8 @@
      "referenced_type" : "_ZTISt9__va_list"
     }
    ],
-   "return_type" : "_ZTIN7android7String8E",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "return_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::toLower",
@@ -7080,11 +8314,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::removeAll",
@@ -7093,14 +8327,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7109,14 +8343,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDi"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7125,7 +8359,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDi"
@@ -7135,7 +8369,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7144,14 +8378,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDs"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7160,7 +8394,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDs"
@@ -7170,7 +8404,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7179,14 +8413,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7195,7 +8429,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
@@ -7205,7 +8439,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7214,14 +8448,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIRKN7android8String16E"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7230,14 +8464,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
-     "referenced_type" : "_ZTIRKN7android7String8E"
+     "referenced_type" : "_ZTIRKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7246,11 +8480,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7259,14 +8493,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDi"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7275,7 +8509,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDi"
@@ -7285,7 +8519,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7294,14 +8528,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDs"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7310,7 +8544,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDs"
@@ -7320,7 +8554,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7329,14 +8563,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7345,7 +8579,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
@@ -7355,7 +8589,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7364,14 +8598,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIRKN7android8String16E"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7380,14 +8614,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
-     "referenced_type" : "_ZTIRKN7android7String8E"
+     "referenced_type" : "_ZTIRKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7396,11 +8630,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::~String8",
@@ -7409,11 +8643,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::~String8",
@@ -7422,11 +8656,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "access" : "private",
@@ -7443,7 +8677,7 @@
     }
    ],
    "return_type" : "_ZTIPv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::replaceAll",
@@ -7462,7 +8696,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "access" : "private",
@@ -7478,7 +8712,7 @@
     }
    ],
    "return_type" : "_ZTIPDs",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "access" : "private",
@@ -7494,7 +8728,7 @@
     }
    ],
    "return_type" : "_ZTIPDs",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "access" : "private",
@@ -7508,7 +8742,7 @@
     }
    ],
    "return_type" : "_ZTIPv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "access" : "private",
@@ -7521,7 +8755,7 @@
     }
    ],
    "return_type" : "_ZTIPv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::setTo",
@@ -7537,7 +8771,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::setTo",
@@ -7556,7 +8790,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::setTo",
@@ -7572,7 +8806,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::setTo",
@@ -7595,7 +8829,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::append",
@@ -7614,7 +8848,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::append",
@@ -7630,7 +8864,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::insert",
@@ -7649,7 +8883,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::insert",
@@ -7671,7 +8905,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "access" : "private",
@@ -7685,7 +8919,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "access" : "private",
@@ -7699,7 +8933,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7715,7 +8949,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7731,7 +8965,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7750,7 +8984,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7766,7 +9000,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7785,7 +9019,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7797,11 +9031,11 @@
      "referenced_type" : "_ZTIPN7android8String16E"
     },
     {
-     "referenced_type" : "_ZTIRKN7android7String8E"
+     "referenced_type" : "_ZTIRKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7817,7 +9051,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7840,7 +9074,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7853,7 +9087,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7869,7 +9103,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7885,7 +9119,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7904,7 +9138,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7920,7 +9154,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7939,7 +9173,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7951,11 +9185,11 @@
      "referenced_type" : "_ZTIPN7android8String16E"
     },
     {
-     "referenced_type" : "_ZTIRKN7android7String8E"
+     "referenced_type" : "_ZTIRKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7971,7 +9205,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7994,7 +9228,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -8007,7 +9241,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::~String16",
@@ -8020,7 +9254,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::~String16",
@@ -8033,7 +9267,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::operator=",
@@ -8049,7 +9283,7 @@
     }
    ],
    "return_type" : "_ZTIRN7android8String16E",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::FdPrinter::printLine",
@@ -8363,14 +9597,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android10VectorImplE"
+     "referenced_type" : "_ZTIPKN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIm"
     }
    ],
    "return_type" : "_ZTIPKv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::capacity",
@@ -8379,11 +9613,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android10VectorImplE"
+     "referenced_type" : "_ZTIPKN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIm",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "access" : "protected",
@@ -8393,11 +9627,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android10VectorImplE"
+     "referenced_type" : "_ZTIPKN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIm",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "access" : "private",
@@ -8418,7 +9652,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::indexOf",
@@ -8434,7 +9668,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::orderOf",
@@ -8450,7 +9684,7 @@
     }
    ],
    "return_type" : "_ZTIm",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::Looper::getAllowNonCallbacks",
@@ -8934,14 +10168,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7RefBaseE"
+     "referenced_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
-   "return_type" : "_ZTIPN7android7RefBase12weakref_typeE",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "return_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::getWeakRefs",
@@ -8950,11 +10184,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7RefBaseE"
+     "referenced_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
-   "return_type" : "_ZTIPN7android7RefBase12weakref_typeE",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "return_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::getWeakCount",
@@ -8967,7 +10201,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::refBase",
@@ -8979,8 +10213,8 @@
      "referenced_type" : "_ZTIPKN7android7RefBase12weakref_typeE"
     }
    ],
-   "return_type" : "_ZTIPN7android7RefBaseE",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "return_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::printRefs",
@@ -8993,7 +10227,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::forceIncStrong",
@@ -9002,14 +10236,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7RefBaseE"
+     "referenced_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::getStrongCount",
@@ -9018,11 +10252,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7RefBaseE"
+     "referenced_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::incStrongRequireStrong",
@@ -9031,14 +10265,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7RefBaseE"
+     "referenced_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::decStrong",
@@ -9047,14 +10281,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7RefBaseE"
+     "referenced_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::incStrong",
@@ -9063,14 +10297,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7RefBaseE"
+     "referenced_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "private",
@@ -9080,11 +10314,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7String8E"
+     "referenced_type" : "_ZTIPKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
-   "return_type" : "_ZTIN7android7String8E",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "return_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "access" : "private",
@@ -9094,11 +10328,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7String8E"
+     "referenced_type" : "_ZTIPKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
-   "return_type" : "_ZTIN7android7String8E",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "return_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::find",
@@ -9107,7 +10341,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7String8E"
+     "referenced_type" : "_ZTIPKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
@@ -9118,7 +10352,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::length",
@@ -9127,11 +10361,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7String8E"
+     "referenced_type" : "_ZTIPKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIm",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String16::startsWith",
@@ -9147,7 +10381,7 @@
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::startsWith",
@@ -9163,7 +10397,7 @@
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::isStaticString",
@@ -9176,7 +10410,7 @@
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "access" : "private",
@@ -9190,7 +10424,7 @@
     }
    ],
    "return_type" : "_ZTIm",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::size",
@@ -9203,7 +10437,7 @@
     }
    ],
    "return_type" : "_ZTIm",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::contains",
@@ -9219,7 +10453,7 @@
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::findLast",
@@ -9235,7 +10469,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::findFirst",
@@ -9251,7 +10485,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::StopWatch::elapsedTime",
@@ -9444,7 +10678,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "strlen16",
@@ -9456,7 +10690,7 @@
     }
    ],
    "return_type" : "_ZTIm",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "strncmp16",
@@ -9474,7 +10708,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "strnlen16",
@@ -9489,7 +10723,7 @@
     }
    ],
    "return_type" : "_ZTIm",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "strstr16",
@@ -9504,7 +10738,7 @@
     }
    ],
    "return_type" : "_ZTIPDs",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "strzcmp16",
@@ -9525,7 +10759,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "systemTime",
@@ -9574,7 +10808,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "utf16_to_utf8_length",
@@ -9589,7 +10823,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "utf32_from_utf8_at",
@@ -9610,7 +10844,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "utf32_to_utf8",
@@ -9631,7 +10865,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "utf32_to_utf8_length",
@@ -9646,7 +10880,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "utf8_to_utf16",
@@ -9667,7 +10901,7 @@
     }
    ],
    "return_type" : "_ZTIPDs",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "utf8_to_utf16_length",
@@ -9686,7 +10920,7 @@
     }
    ],
    "return_type" : "_ZTIl",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "utf8_to_utf16_no_null_terminator",
@@ -9707,7 +10941,7 @@
     }
    ],
    "return_type" : "_ZTIPDs",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   }
  ],
  "global_vars" :
@@ -9729,16 +10963,16 @@
    "referenced_type" : "_ZTIA1_KDs",
    "self_type" : "_ZTIRA1_KDs",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 8,
    "linker_set_key" : "_ZTIRKN7android10VectorImplE",
    "name" : "const android::VectorImpl &",
-   "referenced_type" : "_ZTIKN7android10VectorImplE",
+   "referenced_type" : "_ZTIKN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIRKN7android10VectorImplE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 8,
@@ -9747,7 +10981,7 @@
    "referenced_type" : "_ZTIKN7android16ReferenceRenamerE",
    "self_type" : "_ZTIRKN7android16ReferenceRenamerE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "alignment" : 8,
@@ -9756,7 +10990,7 @@
    "referenced_type" : "_ZTIKN7android16SortedVectorImplE",
    "self_type" : "_ZTIRKN7android16SortedVectorImplE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 8,
@@ -9868,12 +11102,21 @@
   },
   {
    "alignment" : 8,
+   "linker_set_key" : "_ZTIRKN7android7String8E",
+   "name" : "const android::String8 &",
+   "referenced_type" : "_ZTIKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIRKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
+  },
+  {
+   "alignment" : 8,
    "linker_set_key" : "_ZTIRKN7android8String1610StaticDataILm1EEE",
    "name" : "const android::String16::StaticData<1> &",
    "referenced_type" : "_ZTIKN7android8String1610StaticDataILm1EEE",
    "self_type" : "_ZTIRKN7android8String1610StaticDataILm1EEE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 8,
@@ -9882,7 +11125,7 @@
    "referenced_type" : "_ZTIKN7android8String16E",
    "self_type" : "_ZTIRKN7android8String16E",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 8,
@@ -9987,19 +11230,19 @@
    "alignment" : 8,
    "linker_set_key" : "_ZTIRN7android10VectorImplE",
    "name" : "android::VectorImpl &",
-   "referenced_type" : "_ZTIN7android10VectorImplE",
+   "referenced_type" : "_ZTIN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIRN7android10VectorImplE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 8,
    "linker_set_key" : "_ZTIRN7android16SortedVectorImplE",
    "name" : "android::SortedVectorImpl &",
-   "referenced_type" : "_ZTIN7android16SortedVectorImplE",
+   "referenced_type" : "_ZTIN7android16SortedVectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIRN7android16SortedVectorImplE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 8,
@@ -10111,12 +11354,21 @@
   },
   {
    "alignment" : 8,
+   "linker_set_key" : "_ZTIRN7android7String8E",
+   "name" : "android::String8 &",
+   "referenced_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIRN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
+  },
+  {
+   "alignment" : 8,
    "linker_set_key" : "_ZTIRN7android8String16E",
    "name" : "android::String16 &",
    "referenced_type" : "_ZTIN7android8String16E",
    "self_type" : "_ZTIRN7android8String16E",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 8,
@@ -10200,7 +11452,7 @@
    "referenced_type" : "_ZTIDs",
    "self_type" : "_ZTIPDs",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 8,
@@ -10218,7 +11470,7 @@
    "referenced_type" : "_ZTIFiPKvS0_E",
    "self_type" : "_ZTIPFiPKvS0_E",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 8,
@@ -10227,7 +11479,7 @@
    "referenced_type" : "_ZTIFiPKvS0_PvE",
    "self_type" : "_ZTIPFiPKvS0_PvE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 8,
@@ -10281,7 +11533,7 @@
    "referenced_type" : "_ZTIKDi",
    "self_type" : "_ZTIPKDi",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "alignment" : 8,
@@ -10290,7 +11542,7 @@
    "referenced_type" : "_ZTIKDs",
    "self_type" : "_ZTIPKDs",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 8,
@@ -10303,6 +11555,15 @@
   },
   {
    "alignment" : 8,
+   "linker_set_key" : "_ZTIPKN7android10VectorImplE",
+   "name" : "const android::VectorImpl *",
+   "referenced_type" : "_ZTIKN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPKN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
+  },
+  {
+   "alignment" : 8,
    "linker_set_key" : "_ZTIPKN7android12LightRefBaseINS_12NativeHandleEEE",
    "name" : "const android::LightRefBase<android::NativeHandle> *",
    "referenced_type" : "_ZTIKN7android12LightRefBaseINS_12NativeHandleEEE",
@@ -10326,7 +11587,7 @@
    "referenced_type" : "_ZTIKN7android16SortedVectorImplE",
    "self_type" : "_ZTIPKN7android16SortedVectorImplE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 8,
@@ -10488,7 +11749,7 @@
    "referenced_type" : "_ZTIKN7android6VectorINS_7String8EEE",
    "self_type" : "_ZTIPKN7android6VectorINS_7String8EEE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/Vector.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Vector.h"
   },
   {
    "alignment" : 8,
@@ -10506,7 +11767,7 @@
    "referenced_type" : "_ZTIKN7android7RefBase12weakref_typeE",
    "self_type" : "_ZTIPKN7android7RefBase12weakref_typeE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "alignment" : 8,
@@ -10519,6 +11780,15 @@
   },
   {
    "alignment" : 8,
+   "linker_set_key" : "_ZTIPKN7android7RefBaseE",
+   "name" : "const android::RefBase *",
+   "referenced_type" : "_ZTIKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
+  },
+  {
+   "alignment" : 8,
    "linker_set_key" : "_ZTIPKN7android7String8E",
    "name" : "const android::String8 *",
    "referenced_type" : "_ZTIKN7android7String8E",
@@ -10528,21 +11798,21 @@
   },
   {
    "alignment" : 8,
+   "linker_set_key" : "_ZTIPKN7android7String8E",
+   "name" : "const android::String8 *",
+   "referenced_type" : "_ZTIKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
+  },
+  {
+   "alignment" : 8,
    "linker_set_key" : "_ZTIPKN7android8String16E",
    "name" : "const android::String16 *",
    "referenced_type" : "_ZTIKN7android8String16E",
    "self_type" : "_ZTIPKN7android8String16E",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
-  },
-  {
-   "alignment" : 8,
-   "linker_set_key" : "_ZTIPKN7android9CallStackE",
-   "name" : "const android::CallStack *",
-   "referenced_type" : "_ZTIKN7android9CallStackE",
-   "self_type" : "_ZTIPKN7android9CallStackE",
-   "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/CallStack.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 8,
@@ -10611,10 +11881,10 @@
    "alignment" : 8,
    "linker_set_key" : "_ZTIPN7android10VectorImplE",
    "name" : "android::VectorImpl *",
-   "referenced_type" : "_ZTIN7android10VectorImplE",
+   "referenced_type" : "_ZTIN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIPN7android10VectorImplE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 8,
@@ -10677,7 +11947,7 @@
    "referenced_type" : "_ZTIN7android14StaticString16ILm1EEE",
    "self_type" : "_ZTIPN7android14StaticString16ILm1EEE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 8,
@@ -10699,12 +11969,21 @@
   },
   {
    "alignment" : 8,
+   "linker_set_key" : "_ZTIPN7android16ReferenceRenamerE",
+   "name" : "android::ReferenceRenamer *",
+   "referenced_type" : "_ZTIN7android16ReferenceRenamerE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPN7android16ReferenceRenamerE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
+  },
+  {
+   "alignment" : 8,
    "linker_set_key" : "_ZTIPN7android16SortedVectorImplE",
    "name" : "android::SortedVectorImpl *",
-   "referenced_type" : "_ZTIN7android16SortedVectorImplE",
+   "referenced_type" : "_ZTIN7android16SortedVectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIPN7android16SortedVectorImplE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 8,
@@ -10726,6 +12005,15 @@
   },
   {
    "alignment" : 8,
+   "linker_set_key" : "_ZTIPN7android19VirtualLightRefBaseE",
+   "name" : "android::VirtualLightRefBase *",
+   "referenced_type" : "_ZTIN7android19VirtualLightRefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPN7android19VirtualLightRefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/LightRefBase.h"
+  },
+  {
+   "alignment" : 8,
    "linker_set_key" : "_ZTIPN7android20SimpleLooperCallbackE",
    "name" : "android::SimpleLooperCallback *",
    "referenced_type" : "_ZTIN7android20SimpleLooperCallbackE",
@@ -10947,7 +12235,7 @@
    "referenced_type" : "_ZTIN7android6VectorINS_7String8EEE",
    "self_type" : "_ZTIPN7android6VectorINS_7String8EEE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/Vector.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Vector.h"
   },
   {
    "alignment" : 8,
@@ -10996,6 +12284,15 @@
   },
   {
    "alignment" : 8,
+   "linker_set_key" : "_ZTIPN7android7RefBase12weakref_typeE",
+   "name" : "android::RefBase::weakref_type *",
+   "referenced_type" : "_ZTIN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
+  },
+  {
+   "alignment" : 8,
    "linker_set_key" : "_ZTIPN7android7RefBaseE",
    "name" : "android::RefBase *",
    "referenced_type" : "_ZTIN7android7RefBaseE",
@@ -11005,6 +12302,15 @@
   },
   {
    "alignment" : 8,
+   "linker_set_key" : "_ZTIPN7android7RefBaseE",
+   "name" : "android::RefBase *",
+   "referenced_type" : "_ZTIN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
+  },
+  {
+   "alignment" : 8,
    "linker_set_key" : "_ZTIPN7android7String8E",
    "name" : "android::String8 *",
    "referenced_type" : "_ZTIN7android7String8E",
@@ -11014,12 +12320,21 @@
   },
   {
    "alignment" : 8,
+   "linker_set_key" : "_ZTIPN7android7String8E",
+   "name" : "android::String8 *",
+   "referenced_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
+  },
+  {
+   "alignment" : 8,
    "linker_set_key" : "_ZTIPN7android8String1610StaticDataILm1EEE",
    "name" : "android::String16::StaticData<1> *",
    "referenced_type" : "_ZTIN7android8String1610StaticDataILm1EEE",
    "self_type" : "_ZTIPN7android8String1610StaticDataILm1EEE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 8,
@@ -11028,25 +12343,7 @@
    "referenced_type" : "_ZTIN7android8String16E",
    "self_type" : "_ZTIPN7android8String16E",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
-  },
-  {
-   "alignment" : 8,
-   "linker_set_key" : "_ZTIPN7android9CallStack12StackDeleterE",
-   "name" : "android::CallStack::StackDeleter *",
-   "referenced_type" : "_ZTIN7android9CallStack12StackDeleterE",
-   "self_type" : "_ZTIPN7android9CallStack12StackDeleterE",
-   "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/CallStack.h"
-  },
-  {
-   "alignment" : 8,
-   "linker_set_key" : "_ZTIPN7android9CallStackE",
-   "name" : "android::CallStack *",
-   "referenced_type" : "_ZTIN7android9CallStackE",
-   "self_type" : "_ZTIPN7android9CallStackE",
-   "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/CallStack.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 8,
@@ -11136,7 +12433,7 @@
    "referenced_type" : "_ZTIm",
    "self_type" : "_ZTIPm",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "alignment" : 8,
@@ -11158,7 +12455,7 @@
    "referenced_type" : "_ZTIA1_Ds",
    "self_type" : "_ZTIA1_KDs",
    "size" : 2,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -11188,7 +12485,7 @@
    "referenced_type" : "_ZTIDi",
    "self_type" : "_ZTIKDi",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "alignment" : 2,
@@ -11198,7 +12495,17 @@
    "referenced_type" : "_ZTIDs",
    "self_type" : "_ZTIKDs",
    "size" : 2,
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
+  },
+  {
+   "alignment" : 8,
+   "is_const" : true,
+   "linker_set_key" : "_ZTIKN7android10VectorImplE",
+   "name" : "const android::VectorImpl",
+   "referenced_type" : "_ZTIN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIKN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 40,
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 8,
@@ -11235,20 +12542,20 @@
    "is_const" : true,
    "linker_set_key" : "_ZTIKN7android16ReferenceRenamerE",
    "name" : "const android::ReferenceRenamer",
-   "referenced_type" : "_ZTIN7android16ReferenceRenamerE",
+   "referenced_type" : "_ZTIN7android16ReferenceRenamerE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIKN7android16ReferenceRenamerE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "alignment" : 8,
    "is_const" : true,
    "linker_set_key" : "_ZTIKN7android16SortedVectorImplE",
    "name" : "const android::SortedVectorImpl",
-   "referenced_type" : "_ZTIN7android16SortedVectorImplE",
+   "referenced_type" : "_ZTIN7android16SortedVectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIKN7android16SortedVectorImplE",
    "size" : 40,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 8,
@@ -11438,7 +12745,7 @@
    "referenced_type" : "_ZTIN7android6VectorINS_7String8EEE",
    "self_type" : "_ZTIKN7android6VectorINS_7String8EEE",
    "size" : 40,
-   "source_file" : "system/core/libutils/include/utils/Vector.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Vector.h"
   },
   {
    "alignment" : 8,
@@ -11465,10 +12772,20 @@
    "is_const" : true,
    "linker_set_key" : "_ZTIKN7android7RefBase12weakref_typeE",
    "name" : "const android::RefBase::weakref_type",
-   "referenced_type" : "_ZTIN7android7RefBase12weakref_typeE",
+   "referenced_type" : "_ZTIN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIKN7android7RefBase12weakref_typeE",
    "size" : 1,
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
+  },
+  {
+   "alignment" : 8,
+   "is_const" : true,
+   "linker_set_key" : "_ZTIKN7android7RefBaseE",
+   "name" : "const android::RefBase",
+   "referenced_type" : "_ZTIN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 16,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "alignment" : 8,
@@ -11485,6 +12802,16 @@
    "is_const" : true,
    "linker_set_key" : "_ZTIKN7android7String8E",
    "name" : "const android::String8",
+   "referenced_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
+  },
+  {
+   "alignment" : 8,
+   "is_const" : true,
+   "linker_set_key" : "_ZTIKN7android7String8E",
+   "name" : "const android::String8",
    "referenced_type" : "_ZTIN7android7String8E",
    "self_type" : "_ZTIKN7android7String8E",
    "size" : 8,
@@ -11498,7 +12825,7 @@
    "referenced_type" : "_ZTIN7android8String1610StaticDataILm1EEE",
    "self_type" : "_ZTIKN7android8String1610StaticDataILm1EEE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 8,
@@ -11508,17 +12835,7 @@
    "referenced_type" : "_ZTIN7android8String16E",
    "self_type" : "_ZTIKN7android8String16E",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String8.h"
-  },
-  {
-   "alignment" : 8,
-   "is_const" : true,
-   "linker_set_key" : "_ZTIKN7android9CallStackE",
-   "name" : "const android::CallStack",
-   "referenced_type" : "_ZTIN7android9CallStackE",
-   "self_type" : "_ZTIKN7android9CallStackE",
-   "size" : 40,
-   "source_file" : "system/core/libutils/include/utils/CallStack.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 8,
@@ -12249,6 +13566,85 @@
    [
     {
      "access" : "private",
+     "field_name" : "mStorage",
+     "field_offset" : 64,
+     "referenced_type" : "_ZTIPv"
+    },
+    {
+     "access" : "private",
+     "field_name" : "mCount",
+     "field_offset" : 128,
+     "referenced_type" : "_ZTIm"
+    },
+    {
+     "access" : "private",
+     "field_name" : "mFlags",
+     "field_offset" : 192,
+     "referenced_type" : "_ZTIKj"
+    },
+    {
+     "access" : "private",
+     "field_name" : "mItemSize",
+     "field_offset" : 256,
+     "referenced_type" : "_ZTIKm"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android10VectorImplE",
+   "name" : "android::VectorImpl",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 40,
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h",
+   "vtable_components" :
+   [
+    {
+     "kind" : "offset_to_top"
+    },
+    {
+     "kind" : "rtti",
+     "mangled_component_name" : "_ZTIN7android10VectorImplE"
+    },
+    {
+     "kind" : "complete_dtor_pointer",
+     "mangled_component_name" : "_ZN7android10VectorImplD1Ev"
+    },
+    {
+     "kind" : "deleting_dtor_pointer",
+     "mangled_component_name" : "_ZN7android10VectorImplD0Ev"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl12do_constructEPvm"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl10do_destroyEPvm"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl7do_copyEPvPKvm"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl8do_splatEPvPKvm"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl15do_move_forwardEPvPKvm"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl16do_move_backwardEPvPKvm"
+    }
+   ]
+  },
+  {
+   "alignment" : 8,
+   "fields" :
+   [
+    {
+     "access" : "private",
      "field_name" : "mTag",
      "referenced_type" : "_ZTIm"
     }
@@ -12306,6 +13702,28 @@
    ]
   },
   {
+   "alignment" : 4,
+   "fields" :
+   [
+    {
+     "access" : "private",
+     "field_name" : "mCount",
+     "referenced_type" : "_ZTINSt3__16atomicIiEE"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android12LightRefBaseINS_19VirtualLightRefBaseEEE",
+   "name" : "android::LightRefBase<android::VirtualLightRefBase>",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android12LightRefBaseINS_19VirtualLightRefBaseEEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android12LightRefBaseINS_19VirtualLightRefBaseEEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/LightRefBase.h",
+   "template_args" :
+   [
+    "_ZTIN7android19VirtualLightRefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
+   ]
+  },
+  {
    "alignment" : 8,
    "base_specifiers" :
    [
@@ -12615,6 +14033,16 @@
    "source_file" : "system/core/libutils/include/utils/RefBase.h"
   },
   {
+   "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android14ReferenceMoverE",
+   "name" : "android::ReferenceMover",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android14ReferenceMoverE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android14ReferenceMoverE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
+  },
+  {
    "alignment" : 8,
    "base_specifiers" :
    [
@@ -12637,7 +14065,7 @@
    "referenced_type" : "_ZTIN7android14StaticString16ILm1EEE",
    "self_type" : "_ZTIN7android14StaticString16ILm1EEE",
    "size" : 16,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 8,
@@ -12720,6 +14148,30 @@
   },
   {
    "alignment" : 8,
+   "linker_set_key" : "_ZTIN7android16ReferenceRenamerE",
+   "name" : "android::ReferenceRenamer",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android16ReferenceRenamerE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android16ReferenceRenamerE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h",
+   "vtable_components" :
+   [
+    {
+     "kind" : "offset_to_top"
+    },
+    {
+     "kind" : "rtti",
+     "mangled_component_name" : "_ZTIN7android16ReferenceRenamerE"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android16ReferenceRenamerclEm"
+    }
+   ]
+  },
+  {
+   "alignment" : 8,
    "base_specifiers" :
    [
     {
@@ -12781,6 +14233,68 @@
    ]
   },
   {
+   "alignment" : 8,
+   "base_specifiers" :
+   [
+    {
+     "referenced_type" : "_ZTIN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android16SortedVectorImplE",
+   "name" : "android::SortedVectorImpl",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android16SortedVectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android16SortedVectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 40,
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h",
+   "vtable_components" :
+   [
+    {
+     "kind" : "offset_to_top"
+    },
+    {
+     "kind" : "rtti",
+     "mangled_component_name" : "_ZTIN7android16SortedVectorImplE"
+    },
+    {
+     "kind" : "complete_dtor_pointer",
+     "mangled_component_name" : "_ZN7android16SortedVectorImplD1Ev"
+    },
+    {
+     "kind" : "deleting_dtor_pointer",
+     "mangled_component_name" : "_ZN7android16SortedVectorImplD0Ev"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl12do_constructEPvm"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl10do_destroyEPvm"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl7do_copyEPvPKvm"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl8do_splatEPvPKvm"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl15do_move_forwardEPvPKvm"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl16do_move_backwardEPvPKvm"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android16SortedVectorImpl10do_compareEPKvS2_"
+    }
+   ]
+  },
+  {
    "alignment" : 1,
    "base_specifiers" :
    [
@@ -12985,6 +14499,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIbEE",
+   "name" : "android::trait_trivial_copy<bool>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIb"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIcEE",
    "name" : "android::trait_trivial_copy<char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIcEE",
@@ -12998,6 +14525,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIcEE",
+   "name" : "android::trait_trivial_copy<char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIc"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIdEE",
    "name" : "android::trait_trivial_copy<double>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIdEE",
@@ -13011,6 +14551,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIdEE",
+   "name" : "android::trait_trivial_copy<double>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTId"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIfEE",
    "name" : "android::trait_trivial_copy<float>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIfEE",
@@ -13024,6 +14577,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIfEE",
+   "name" : "android::trait_trivial_copy<float>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIf"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIhEE",
    "name" : "android::trait_trivial_copy<unsigned char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIhEE",
@@ -13037,6 +14603,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIhEE",
+   "name" : "android::trait_trivial_copy<unsigned char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIh"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIiEE",
    "name" : "android::trait_trivial_copy<int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIiEE",
@@ -13050,6 +14629,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIiEE",
+   "name" : "android::trait_trivial_copy<int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIi"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIjEE",
    "name" : "android::trait_trivial_copy<unsigned int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIjEE",
@@ -13063,6 +14655,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIjEE",
+   "name" : "android::trait_trivial_copy<unsigned int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIj"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIlEE",
    "name" : "android::trait_trivial_copy<long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIlEE",
@@ -13076,6 +14681,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIlEE",
+   "name" : "android::trait_trivial_copy<long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIl"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyImEE",
    "name" : "android::trait_trivial_copy<unsigned long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyImEE",
@@ -13089,6 +14707,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyImEE",
+   "name" : "android::trait_trivial_copy<unsigned long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIm"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIsEE",
    "name" : "android::trait_trivial_copy<short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIsEE",
@@ -13102,6 +14733,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIsEE",
+   "name" : "android::trait_trivial_copy<short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIs"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyItEE",
    "name" : "android::trait_trivial_copy<unsigned short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyItEE",
@@ -13115,6 +14759,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyItEE",
+   "name" : "android::trait_trivial_copy<unsigned short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIt"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIvEE",
    "name" : "android::trait_trivial_copy<void>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIvEE",
@@ -13128,6 +14785,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIvEE",
+   "name" : "android::trait_trivial_copy<void>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIv"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIxEE",
    "name" : "android::trait_trivial_copy<long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIxEE",
@@ -13141,6 +14811,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIxEE",
+   "name" : "android::trait_trivial_copy<long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIx"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIyEE",
    "name" : "android::trait_trivial_copy<unsigned long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIyEE",
@@ -13154,6 +14837,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIyEE",
+   "name" : "android::trait_trivial_copy<unsigned long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIy"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorINS_28sysprop_change_callback_infoEEE",
    "name" : "android::trait_trivial_ctor<android::sysprop_change_callback_info>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorINS_28sysprop_change_callback_infoEEE",
@@ -13206,6 +14902,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIbEE",
+   "name" : "android::trait_trivial_ctor<bool>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIb"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIcEE",
    "name" : "android::trait_trivial_ctor<char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIcEE",
@@ -13219,6 +14928,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIcEE",
+   "name" : "android::trait_trivial_ctor<char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIc"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIdEE",
    "name" : "android::trait_trivial_ctor<double>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIdEE",
@@ -13232,6 +14954,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIdEE",
+   "name" : "android::trait_trivial_ctor<double>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTId"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIfEE",
    "name" : "android::trait_trivial_ctor<float>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIfEE",
@@ -13245,6 +14980,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIfEE",
+   "name" : "android::trait_trivial_ctor<float>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIf"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIhEE",
    "name" : "android::trait_trivial_ctor<unsigned char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIhEE",
@@ -13258,6 +15006,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIhEE",
+   "name" : "android::trait_trivial_ctor<unsigned char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIh"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIiEE",
    "name" : "android::trait_trivial_ctor<int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIiEE",
@@ -13271,6 +15032,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIiEE",
+   "name" : "android::trait_trivial_ctor<int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIi"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIjEE",
    "name" : "android::trait_trivial_ctor<unsigned int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIjEE",
@@ -13284,6 +15058,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIjEE",
+   "name" : "android::trait_trivial_ctor<unsigned int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIj"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIlEE",
    "name" : "android::trait_trivial_ctor<long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIlEE",
@@ -13297,6 +15084,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIlEE",
+   "name" : "android::trait_trivial_ctor<long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIl"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorImEE",
    "name" : "android::trait_trivial_ctor<unsigned long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorImEE",
@@ -13310,6 +15110,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorImEE",
+   "name" : "android::trait_trivial_ctor<unsigned long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIm"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIsEE",
    "name" : "android::trait_trivial_ctor<short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIsEE",
@@ -13323,6 +15136,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIsEE",
+   "name" : "android::trait_trivial_ctor<short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIs"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorItEE",
    "name" : "android::trait_trivial_ctor<unsigned short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorItEE",
@@ -13336,6 +15162,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorItEE",
+   "name" : "android::trait_trivial_ctor<unsigned short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIt"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIvEE",
    "name" : "android::trait_trivial_ctor<void>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIvEE",
@@ -13349,6 +15188,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIvEE",
+   "name" : "android::trait_trivial_ctor<void>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIv"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIxEE",
    "name" : "android::trait_trivial_ctor<long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIxEE",
@@ -13362,6 +15214,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIxEE",
+   "name" : "android::trait_trivial_ctor<long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIx"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIyEE",
    "name" : "android::trait_trivial_ctor<unsigned long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIyEE",
@@ -13375,6 +15240,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIyEE",
+   "name" : "android::trait_trivial_ctor<unsigned long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIy"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorINS_28sysprop_change_callback_infoEEE",
    "name" : "android::trait_trivial_dtor<android::sysprop_change_callback_info>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorINS_28sysprop_change_callback_infoEEE",
@@ -13427,6 +15305,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIbEE",
+   "name" : "android::trait_trivial_dtor<bool>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIb"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIcEE",
    "name" : "android::trait_trivial_dtor<char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIcEE",
@@ -13440,6 +15331,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIcEE",
+   "name" : "android::trait_trivial_dtor<char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIc"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIdEE",
    "name" : "android::trait_trivial_dtor<double>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIdEE",
@@ -13453,6 +15357,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIdEE",
+   "name" : "android::trait_trivial_dtor<double>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTId"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIfEE",
    "name" : "android::trait_trivial_dtor<float>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIfEE",
@@ -13466,6 +15383,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIfEE",
+   "name" : "android::trait_trivial_dtor<float>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIf"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIhEE",
    "name" : "android::trait_trivial_dtor<unsigned char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIhEE",
@@ -13479,6 +15409,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIhEE",
+   "name" : "android::trait_trivial_dtor<unsigned char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIh"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIiEE",
    "name" : "android::trait_trivial_dtor<int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIiEE",
@@ -13492,6 +15435,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIiEE",
+   "name" : "android::trait_trivial_dtor<int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIi"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIjEE",
    "name" : "android::trait_trivial_dtor<unsigned int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIjEE",
@@ -13505,6 +15461,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIjEE",
+   "name" : "android::trait_trivial_dtor<unsigned int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIj"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIlEE",
    "name" : "android::trait_trivial_dtor<long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIlEE",
@@ -13518,6 +15487,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIlEE",
+   "name" : "android::trait_trivial_dtor<long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIl"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorImEE",
    "name" : "android::trait_trivial_dtor<unsigned long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorImEE",
@@ -13531,6 +15513,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorImEE",
+   "name" : "android::trait_trivial_dtor<unsigned long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIm"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIsEE",
    "name" : "android::trait_trivial_dtor<short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIsEE",
@@ -13544,6 +15539,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIsEE",
+   "name" : "android::trait_trivial_dtor<short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIs"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorItEE",
    "name" : "android::trait_trivial_dtor<unsigned short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorItEE",
@@ -13557,6 +15565,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorItEE",
+   "name" : "android::trait_trivial_dtor<unsigned short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIt"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIvEE",
    "name" : "android::trait_trivial_dtor<void>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIvEE",
@@ -13570,6 +15591,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIvEE",
+   "name" : "android::trait_trivial_dtor<void>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIv"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIxEE",
    "name" : "android::trait_trivial_dtor<long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIxEE",
@@ -13583,6 +15617,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIxEE",
+   "name" : "android::trait_trivial_dtor<long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIx"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIyEE",
    "name" : "android::trait_trivial_dtor<unsigned long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIyEE",
@@ -13596,6 +15643,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIyEE",
+   "name" : "android::trait_trivial_dtor<unsigned long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIy"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveINS_28sysprop_change_callback_infoEEE",
    "name" : "android::trait_trivial_move<android::sysprop_change_callback_info>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveINS_28sysprop_change_callback_infoEEE",
@@ -13648,12 +15708,25 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveINS_7String8EEE",
+   "name" : "android::trait_trivial_move<android::String8>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveINS_7String8EEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveINS_7String8EEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h",
+   "template_args" :
+   [
+    "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveINS_8String16EEE",
    "name" : "android::trait_trivial_move<android::String16>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveINS_8String16EEE",
    "self_type" : "_ZTIN7android18trait_trivial_moveINS_8String16EEE",
    "size" : 1,
-   "source_file" : "system/core/libutils/include/utils/String16.h",
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h",
    "template_args" :
    [
     "_ZTIN7android8String16E"
@@ -13674,6 +15747,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIbEE",
+   "name" : "android::trait_trivial_move<bool>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIb"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIcEE",
    "name" : "android::trait_trivial_move<char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIcEE",
@@ -13687,6 +15773,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIcEE",
+   "name" : "android::trait_trivial_move<char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIc"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIdEE",
    "name" : "android::trait_trivial_move<double>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIdEE",
@@ -13700,6 +15799,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIdEE",
+   "name" : "android::trait_trivial_move<double>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTId"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIfEE",
    "name" : "android::trait_trivial_move<float>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIfEE",
@@ -13713,6 +15825,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIfEE",
+   "name" : "android::trait_trivial_move<float>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIf"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIhEE",
    "name" : "android::trait_trivial_move<unsigned char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIhEE",
@@ -13726,6 +15851,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIhEE",
+   "name" : "android::trait_trivial_move<unsigned char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIh"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIiEE",
    "name" : "android::trait_trivial_move<int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIiEE",
@@ -13739,6 +15877,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIiEE",
+   "name" : "android::trait_trivial_move<int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIi"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIjEE",
    "name" : "android::trait_trivial_move<unsigned int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIjEE",
@@ -13752,6 +15903,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIjEE",
+   "name" : "android::trait_trivial_move<unsigned int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIj"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIlEE",
    "name" : "android::trait_trivial_move<long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIlEE",
@@ -13765,6 +15929,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIlEE",
+   "name" : "android::trait_trivial_move<long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIl"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveImEE",
    "name" : "android::trait_trivial_move<unsigned long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveImEE",
@@ -13778,6 +15955,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveImEE",
+   "name" : "android::trait_trivial_move<unsigned long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIm"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIsEE",
    "name" : "android::trait_trivial_move<short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIsEE",
@@ -13791,6 +15981,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIsEE",
+   "name" : "android::trait_trivial_move<short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIs"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveItEE",
    "name" : "android::trait_trivial_move<unsigned short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveItEE",
@@ -13804,6 +16007,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveItEE",
+   "name" : "android::trait_trivial_move<unsigned short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIt"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIvEE",
    "name" : "android::trait_trivial_move<void>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIvEE",
@@ -13817,6 +16033,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIvEE",
+   "name" : "android::trait_trivial_move<void>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIv"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIxEE",
    "name" : "android::trait_trivial_move<long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIxEE",
@@ -13830,6 +16059,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIxEE",
+   "name" : "android::trait_trivial_move<long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIx"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIyEE",
    "name" : "android::trait_trivial_move<unsigned long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIyEE",
@@ -13842,6 +16084,19 @@
    ]
   },
   {
+   "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIyEE",
+   "name" : "android::trait_trivial_move<unsigned long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIy"
+   ]
+  },
+  {
    "alignment" : 8,
    "base_specifiers" :
    [
@@ -13880,6 +16135,40 @@
    "base_specifiers" :
    [
     {
+     "referenced_type" : "_ZTIN7android12LightRefBaseINS_19VirtualLightRefBaseEEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android19VirtualLightRefBaseE",
+   "name" : "android::VirtualLightRefBase",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android19VirtualLightRefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android19VirtualLightRefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 16,
+   "source_file" : "system/core/libutils/binder/include/utils/LightRefBase.h",
+   "vtable_components" :
+   [
+    {
+     "kind" : "offset_to_top"
+    },
+    {
+     "kind" : "rtti",
+     "mangled_component_name" : "_ZTIN7android19VirtualLightRefBaseE"
+    },
+    {
+     "kind" : "complete_dtor_pointer",
+     "mangled_component_name" : "_ZN7android19VirtualLightRefBaseD1Ev"
+    },
+    {
+     "kind" : "deleting_dtor_pointer",
+     "mangled_component_name" : "_ZN7android19VirtualLightRefBaseD0Ev"
+    }
+   ]
+  },
+  {
+   "alignment" : 8,
+   "base_specifiers" :
+   [
+    {
      "referenced_type" : "_ZTIN7android14LooperCallbackE"
     }
    ],
@@ -14849,7 +17138,7 @@
    [
     {
      "access" : "private",
-     "referenced_type" : "_ZTIN7android10VectorImplE"
+     "referenced_type" : "_ZTIN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "linker_set_key" : "_ZTIN7android6VectorINS_7String8EEE",
@@ -14858,10 +17147,10 @@
    "referenced_type" : "_ZTIN7android6VectorINS_7String8EEE",
    "self_type" : "_ZTIN7android6VectorINS_7String8EEE",
    "size" : 40,
-   "source_file" : "system/core/libutils/include/utils/Vector.h",
+   "source_file" : "system/core/libutils/binder/include/utils/Vector.h",
    "template_args" :
    [
-    "_ZTIN7android7String8E"
+    "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
    ],
    "vtable_components" :
    [
@@ -15049,6 +17338,16 @@
    "source_file" : "system/core/libutils/include/utils/RefBase.h"
   },
   {
+   "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android7RefBase12weakref_typeE",
+   "name" : "android::RefBase::weakref_type",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
+  },
+  {
    "alignment" : 8,
    "fields" :
    [
@@ -15103,6 +17402,55 @@
    [
     {
      "access" : "private",
+     "field_name" : "mRefs",
+     "field_offset" : 64,
+     "referenced_type" : "_ZTIKPN7android7RefBase12weakref_implE"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android7RefBaseE",
+   "name" : "android::RefBase",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 16,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h",
+   "vtable_components" :
+   [
+    {
+     "kind" : "offset_to_top"
+    },
+    {
+     "kind" : "rtti",
+     "mangled_component_name" : "_ZTIN7android7RefBaseE"
+    },
+    {
+     "kind" : "complete_dtor_pointer",
+     "mangled_component_name" : "_ZN7android7RefBaseD1Ev"
+    },
+    {
+     "kind" : "deleting_dtor_pointer",
+     "mangled_component_name" : "_ZN7android7RefBaseD0Ev"
+    },
+    {
+     "mangled_component_name" : "_ZN7android7RefBase10onFirstRefEv"
+    },
+    {
+     "mangled_component_name" : "_ZN7android7RefBase15onLastStrongRefEPKv"
+    },
+    {
+     "mangled_component_name" : "_ZN7android7RefBase20onIncStrongAttemptedEjPKv"
+    },
+    {
+     "mangled_component_name" : "_ZN7android7RefBase13onLastWeakRefEPKv"
+    }
+   ]
+  },
+  {
+   "alignment" : 8,
+   "fields" :
+   [
+    {
+     "access" : "private",
      "field_name" : "mString",
      "referenced_type" : "_ZTIPKc"
     }
@@ -15116,6 +17464,24 @@
    "source_file" : "system/core/libutils/include/utils/String8.h"
   },
   {
+   "alignment" : 8,
+   "fields" :
+   [
+    {
+     "access" : "private",
+     "field_name" : "mString",
+     "referenced_type" : "_ZTIPKc"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android7String8E",
+   "name" : "android::String8",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm64_armv8-a_static_afdo-libutils_lto-none/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
+  },
+  {
    "alignment" : 4,
    "fields" :
    [
@@ -15134,7 +17500,7 @@
    "referenced_type" : "_ZTIN7android8String1610StaticDataILm1EEE",
    "self_type" : "_ZTIN7android8String1610StaticDataILm1EEE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 8,
@@ -15152,34 +17518,7 @@
    "referenced_type" : "_ZTIN7android8String16E",
    "self_type" : "_ZTIN7android8String16E",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
-  },
-  {
-   "alignment" : 1,
-   "linker_set_key" : "_ZTIN7android9CallStack12StackDeleterE",
-   "name" : "android::CallStack::StackDeleter",
-   "referenced_type" : "_ZTIN7android9CallStack12StackDeleterE",
-   "self_type" : "_ZTIN7android9CallStack12StackDeleterE",
-   "size" : 1,
-   "source_file" : "system/core/libutils/include/utils/CallStack.h"
-  },
-  {
-   "alignment" : 8,
-   "fields" :
-   [
-    {
-     "access" : "private",
-     "field_name" : "mFrameLines",
-     "referenced_type" : "_ZTIN7android6VectorINS_7String8EEE"
-    }
-   ],
-   "linker_set_key" : "_ZTIN7android9CallStackE",
-   "name" : "android::CallStack",
-   "record_kind" : "class",
-   "referenced_type" : "_ZTIN7android9CallStackE",
-   "self_type" : "_ZTIN7android9CallStackE",
-   "size" : 40,
-   "source_file" : "system/core/libutils/include/utils/CallStack.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -15445,7 +17784,7 @@
    "referenced_type" : "_ZTIN7android8String16E",
    "self_type" : "_ZTION7android8String16E",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   }
  ]
 }
diff --git a/libutils/abi-dumps/arm_arm64/source-based/libutils.so.lsdump b/libutils/abi-dumps/arm_arm64/source-based/libutils.so.lsdump
index e8236ea..dfc1ab5 100644
--- a/libutils/abi-dumps/arm_arm64/source-based/libutils.so.lsdump
+++ b/libutils/abi-dumps/arm_arm64/source-based/libutils.so.lsdump
@@ -16,7 +16,7 @@
    "referenced_type" : "_ZTIDs",
    "self_type" : "_ZTIA1_Ds",
    "size" : 2,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 1,
@@ -46,6 +46,7 @@
    "source_file" : "system/core/libsystem/include/system/graphics.h"
   },
   {
+   "is_of_unknown_bound" : true,
    "linker_set_key" : "_ZTIA_f",
    "name" : "float[]",
    "referenced_type" : "_ZTIf",
@@ -491,6 +492,22 @@
    "name" : "_ZN7android27add_sysprop_change_callbackEPFvvEi"
   },
   {
+   "binding" : "weak",
+   "name" : "_ZN7android2spINS_14LooperCallbackEE5clearEv"
+  },
+  {
+   "binding" : "weak",
+   "name" : "_ZN7android2spINS_6LooperEEaSEOS2_"
+  },
+  {
+   "binding" : "weak",
+   "name" : "_ZN7android2spINS_6ThreadEE5clearEv"
+  },
+  {
+   "binding" : "weak",
+   "name" : "_ZN7android2spINS_6ThreadEEaSEOS2_"
+  },
+  {
    "name" : "_ZN7android30get_report_sysprop_change_funcEv"
   },
   {
@@ -545,6 +562,9 @@
    "name" : "_ZN7android6Looper6awokenEv"
   },
   {
+   "name" : "_ZN7android6Looper6repollEi"
+  },
+  {
    "name" : "_ZN7android6Looper7pollAllEiPiS1_PPv"
   },
   {
@@ -1196,6 +1216,14 @@
   },
   {
    "binding" : "weak",
+   "name" : "_ZNSt3__112__hash_tableINS_17__hash_value_typeIiyEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE4findIiEENS_15__hash_iteratorIPNS_11__hash_nodeIS2_PvEEEERKT_"
+  },
+  {
+   "binding" : "weak",
+   "name" : "_ZNSt3__112__hash_tableINS_17__hash_value_typeIiyEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE5eraseENS_21__hash_const_iteratorIPNS_11__hash_nodeIS2_PvEEEE"
+  },
+  {
+   "binding" : "weak",
    "name" : "_ZNSt3__112__hash_tableINS_17__hash_value_typeIiyEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE6rehashEj"
   },
   {
@@ -1208,10 +1236,30 @@
   },
   {
    "binding" : "weak",
+   "name" : "_ZNSt3__112__hash_tableINS_17__hash_value_typeIiyEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEED2Ev"
+  },
+  {
+   "binding" : "weak",
+   "name" : "_ZNSt3__112__hash_tableINS_17__hash_value_typeIyN7android6Looper7RequestEEENS_22__unordered_map_hasherIyS5_NS_4hashIyEELb1EEENS_21__unordered_map_equalIyS5_NS_8equal_toIyEELb1EEENS_9allocatorIS5_EEE14__erase_uniqueIyEEjRKT_"
+  },
+  {
+   "binding" : "weak",
+   "name" : "_ZNSt3__112__hash_tableINS_17__hash_value_typeIyN7android6Looper7RequestEEENS_22__unordered_map_hasherIyS5_NS_4hashIyEELb1EEENS_21__unordered_map_equalIyS5_NS_8equal_toIyEELb1EEENS_9allocatorIS5_EEE17__deallocate_nodeEPNS_16__hash_node_baseIPNS_11__hash_nodeIS5_PvEEEE"
+  },
+  {
+   "binding" : "weak",
    "name" : "_ZNSt3__112__hash_tableINS_17__hash_value_typeIyN7android6Looper7RequestEEENS_22__unordered_map_hasherIyS5_NS_4hashIyEELb1EEENS_21__unordered_map_equalIyS5_NS_8equal_toIyEELb1EEENS_9allocatorIS5_EEE25__emplace_unique_key_argsIyJRKyRS4_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEEbEERKT_DpOT0_"
   },
   {
    "binding" : "weak",
+   "name" : "_ZNSt3__112__hash_tableINS_17__hash_value_typeIyN7android6Looper7RequestEEENS_22__unordered_map_hasherIyS5_NS_4hashIyEELb1EEENS_21__unordered_map_equalIyS5_NS_8equal_toIyEELb1EEENS_9allocatorIS5_EEE4findIyEENS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEERKT_"
+  },
+  {
+   "binding" : "weak",
+   "name" : "_ZNSt3__112__hash_tableINS_17__hash_value_typeIyN7android6Looper7RequestEEENS_22__unordered_map_hasherIyS5_NS_4hashIyEELb1EEENS_21__unordered_map_equalIyS5_NS_8equal_toIyEELb1EEENS_9allocatorIS5_EEE5eraseENS_21__hash_const_iteratorIPNS_11__hash_nodeIS5_PvEEEE"
+  },
+  {
+   "binding" : "weak",
    "name" : "_ZNSt3__112__hash_tableINS_17__hash_value_typeIyN7android6Looper7RequestEEENS_22__unordered_map_hasherIyS5_NS_4hashIyEELb1EEENS_21__unordered_map_equalIyS5_NS_8equal_toIyEELb1EEENS_9allocatorIS5_EEE6rehashEj"
   },
   {
@@ -1223,6 +1271,10 @@
    "name" : "_ZNSt3__112__hash_tableINS_17__hash_value_typeIyN7android6Looper7RequestEEENS_22__unordered_map_hasherIyS5_NS_4hashIyEELb1EEENS_21__unordered_map_equalIyS5_NS_8equal_toIyEELb1EEENS_9allocatorIS5_EEE8__rehashEj"
   },
   {
+   "binding" : "weak",
+   "name" : "_ZNSt3__112__hash_tableINS_17__hash_value_typeIyN7android6Looper7RequestEEENS_22__unordered_map_hasherIyS5_NS_4hashIyEELb1EEENS_21__unordered_map_equalIyS5_NS_8equal_toIyEELb1EEENS_9allocatorIS5_EEED2Ev"
+  },
+  {
    "name" : "_ZTv0_n12_N7android14LooperCallbackD0Ev"
   },
   {
@@ -1407,6 +1459,10 @@
   },
   {
    "name" : "_ZTVN7android9FdPrinterE"
+  },
+  {
+   "binding" : "weak",
+   "name" : "__llvm_fs_discriminator__"
   }
  ],
  "enum_types" :
@@ -2247,6 +2303,23 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 13,
+     "name" : "HAL_COLOR_MODE_DISPLAY_BT2020"
+    }
+   ],
+   "linker_set_key" : "_ZTI25android_color_mode_v1_2_t",
+   "name" : "android_color_mode_v1_2_t",
+   "referenced_type" : "_ZTI25android_color_mode_v1_2_t",
+   "self_type" : "_ZTI25android_color_mode_v1_2_t",
+   "size" : 4,
+   "source_file" : "system/core/libsystem/include/system/graphics-base-v1.2.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 0,
      "name" : "HAL_COLOR_TRANSFORM_IDENTITY"
     },
@@ -2486,6 +2559,31 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 1,
+     "name" : "android::VectorImpl::HAS_TRIVIAL_CTOR"
+    },
+    {
+     "enum_field_value" : 2,
+     "name" : "android::VectorImpl::HAS_TRIVIAL_DTOR"
+    },
+    {
+     "enum_field_value" : 4,
+     "name" : "android::VectorImpl::HAS_TRIVIAL_COPY"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android10VectorImpl17$HAS_TRIVIAL_COPYE",
+   "name" : "android::VectorImpl::(unnamed)",
+   "referenced_type" : "_ZTIN7android10VectorImpl17$HAS_TRIVIAL_COPYE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android10VectorImpl17$HAS_TRIVIAL_COPYE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 0,
      "name" : "android::trait_pointer<android::sysprop_change_callback_info>::value"
     }
@@ -2630,6 +2728,99 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 0,
+     "name" : "android::OK"
+    },
+    {
+     "enum_field_value" : 0,
+     "name" : "android::NO_ERROR"
+    },
+    {
+     "enum_field_value" : -2147483648,
+     "name" : "android::UNKNOWN_ERROR"
+    },
+    {
+     "enum_field_value" : -12,
+     "name" : "android::NO_MEMORY"
+    },
+    {
+     "enum_field_value" : -38,
+     "name" : "android::INVALID_OPERATION"
+    },
+    {
+     "enum_field_value" : -22,
+     "name" : "android::BAD_VALUE"
+    },
+    {
+     "enum_field_value" : -2147483647,
+     "name" : "android::BAD_TYPE"
+    },
+    {
+     "enum_field_value" : -2,
+     "name" : "android::NAME_NOT_FOUND"
+    },
+    {
+     "enum_field_value" : -1,
+     "name" : "android::PERMISSION_DENIED"
+    },
+    {
+     "enum_field_value" : -19,
+     "name" : "android::NO_INIT"
+    },
+    {
+     "enum_field_value" : -17,
+     "name" : "android::ALREADY_EXISTS"
+    },
+    {
+     "enum_field_value" : -32,
+     "name" : "android::DEAD_OBJECT"
+    },
+    {
+     "enum_field_value" : -2147483646,
+     "name" : "android::FAILED_TRANSACTION"
+    },
+    {
+     "enum_field_value" : -75,
+     "name" : "android::BAD_INDEX"
+    },
+    {
+     "enum_field_value" : -61,
+     "name" : "android::NOT_ENOUGH_DATA"
+    },
+    {
+     "enum_field_value" : -11,
+     "name" : "android::WOULD_BLOCK"
+    },
+    {
+     "enum_field_value" : -110,
+     "name" : "android::TIMED_OUT"
+    },
+    {
+     "enum_field_value" : -74,
+     "name" : "android::UNKNOWN_TRANSACTION"
+    },
+    {
+     "enum_field_value" : -2147483641,
+     "name" : "android::FDS_NOT_ALLOWED"
+    },
+    {
+     "enum_field_value" : -2147483640,
+     "name" : "android::UNEXPECTED_NULL"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android15$ALREADY_EXISTSE",
+   "name" : "android::(unnamed)",
+   "referenced_type" : "_ZTIN7android15$ALREADY_EXISTSE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/Errors.sdump",
+   "self_type" : "_ZTIN7android15$ALREADY_EXISTSE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/Errors.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/Errors.h",
+   "underlying_type" : "_ZTIi"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 19,
      "name" : "android::PRIORITY_LOWEST"
     },
@@ -2760,6 +2951,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<bool>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIbE6$valueE",
+   "name" : "android::trait_trivial_copy<bool>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<char>::value"
     }
    ],
@@ -2777,6 +2985,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIcE6$valueE",
+   "name" : "android::trait_trivial_copy<char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<double>::value"
     }
    ],
@@ -2794,6 +3019,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<double>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIdE6$valueE",
+   "name" : "android::trait_trivial_copy<double>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<float>::value"
     }
    ],
@@ -2811,6 +3053,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<float>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIfE6$valueE",
+   "name" : "android::trait_trivial_copy<float>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<unsigned char>::value"
     }
    ],
@@ -2828,6 +3087,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<unsigned char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIhE6$valueE",
+   "name" : "android::trait_trivial_copy<unsigned char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<int>::value"
     }
    ],
@@ -2845,6 +3121,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIiE6$valueE",
+   "name" : "android::trait_trivial_copy<int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<unsigned int>::value"
     }
    ],
@@ -2862,6 +3155,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<unsigned int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIjE6$valueE",
+   "name" : "android::trait_trivial_copy<unsigned int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<long>::value"
     }
    ],
@@ -2879,6 +3189,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIlE6$valueE",
+   "name" : "android::trait_trivial_copy<long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<unsigned long>::value"
     }
    ],
@@ -2896,6 +3223,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<unsigned long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyImE6$valueE",
+   "name" : "android::trait_trivial_copy<unsigned long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<short>::value"
     }
    ],
@@ -2913,6 +3257,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIsE6$valueE",
+   "name" : "android::trait_trivial_copy<short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<unsigned short>::value"
     }
    ],
@@ -2930,6 +3291,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<unsigned short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyItE6$valueE",
+   "name" : "android::trait_trivial_copy<unsigned short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<void>::value"
     }
    ],
@@ -2947,6 +3325,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<void>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIvE6$valueE",
+   "name" : "android::trait_trivial_copy<void>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<long long>::value"
     }
    ],
@@ -2964,6 +3359,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIxE6$valueE",
+   "name" : "android::trait_trivial_copy<long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_copy<unsigned long long>::value"
     }
    ],
@@ -2980,6 +3392,23 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 1,
+     "name" : "android::trait_trivial_copy<unsigned long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIyE6$valueE",
+   "name" : "android::trait_trivial_copy<unsigned long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 0,
      "name" : "android::trait_trivial_ctor<android::sysprop_change_callback_info>::value"
     }
@@ -3049,6 +3478,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<bool>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIbE6$valueE",
+   "name" : "android::trait_trivial_ctor<bool>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<char>::value"
     }
    ],
@@ -3066,6 +3512,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIcE6$valueE",
+   "name" : "android::trait_trivial_ctor<char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<double>::value"
     }
    ],
@@ -3083,6 +3546,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<double>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIdE6$valueE",
+   "name" : "android::trait_trivial_ctor<double>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<float>::value"
     }
    ],
@@ -3100,6 +3580,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<float>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIfE6$valueE",
+   "name" : "android::trait_trivial_ctor<float>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<unsigned char>::value"
     }
    ],
@@ -3117,6 +3614,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<unsigned char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIhE6$valueE",
+   "name" : "android::trait_trivial_ctor<unsigned char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<int>::value"
     }
    ],
@@ -3134,6 +3648,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIiE6$valueE",
+   "name" : "android::trait_trivial_ctor<int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<unsigned int>::value"
     }
    ],
@@ -3151,6 +3682,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<unsigned int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIjE6$valueE",
+   "name" : "android::trait_trivial_ctor<unsigned int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<long>::value"
     }
    ],
@@ -3168,6 +3716,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIlE6$valueE",
+   "name" : "android::trait_trivial_ctor<long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<unsigned long>::value"
     }
    ],
@@ -3185,6 +3750,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<unsigned long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorImE6$valueE",
+   "name" : "android::trait_trivial_ctor<unsigned long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<short>::value"
     }
    ],
@@ -3202,6 +3784,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIsE6$valueE",
+   "name" : "android::trait_trivial_ctor<short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<unsigned short>::value"
     }
    ],
@@ -3219,6 +3818,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<unsigned short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorItE6$valueE",
+   "name" : "android::trait_trivial_ctor<unsigned short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<void>::value"
     }
    ],
@@ -3236,6 +3852,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<void>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIvE6$valueE",
+   "name" : "android::trait_trivial_ctor<void>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<long long>::value"
     }
    ],
@@ -3253,6 +3886,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIxE6$valueE",
+   "name" : "android::trait_trivial_ctor<long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_ctor<unsigned long long>::value"
     }
    ],
@@ -3269,6 +3919,23 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 1,
+     "name" : "android::trait_trivial_ctor<unsigned long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIyE6$valueE",
+   "name" : "android::trait_trivial_ctor<unsigned long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 0,
      "name" : "android::trait_trivial_dtor<android::sysprop_change_callback_info>::value"
     }
@@ -3338,6 +4005,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<bool>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIbE6$valueE",
+   "name" : "android::trait_trivial_dtor<bool>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<char>::value"
     }
    ],
@@ -3355,6 +4039,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIcE6$valueE",
+   "name" : "android::trait_trivial_dtor<char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<double>::value"
     }
    ],
@@ -3372,6 +4073,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<double>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIdE6$valueE",
+   "name" : "android::trait_trivial_dtor<double>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<float>::value"
     }
    ],
@@ -3389,6 +4107,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<float>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIfE6$valueE",
+   "name" : "android::trait_trivial_dtor<float>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<unsigned char>::value"
     }
    ],
@@ -3406,6 +4141,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<unsigned char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIhE6$valueE",
+   "name" : "android::trait_trivial_dtor<unsigned char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<int>::value"
     }
    ],
@@ -3423,6 +4175,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIiE6$valueE",
+   "name" : "android::trait_trivial_dtor<int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<unsigned int>::value"
     }
    ],
@@ -3440,6 +4209,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<unsigned int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIjE6$valueE",
+   "name" : "android::trait_trivial_dtor<unsigned int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<long>::value"
     }
    ],
@@ -3457,6 +4243,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIlE6$valueE",
+   "name" : "android::trait_trivial_dtor<long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<unsigned long>::value"
     }
    ],
@@ -3474,6 +4277,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<unsigned long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorImE6$valueE",
+   "name" : "android::trait_trivial_dtor<unsigned long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<short>::value"
     }
    ],
@@ -3491,6 +4311,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIsE6$valueE",
+   "name" : "android::trait_trivial_dtor<short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<unsigned short>::value"
     }
    ],
@@ -3508,6 +4345,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<unsigned short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorItE6$valueE",
+   "name" : "android::trait_trivial_dtor<unsigned short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<void>::value"
     }
    ],
@@ -3525,6 +4379,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<void>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIvE6$valueE",
+   "name" : "android::trait_trivial_dtor<void>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<long long>::value"
     }
    ],
@@ -3542,6 +4413,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIxE6$valueE",
+   "name" : "android::trait_trivial_dtor<long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_dtor<unsigned long long>::value"
     }
    ],
@@ -3558,6 +4446,23 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 1,
+     "name" : "android::trait_trivial_dtor<unsigned long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIyE6$valueE",
+   "name" : "android::trait_trivial_dtor<unsigned long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 0,
      "name" : "android::trait_trivial_move<android::sysprop_change_callback_info>::value"
     }
@@ -3627,6 +4532,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<android::String8>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveINS_7String8EE6$valueE",
+   "name" : "android::trait_trivial_move<android::String8>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveINS_7String8EE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveINS_7String8EE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<android::String16>::value"
     }
    ],
@@ -3635,7 +4557,7 @@
    "referenced_type" : "_ZTIN7android18trait_trivial_moveINS_8String16EE6$valueE",
    "self_type" : "_ZTIN7android18trait_trivial_moveINS_8String16EE6$valueE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String16.h",
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h",
    "underlying_type" : "_ZTIj"
   },
   {
@@ -3661,6 +4583,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<bool>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIbE6$valueE",
+   "name" : "android::trait_trivial_move<bool>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIbE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<char>::value"
     }
    ],
@@ -3678,6 +4617,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIcE6$valueE",
+   "name" : "android::trait_trivial_move<char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIcE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<double>::value"
     }
    ],
@@ -3695,6 +4651,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<double>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIdE6$valueE",
+   "name" : "android::trait_trivial_move<double>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIdE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<float>::value"
     }
    ],
@@ -3712,6 +4685,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<float>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIfE6$valueE",
+   "name" : "android::trait_trivial_move<float>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIfE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<unsigned char>::value"
     }
    ],
@@ -3729,6 +4719,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<unsigned char>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIhE6$valueE",
+   "name" : "android::trait_trivial_move<unsigned char>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIhE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<int>::value"
     }
    ],
@@ -3746,6 +4753,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIiE6$valueE",
+   "name" : "android::trait_trivial_move<int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIiE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<unsigned int>::value"
     }
    ],
@@ -3763,6 +4787,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<unsigned int>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIjE6$valueE",
+   "name" : "android::trait_trivial_move<unsigned int>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIjE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<long>::value"
     }
    ],
@@ -3780,6 +4821,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIlE6$valueE",
+   "name" : "android::trait_trivial_move<long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIlE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<unsigned long>::value"
     }
    ],
@@ -3797,6 +4855,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<unsigned long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveImE6$valueE",
+   "name" : "android::trait_trivial_move<unsigned long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveImE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<short>::value"
     }
    ],
@@ -3814,6 +4889,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIsE6$valueE",
+   "name" : "android::trait_trivial_move<short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIsE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<unsigned short>::value"
     }
    ],
@@ -3831,6 +4923,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<unsigned short>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveItE6$valueE",
+   "name" : "android::trait_trivial_move<unsigned short>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveItE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<void>::value"
     }
    ],
@@ -3848,6 +4957,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<void>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIvE6$valueE",
+   "name" : "android::trait_trivial_move<void>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIvE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<long long>::value"
     }
    ],
@@ -3865,6 +4991,23 @@
    [
     {
      "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIxE6$valueE",
+   "name" : "android::trait_trivial_move<long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIxE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 1,
      "name" : "android::trait_trivial_move<unsigned long long>::value"
     }
    ],
@@ -3881,6 +5024,23 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 1,
+     "name" : "android::trait_trivial_move<unsigned long long>::value"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIyE6$valueE",
+   "name" : "android::trait_trivial_move<unsigned long long>::(unnamed)",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIyE6$valueE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 0,
      "name" : "android::Mutex::PRIVATE"
     },
@@ -4153,6 +5313,24 @@
    "enum_fields" :
    [
     {
+     "enum_field_value" : 1,
+     "name" : "android::RefBase::FIRST_INC_STRONG"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android7RefBase17$FIRST_INC_STRONGE",
+   "name" : "android::RefBase::(unnamed)",
+   "referenced_type" : "_ZTIN7android7RefBase17$FIRST_INC_STRONGE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android7RefBase17$FIRST_INC_STRONGE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
+   "access" : "protected",
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
      "enum_field_value" : 0,
      "name" : "android::RefBase::OBJECT_LIFETIME_STRONG"
     },
@@ -4174,6 +5352,32 @@
    "underlying_type" : "_ZTIj"
   },
   {
+   "access" : "protected",
+   "alignment" : 4,
+   "enum_fields" :
+   [
+    {
+     "enum_field_value" : 0,
+     "name" : "android::RefBase::OBJECT_LIFETIME_STRONG"
+    },
+    {
+     "enum_field_value" : 1,
+     "name" : "android::RefBase::OBJECT_LIFETIME_WEAK"
+    },
+    {
+     "enum_field_value" : 1,
+     "name" : "android::RefBase::OBJECT_LIFETIME_MASK"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android7RefBase21$OBJECT_LIFETIME_MASKE",
+   "name" : "android::RefBase::(unnamed)",
+   "referenced_type" : "_ZTIN7android7RefBase21$OBJECT_LIFETIME_MASKE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android7RefBase21$OBJECT_LIFETIME_MASKE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h",
+   "underlying_type" : "_ZTIj"
+  },
+  {
    "alignment" : 4,
    "enum_fields" :
    [
@@ -4282,7 +5486,7 @@
    "referenced_type" : "_ZTIFiPKvS0_E",
    "return_type" : "_ZTIi",
    "self_type" : "_ZTIFiPKvS0_E",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 4,
@@ -4303,7 +5507,7 @@
    "referenced_type" : "_ZTIFiPKvS0_PvE",
    "return_type" : "_ZTIi",
    "self_type" : "_ZTIFiPKvS0_PvE",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 4,
@@ -4459,7 +5663,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::setCapacity",
@@ -4475,7 +5679,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::appendVector",
@@ -4491,7 +5695,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::editArrayImpl",
@@ -4504,7 +5708,7 @@
     }
    ],
    "return_type" : "_ZTIPv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::finish_vector",
@@ -4517,7 +5721,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::insertArrayAt",
@@ -4539,7 +5743,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::removeItemsAt",
@@ -4559,7 +5763,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::insertVectorAt",
@@ -4578,7 +5782,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "access" : "protected",
@@ -4592,7 +5796,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::editItemLocation",
@@ -4608,7 +5812,7 @@
     }
    ],
    "return_type" : "_ZTIPv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::add",
@@ -4624,7 +5828,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::add",
@@ -4637,7 +5841,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::pop",
@@ -4650,7 +5854,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::push",
@@ -4666,7 +5870,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::push",
@@ -4679,7 +5883,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::sort",
@@ -4695,7 +5899,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::sort",
@@ -4714,7 +5918,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "access" : "private",
@@ -4734,7 +5938,7 @@
     }
    ],
    "return_type" : "_ZTIPv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::clear",
@@ -4747,7 +5951,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::resize",
@@ -4763,7 +5967,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "access" : "private",
@@ -4783,7 +5987,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::insertAt",
@@ -4806,7 +6010,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::insertAt",
@@ -4826,7 +6030,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::replaceAt",
@@ -4845,7 +6049,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::replaceAt",
@@ -4861,7 +6065,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::VectorImpl",
@@ -4877,7 +6081,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::VectorImpl",
@@ -4896,7 +6100,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::~VectorImpl",
@@ -4909,7 +6113,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::~VectorImpl",
@@ -4922,7 +6126,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::~VectorImpl",
@@ -4935,7 +6139,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::operator=",
@@ -4951,7 +6155,7 @@
     }
    ],
    "return_type" : "_ZTIRN7android10VectorImplE",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::uptimeNanos",
@@ -5252,7 +6456,7 @@
     }
    ],
    "return_type" : "_ZTINSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE",
-   "source_file" : "system/core/libutils/include/utils/Errors.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Errors.h"
   },
   {
    "function_name" : "android::elapsedRealtime",
@@ -5274,7 +6478,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::merge",
@@ -5290,7 +6494,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::merge",
@@ -5306,7 +6510,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::remove",
@@ -5322,7 +6526,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::SortedVectorImpl",
@@ -5338,7 +6542,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::SortedVectorImpl",
@@ -5357,7 +6561,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::~SortedVectorImpl",
@@ -5370,7 +6574,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::~SortedVectorImpl",
@@ -5383,7 +6587,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::~SortedVectorImpl",
@@ -5396,7 +6600,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::operator=",
@@ -5412,7 +6616,7 @@
     }
    ],
    "return_type" : "_ZTIRN7android16SortedVectorImplE",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::JenkinsHashWhiten",
@@ -5676,6 +6880,64 @@
    "source_file" : "system/core/libutils/include/utils/misc.h"
   },
   {
+   "function_name" : "android::sp<android::LooperCallback>::clear",
+   "linker_set_key" : "_ZN7android2spINS_14LooperCallbackEE5clearEv",
+   "parameters" :
+   [
+    {
+     "is_this_ptr" : true,
+     "referenced_type" : "_ZTIPN7android2spINS_14LooperCallbackEEE"
+    }
+   ],
+   "return_type" : "_ZTIv",
+   "source_file" : "system/core/libutils/include/utils/StrongPointer.h"
+  },
+  {
+   "function_name" : "android::sp<android::Looper>::operator=",
+   "linker_set_key" : "_ZN7android2spINS_6LooperEEaSEOS2_",
+   "parameters" :
+   [
+    {
+     "is_this_ptr" : true,
+     "referenced_type" : "_ZTIPN7android2spINS_6LooperEEE"
+    },
+    {
+     "referenced_type" : "_ZTION7android2spINS_6LooperEEE"
+    }
+   ],
+   "return_type" : "_ZTIRN7android2spINS_6LooperEEE",
+   "source_file" : "system/core/libutils/include/utils/StrongPointer.h"
+  },
+  {
+   "function_name" : "android::sp<android::Thread>::clear",
+   "linker_set_key" : "_ZN7android2spINS_6ThreadEE5clearEv",
+   "parameters" :
+   [
+    {
+     "is_this_ptr" : true,
+     "referenced_type" : "_ZTIPN7android2spINS_6ThreadEEE"
+    }
+   ],
+   "return_type" : "_ZTIv",
+   "source_file" : "system/core/libutils/include/utils/StrongPointer.h"
+  },
+  {
+   "function_name" : "android::sp<android::Thread>::operator=",
+   "linker_set_key" : "_ZN7android2spINS_6ThreadEEaSEOS2_",
+   "parameters" :
+   [
+    {
+     "is_this_ptr" : true,
+     "referenced_type" : "_ZTIPN7android2spINS_6ThreadEEE"
+    },
+    {
+     "referenced_type" : "_ZTION7android2spINS_6ThreadEEE"
+    }
+   ],
+   "return_type" : "_ZTIRN7android2spINS_6ThreadEEE",
+   "source_file" : "system/core/libutils/include/utils/StrongPointer.h"
+  },
+  {
    "function_name" : "android::LightRefBase_reportIncStrongRequireStrongFailed",
    "linker_set_key" : "_ZN7android47LightRefBase_reportIncStrongRequireStrongFailedEPKv",
    "parameters" :
@@ -5952,6 +7214,22 @@
    "source_file" : "system/core/libutils/include/utils/Looper.h"
   },
   {
+   "function_name" : "android::Looper::repoll",
+   "linker_set_key" : "_ZN7android6Looper6repollEi",
+   "parameters" :
+   [
+    {
+     "is_this_ptr" : true,
+     "referenced_type" : "_ZTIPN7android6LooperE"
+    },
+    {
+     "referenced_type" : "_ZTIi"
+    }
+   ],
+   "return_type" : "_ZTIi",
+   "source_file" : "system/core/libutils/include/utils/Looper.h"
+  },
+  {
    "function_name" : "android::Looper::pollAll",
    "linker_set_key" : "_ZN7android6Looper7pollAllEiPiS1_PPv",
    "parameters" :
@@ -6489,11 +7767,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "private",
@@ -6509,7 +7787,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "private",
@@ -6518,7 +7796,7 @@
    "parameters" :
    [
     {
-     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE"
+     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
@@ -6528,7 +7806,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "private",
@@ -6537,7 +7815,7 @@
    "parameters" :
    [
     {
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
@@ -6547,7 +7825,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::attemptIncWeak",
@@ -6556,14 +7834,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE"
+     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::attemptIncStrong",
@@ -6572,14 +7850,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE"
+     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::incWeakRequireWeak",
@@ -6588,14 +7866,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE"
+     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::decWeak",
@@ -6604,14 +7882,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE"
+     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::incWeak",
@@ -6620,14 +7898,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE"
+     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::trackMe",
@@ -6636,7 +7914,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE"
+     "referenced_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIb"
@@ -6646,7 +7924,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6656,14 +7934,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6673,14 +7951,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6690,14 +7968,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIi"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6707,7 +7985,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIj"
@@ -6717,7 +7995,7 @@
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6727,11 +8005,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6741,11 +8019,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6755,11 +8033,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6769,11 +8047,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "protected",
@@ -6783,11 +8061,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7RefBaseE"
+     "referenced_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::String8::lockBuffer",
@@ -6796,14 +8074,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIj"
     }
    ],
    "return_type" : "_ZTIPc",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "access" : "private",
@@ -6813,7 +8091,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
@@ -6823,7 +8101,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::appendFormat",
@@ -6832,14 +8110,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::unlockBuffer",
@@ -6848,14 +8126,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIj"
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::unlockBuffer",
@@ -6864,11 +8142,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::appendFormatV",
@@ -6877,7 +8155,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
@@ -6887,7 +8165,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::clear",
@@ -6896,11 +8174,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::setTo",
@@ -6909,7 +8187,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDi"
@@ -6919,7 +8197,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::setTo",
@@ -6928,7 +8206,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDs"
@@ -6938,7 +8216,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::setTo",
@@ -6947,14 +8225,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::setTo",
@@ -6963,7 +8241,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
@@ -6973,7 +8251,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::setTo",
@@ -6982,14 +8260,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
-     "referenced_type" : "_ZTIRKN7android7String8E"
+     "referenced_type" : "_ZTIRKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::append",
@@ -6998,14 +8276,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::append",
@@ -7014,7 +8292,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
@@ -7024,7 +8302,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::append",
@@ -7033,14 +8311,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
-     "referenced_type" : "_ZTIRKN7android7String8E"
+     "referenced_type" : "_ZTIRKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::format",
@@ -7051,8 +8329,8 @@
      "referenced_type" : "_ZTIPKc"
     }
    ],
-   "return_type" : "_ZTIN7android7String8E",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "return_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::formatV",
@@ -7066,8 +8344,8 @@
      "referenced_type" : "_ZTISt9__va_list"
     }
    ],
-   "return_type" : "_ZTIN7android7String8E",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "return_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::toLower",
@@ -7076,11 +8354,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::removeAll",
@@ -7089,14 +8367,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7105,14 +8383,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDi"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7121,7 +8399,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDi"
@@ -7131,7 +8409,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7140,14 +8418,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDs"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7156,7 +8434,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDs"
@@ -7166,7 +8444,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7175,14 +8453,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7191,7 +8469,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
@@ -7201,7 +8479,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7210,14 +8488,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIRKN7android8String16E"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7226,14 +8504,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
-     "referenced_type" : "_ZTIRKN7android7String8E"
+     "referenced_type" : "_ZTIRKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7242,11 +8520,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7255,14 +8533,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDi"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7271,7 +8549,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDi"
@@ -7281,7 +8559,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7290,14 +8568,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDs"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7306,7 +8584,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKDs"
@@ -7316,7 +8594,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7325,14 +8603,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7341,7 +8619,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
@@ -7351,7 +8629,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7360,14 +8638,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIRKN7android8String16E"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7376,14 +8654,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
-     "referenced_type" : "_ZTIRKN7android7String8E"
+     "referenced_type" : "_ZTIRKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::String8",
@@ -7392,11 +8670,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::~String8",
@@ -7405,11 +8683,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::~String8",
@@ -7418,11 +8696,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPN7android7String8E"
+     "referenced_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "access" : "private",
@@ -7439,7 +8717,7 @@
     }
    ],
    "return_type" : "_ZTIPv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::replaceAll",
@@ -7458,7 +8736,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "access" : "private",
@@ -7474,7 +8752,7 @@
     }
    ],
    "return_type" : "_ZTIPDs",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "access" : "private",
@@ -7490,7 +8768,7 @@
     }
    ],
    "return_type" : "_ZTIPDs",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "access" : "private",
@@ -7504,7 +8782,7 @@
     }
    ],
    "return_type" : "_ZTIPv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "access" : "private",
@@ -7517,7 +8795,7 @@
     }
    ],
    "return_type" : "_ZTIPv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::setTo",
@@ -7533,7 +8811,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::setTo",
@@ -7552,7 +8830,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::setTo",
@@ -7568,7 +8846,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::setTo",
@@ -7591,7 +8869,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::append",
@@ -7610,7 +8888,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::append",
@@ -7626,7 +8904,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::insert",
@@ -7645,7 +8923,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::insert",
@@ -7667,7 +8945,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "access" : "private",
@@ -7681,7 +8959,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "access" : "private",
@@ -7695,7 +8973,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7711,7 +8989,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7727,7 +9005,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7746,7 +9024,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7762,7 +9040,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7781,7 +9059,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7793,11 +9071,11 @@
      "referenced_type" : "_ZTIPN7android8String16E"
     },
     {
-     "referenced_type" : "_ZTIRKN7android7String8E"
+     "referenced_type" : "_ZTIRKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7813,7 +9091,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7836,7 +9114,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7849,7 +9127,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7865,7 +9143,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7881,7 +9159,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7900,7 +9178,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7916,7 +9194,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7935,7 +9213,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7947,11 +9225,11 @@
      "referenced_type" : "_ZTIPN7android8String16E"
     },
     {
-     "referenced_type" : "_ZTIRKN7android7String8E"
+     "referenced_type" : "_ZTIRKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7967,7 +9245,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -7990,7 +9268,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::String16",
@@ -8003,7 +9281,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::~String16",
@@ -8016,7 +9294,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::~String16",
@@ -8029,7 +9307,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::operator=",
@@ -8045,7 +9323,7 @@
     }
    ],
    "return_type" : "_ZTIRN7android8String16E",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::FdPrinter::printLine",
@@ -8359,14 +9637,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android10VectorImplE"
+     "referenced_type" : "_ZTIPKN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIj"
     }
    ],
    "return_type" : "_ZTIPKv",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::VectorImpl::capacity",
@@ -8375,11 +9653,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android10VectorImplE"
+     "referenced_type" : "_ZTIPKN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIj",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "access" : "protected",
@@ -8389,11 +9667,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android10VectorImplE"
+     "referenced_type" : "_ZTIPKN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIj",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "access" : "private",
@@ -8414,7 +9692,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::indexOf",
@@ -8430,7 +9708,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::SortedVectorImpl::orderOf",
@@ -8446,7 +9724,7 @@
     }
    ],
    "return_type" : "_ZTIj",
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "function_name" : "android::Looper::getAllowNonCallbacks",
@@ -8930,14 +10208,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7RefBaseE"
+     "referenced_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
-   "return_type" : "_ZTIPN7android7RefBase12weakref_typeE",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "return_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::getWeakRefs",
@@ -8946,11 +10224,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7RefBaseE"
+     "referenced_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
-   "return_type" : "_ZTIPN7android7RefBase12weakref_typeE",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "return_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::getWeakCount",
@@ -8963,7 +10241,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::refBase",
@@ -8975,8 +10253,8 @@
      "referenced_type" : "_ZTIPKN7android7RefBase12weakref_typeE"
     }
    ],
-   "return_type" : "_ZTIPN7android7RefBaseE",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "return_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::weakref_type::printRefs",
@@ -8989,7 +10267,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::forceIncStrong",
@@ -8998,14 +10276,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7RefBaseE"
+     "referenced_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::getStrongCount",
@@ -9014,11 +10292,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7RefBaseE"
+     "referenced_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::incStrongRequireStrong",
@@ -9027,14 +10305,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7RefBaseE"
+     "referenced_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::decStrong",
@@ -9043,14 +10321,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7RefBaseE"
+     "referenced_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "function_name" : "android::RefBase::incStrong",
@@ -9059,14 +10337,14 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7RefBaseE"
+     "referenced_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKv"
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "access" : "private",
@@ -9076,11 +10354,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7String8E"
+     "referenced_type" : "_ZTIPKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
-   "return_type" : "_ZTIN7android7String8E",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "return_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "access" : "private",
@@ -9090,11 +10368,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7String8E"
+     "referenced_type" : "_ZTIPKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
-   "return_type" : "_ZTIN7android7String8E",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "return_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::find",
@@ -9103,7 +10381,7 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7String8E"
+     "referenced_type" : "_ZTIPKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     },
     {
      "referenced_type" : "_ZTIPKc"
@@ -9114,7 +10392,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String8::length",
@@ -9123,11 +10401,11 @@
    [
     {
      "is_this_ptr" : true,
-     "referenced_type" : "_ZTIPKN7android7String8E"
+     "referenced_type" : "_ZTIPKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "return_type" : "_ZTIj",
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "function_name" : "android::String16::startsWith",
@@ -9143,7 +10421,7 @@
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::startsWith",
@@ -9159,7 +10437,7 @@
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::isStaticString",
@@ -9172,7 +10450,7 @@
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "access" : "private",
@@ -9186,7 +10464,7 @@
     }
    ],
    "return_type" : "_ZTIj",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::size",
@@ -9199,7 +10477,7 @@
     }
    ],
    "return_type" : "_ZTIj",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::contains",
@@ -9215,7 +10493,7 @@
     }
    ],
    "return_type" : "_ZTIb",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::findLast",
@@ -9231,7 +10509,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::String16::findFirst",
@@ -9247,7 +10525,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "function_name" : "android::StopWatch::elapsedTime",
@@ -9440,7 +10718,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "strlen16",
@@ -9452,7 +10730,7 @@
     }
    ],
    "return_type" : "_ZTIj",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "strncmp16",
@@ -9470,7 +10748,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "strnlen16",
@@ -9485,7 +10763,7 @@
     }
    ],
    "return_type" : "_ZTIj",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "strstr16",
@@ -9500,7 +10778,7 @@
     }
    ],
    "return_type" : "_ZTIPDs",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "strzcmp16",
@@ -9521,7 +10799,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "systemTime",
@@ -9570,7 +10848,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "utf16_to_utf8_length",
@@ -9585,7 +10863,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "utf32_from_utf8_at",
@@ -9606,7 +10884,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "utf32_to_utf8",
@@ -9627,7 +10905,7 @@
     }
    ],
    "return_type" : "_ZTIv",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "utf32_to_utf8_length",
@@ -9642,7 +10920,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "utf8_to_utf16",
@@ -9663,7 +10941,7 @@
     }
    ],
    "return_type" : "_ZTIPDs",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "utf8_to_utf16_length",
@@ -9682,7 +10960,7 @@
     }
    ],
    "return_type" : "_ZTIi",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "function_name" : "utf8_to_utf16_no_null_terminator",
@@ -9703,7 +10981,7 @@
     }
    ],
    "return_type" : "_ZTIPDs",
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   }
  ],
  "global_vars" :
@@ -9725,16 +11003,16 @@
    "referenced_type" : "_ZTIA1_KDs",
    "self_type" : "_ZTIRA1_KDs",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
    "linker_set_key" : "_ZTIRKN7android10VectorImplE",
    "name" : "const android::VectorImpl &",
-   "referenced_type" : "_ZTIKN7android10VectorImplE",
+   "referenced_type" : "_ZTIKN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIRKN7android10VectorImplE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 4,
@@ -9743,7 +11021,7 @@
    "referenced_type" : "_ZTIKN7android16ReferenceRenamerE",
    "self_type" : "_ZTIRKN7android16ReferenceRenamerE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "alignment" : 4,
@@ -9752,7 +11030,7 @@
    "referenced_type" : "_ZTIKN7android16SortedVectorImplE",
    "self_type" : "_ZTIRKN7android16SortedVectorImplE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 4,
@@ -9864,12 +11142,21 @@
   },
   {
    "alignment" : 4,
+   "linker_set_key" : "_ZTIRKN7android7String8E",
+   "name" : "const android::String8 &",
+   "referenced_type" : "_ZTIKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIRKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
+  },
+  {
+   "alignment" : 4,
    "linker_set_key" : "_ZTIRKN7android8String1610StaticDataILj1EEE",
    "name" : "const android::String16::StaticData<1> &",
    "referenced_type" : "_ZTIKN7android8String1610StaticDataILj1EEE",
    "self_type" : "_ZTIRKN7android8String1610StaticDataILj1EEE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -9878,7 +11165,7 @@
    "referenced_type" : "_ZTIKN7android8String16E",
    "self_type" : "_ZTIRKN7android8String16E",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -9983,19 +11270,19 @@
    "alignment" : 4,
    "linker_set_key" : "_ZTIRN7android10VectorImplE",
    "name" : "android::VectorImpl &",
-   "referenced_type" : "_ZTIN7android10VectorImplE",
+   "referenced_type" : "_ZTIN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIRN7android10VectorImplE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 4,
    "linker_set_key" : "_ZTIRN7android16SortedVectorImplE",
    "name" : "android::SortedVectorImpl &",
-   "referenced_type" : "_ZTIN7android16SortedVectorImplE",
+   "referenced_type" : "_ZTIN7android16SortedVectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIRN7android16SortedVectorImplE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 4,
@@ -10107,12 +11394,21 @@
   },
   {
    "alignment" : 4,
+   "linker_set_key" : "_ZTIRN7android7String8E",
+   "name" : "android::String8 &",
+   "referenced_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIRN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
+  },
+  {
+   "alignment" : 4,
    "linker_set_key" : "_ZTIRN7android8String16E",
    "name" : "android::String16 &",
    "referenced_type" : "_ZTIN7android8String16E",
    "self_type" : "_ZTIRN7android8String16E",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -10196,7 +11492,7 @@
    "referenced_type" : "_ZTIDs",
    "self_type" : "_ZTIPDs",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -10214,7 +11510,7 @@
    "referenced_type" : "_ZTIFiPKvS0_E",
    "self_type" : "_ZTIPFiPKvS0_E",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 4,
@@ -10223,7 +11519,7 @@
    "referenced_type" : "_ZTIFiPKvS0_PvE",
    "self_type" : "_ZTIPFiPKvS0_PvE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 4,
@@ -10277,7 +11573,7 @@
    "referenced_type" : "_ZTIKDi",
    "self_type" : "_ZTIPKDi",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "alignment" : 4,
@@ -10286,7 +11582,7 @@
    "referenced_type" : "_ZTIKDs",
    "self_type" : "_ZTIPKDs",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -10299,6 +11595,15 @@
   },
   {
    "alignment" : 4,
+   "linker_set_key" : "_ZTIPKN7android10VectorImplE",
+   "name" : "const android::VectorImpl *",
+   "referenced_type" : "_ZTIKN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPKN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
+  },
+  {
+   "alignment" : 4,
    "linker_set_key" : "_ZTIPKN7android12LightRefBaseINS_12NativeHandleEEE",
    "name" : "const android::LightRefBase<android::NativeHandle> *",
    "referenced_type" : "_ZTIKN7android12LightRefBaseINS_12NativeHandleEEE",
@@ -10322,7 +11627,7 @@
    "referenced_type" : "_ZTIKN7android16SortedVectorImplE",
    "self_type" : "_ZTIPKN7android16SortedVectorImplE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 4,
@@ -10484,7 +11789,7 @@
    "referenced_type" : "_ZTIKN7android6VectorINS_7String8EEE",
    "self_type" : "_ZTIPKN7android6VectorINS_7String8EEE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/Vector.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Vector.h"
   },
   {
    "alignment" : 4,
@@ -10502,7 +11807,7 @@
    "referenced_type" : "_ZTIKN7android7RefBase12weakref_typeE",
    "self_type" : "_ZTIPKN7android7RefBase12weakref_typeE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "alignment" : 4,
@@ -10515,6 +11820,15 @@
   },
   {
    "alignment" : 4,
+   "linker_set_key" : "_ZTIPKN7android7RefBaseE",
+   "name" : "const android::RefBase *",
+   "referenced_type" : "_ZTIKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
+  },
+  {
+   "alignment" : 4,
    "linker_set_key" : "_ZTIPKN7android7String8E",
    "name" : "const android::String8 *",
    "referenced_type" : "_ZTIKN7android7String8E",
@@ -10524,21 +11838,21 @@
   },
   {
    "alignment" : 4,
+   "linker_set_key" : "_ZTIPKN7android7String8E",
+   "name" : "const android::String8 *",
+   "referenced_type" : "_ZTIKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
+  },
+  {
+   "alignment" : 4,
    "linker_set_key" : "_ZTIPKN7android8String16E",
    "name" : "const android::String16 *",
    "referenced_type" : "_ZTIKN7android8String16E",
    "self_type" : "_ZTIPKN7android8String16E",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
-  },
-  {
-   "alignment" : 4,
-   "linker_set_key" : "_ZTIPKN7android9CallStackE",
-   "name" : "const android::CallStack *",
-   "referenced_type" : "_ZTIKN7android9CallStackE",
-   "self_type" : "_ZTIPKN7android9CallStackE",
-   "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/CallStack.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -10607,10 +11921,10 @@
    "alignment" : 4,
    "linker_set_key" : "_ZTIPN7android10VectorImplE",
    "name" : "android::VectorImpl *",
-   "referenced_type" : "_ZTIN7android10VectorImplE",
+   "referenced_type" : "_ZTIN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIPN7android10VectorImplE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 4,
@@ -10673,7 +11987,7 @@
    "referenced_type" : "_ZTIN7android14StaticString16ILj1EEE",
    "self_type" : "_ZTIPN7android14StaticString16ILj1EEE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -10695,12 +12009,21 @@
   },
   {
    "alignment" : 4,
+   "linker_set_key" : "_ZTIPN7android16ReferenceRenamerE",
+   "name" : "android::ReferenceRenamer *",
+   "referenced_type" : "_ZTIN7android16ReferenceRenamerE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPN7android16ReferenceRenamerE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
+  },
+  {
+   "alignment" : 4,
    "linker_set_key" : "_ZTIPN7android16SortedVectorImplE",
    "name" : "android::SortedVectorImpl *",
-   "referenced_type" : "_ZTIN7android16SortedVectorImplE",
+   "referenced_type" : "_ZTIN7android16SortedVectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIPN7android16SortedVectorImplE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 4,
@@ -10722,6 +12045,15 @@
   },
   {
    "alignment" : 4,
+   "linker_set_key" : "_ZTIPN7android19VirtualLightRefBaseE",
+   "name" : "android::VirtualLightRefBase *",
+   "referenced_type" : "_ZTIN7android19VirtualLightRefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPN7android19VirtualLightRefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/LightRefBase.h"
+  },
+  {
+   "alignment" : 4,
    "linker_set_key" : "_ZTIPN7android20SimpleLooperCallbackE",
    "name" : "android::SimpleLooperCallback *",
    "referenced_type" : "_ZTIN7android20SimpleLooperCallbackE",
@@ -10943,7 +12275,7 @@
    "referenced_type" : "_ZTIN7android6VectorINS_7String8EEE",
    "self_type" : "_ZTIPN7android6VectorINS_7String8EEE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/Vector.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Vector.h"
   },
   {
    "alignment" : 4,
@@ -10992,6 +12324,15 @@
   },
   {
    "alignment" : 4,
+   "linker_set_key" : "_ZTIPN7android7RefBase12weakref_typeE",
+   "name" : "android::RefBase::weakref_type *",
+   "referenced_type" : "_ZTIN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
+  },
+  {
+   "alignment" : 4,
    "linker_set_key" : "_ZTIPN7android7RefBaseE",
    "name" : "android::RefBase *",
    "referenced_type" : "_ZTIN7android7RefBaseE",
@@ -11001,6 +12342,15 @@
   },
   {
    "alignment" : 4,
+   "linker_set_key" : "_ZTIPN7android7RefBaseE",
+   "name" : "android::RefBase *",
+   "referenced_type" : "_ZTIN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
+  },
+  {
+   "alignment" : 4,
    "linker_set_key" : "_ZTIPN7android7String8E",
    "name" : "android::String8 *",
    "referenced_type" : "_ZTIN7android7String8E",
@@ -11010,12 +12360,21 @@
   },
   {
    "alignment" : 4,
+   "linker_set_key" : "_ZTIPN7android7String8E",
+   "name" : "android::String8 *",
+   "referenced_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIPN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
+  },
+  {
+   "alignment" : 4,
    "linker_set_key" : "_ZTIPN7android8String1610StaticDataILj1EEE",
    "name" : "android::String16::StaticData<1> *",
    "referenced_type" : "_ZTIN7android8String1610StaticDataILj1EEE",
    "self_type" : "_ZTIPN7android8String1610StaticDataILj1EEE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -11024,25 +12383,7 @@
    "referenced_type" : "_ZTIN7android8String16E",
    "self_type" : "_ZTIPN7android8String16E",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
-  },
-  {
-   "alignment" : 4,
-   "linker_set_key" : "_ZTIPN7android9CallStack12StackDeleterE",
-   "name" : "android::CallStack::StackDeleter *",
-   "referenced_type" : "_ZTIN7android9CallStack12StackDeleterE",
-   "self_type" : "_ZTIPN7android9CallStack12StackDeleterE",
-   "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/CallStack.h"
-  },
-  {
-   "alignment" : 4,
-   "linker_set_key" : "_ZTIPN7android9CallStackE",
-   "name" : "android::CallStack *",
-   "referenced_type" : "_ZTIN7android9CallStackE",
-   "self_type" : "_ZTIPN7android9CallStackE",
-   "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/CallStack.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -11132,7 +12473,7 @@
    "referenced_type" : "_ZTIj",
    "self_type" : "_ZTIPj",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/Unicode.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Unicode.h"
   },
   {
    "alignment" : 4,
@@ -11154,7 +12495,7 @@
    "referenced_type" : "_ZTIA1_Ds",
    "self_type" : "_ZTIA1_KDs",
    "size" : 2,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -11184,7 +12525,7 @@
    "referenced_type" : "_ZTIDi",
    "self_type" : "_ZTIKDi",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
   },
   {
    "alignment" : 2,
@@ -11194,7 +12535,17 @@
    "referenced_type" : "_ZTIDs",
    "self_type" : "_ZTIKDs",
    "size" : 2,
-   "source_file" : "system/core/libutils/include/utils/String8.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
+  },
+  {
+   "alignment" : 4,
+   "is_const" : true,
+   "linker_set_key" : "_ZTIKN7android10VectorImplE",
+   "name" : "const android::VectorImpl",
+   "referenced_type" : "_ZTIN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIKN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 20,
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 4,
@@ -11231,20 +12582,20 @@
    "is_const" : true,
    "linker_set_key" : "_ZTIKN7android16ReferenceRenamerE",
    "name" : "const android::ReferenceRenamer",
-   "referenced_type" : "_ZTIN7android16ReferenceRenamerE",
+   "referenced_type" : "_ZTIN7android16ReferenceRenamerE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIKN7android16ReferenceRenamerE",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "alignment" : 4,
    "is_const" : true,
    "linker_set_key" : "_ZTIKN7android16SortedVectorImplE",
    "name" : "const android::SortedVectorImpl",
-   "referenced_type" : "_ZTIN7android16SortedVectorImplE",
+   "referenced_type" : "_ZTIN7android16SortedVectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIKN7android16SortedVectorImplE",
    "size" : 20,
-   "source_file" : "system/core/libutils/include/utils/VectorImpl.h"
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h"
   },
   {
    "alignment" : 4,
@@ -11434,7 +12785,7 @@
    "referenced_type" : "_ZTIN7android6VectorINS_7String8EEE",
    "self_type" : "_ZTIKN7android6VectorINS_7String8EEE",
    "size" : 20,
-   "source_file" : "system/core/libutils/include/utils/Vector.h"
+   "source_file" : "system/core/libutils/binder/include/utils/Vector.h"
   },
   {
    "alignment" : 8,
@@ -11461,10 +12812,20 @@
    "is_const" : true,
    "linker_set_key" : "_ZTIKN7android7RefBase12weakref_typeE",
    "name" : "const android::RefBase::weakref_type",
-   "referenced_type" : "_ZTIN7android7RefBase12weakref_typeE",
+   "referenced_type" : "_ZTIN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
    "self_type" : "_ZTIKN7android7RefBase12weakref_typeE",
    "size" : 1,
-   "source_file" : "system/core/libutils/include/utils/RefBase.h"
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
+  },
+  {
+   "alignment" : 4,
+   "is_const" : true,
+   "linker_set_key" : "_ZTIKN7android7RefBaseE",
+   "name" : "const android::RefBase",
+   "referenced_type" : "_ZTIN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIKN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
   },
   {
    "alignment" : 4,
@@ -11481,6 +12842,16 @@
    "is_const" : true,
    "linker_set_key" : "_ZTIKN7android7String8E",
    "name" : "const android::String8",
+   "referenced_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIKN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
+  },
+  {
+   "alignment" : 4,
+   "is_const" : true,
+   "linker_set_key" : "_ZTIKN7android7String8E",
+   "name" : "const android::String8",
    "referenced_type" : "_ZTIN7android7String8E",
    "self_type" : "_ZTIKN7android7String8E",
    "size" : 4,
@@ -11494,7 +12865,7 @@
    "referenced_type" : "_ZTIN7android8String1610StaticDataILj1EEE",
    "self_type" : "_ZTIKN7android8String1610StaticDataILj1EEE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -11504,17 +12875,7 @@
    "referenced_type" : "_ZTIN7android8String16E",
    "self_type" : "_ZTIKN7android8String16E",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String8.h"
-  },
-  {
-   "alignment" : 4,
-   "is_const" : true,
-   "linker_set_key" : "_ZTIKN7android9CallStackE",
-   "name" : "const android::CallStack",
-   "referenced_type" : "_ZTIN7android9CallStackE",
-   "self_type" : "_ZTIKN7android9CallStackE",
-   "size" : 20,
-   "source_file" : "system/core/libutils/include/utils/CallStack.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 8,
@@ -12240,6 +13601,85 @@
    ]
   },
   {
+   "alignment" : 4,
+   "fields" :
+   [
+    {
+     "access" : "private",
+     "field_name" : "mStorage",
+     "field_offset" : 32,
+     "referenced_type" : "_ZTIPv"
+    },
+    {
+     "access" : "private",
+     "field_name" : "mCount",
+     "field_offset" : 64,
+     "referenced_type" : "_ZTIj"
+    },
+    {
+     "access" : "private",
+     "field_name" : "mFlags",
+     "field_offset" : 96,
+     "referenced_type" : "_ZTIKj"
+    },
+    {
+     "access" : "private",
+     "field_name" : "mItemSize",
+     "field_offset" : 128,
+     "referenced_type" : "_ZTIKj"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android10VectorImplE",
+   "name" : "android::VectorImpl",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 20,
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h",
+   "vtable_components" :
+   [
+    {
+     "kind" : "offset_to_top"
+    },
+    {
+     "kind" : "rtti",
+     "mangled_component_name" : "_ZTIN7android10VectorImplE"
+    },
+    {
+     "kind" : "complete_dtor_pointer",
+     "mangled_component_name" : "_ZN7android10VectorImplD1Ev"
+    },
+    {
+     "kind" : "deleting_dtor_pointer",
+     "mangled_component_name" : "_ZN7android10VectorImplD0Ev"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl12do_constructEPvj"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl10do_destroyEPvj"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl7do_copyEPvPKvj"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl8do_splatEPvPKvj"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl15do_move_forwardEPvPKvj"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl16do_move_backwardEPvPKvj"
+    }
+   ]
+  },
+  {
    "alignment" : 8,
    "fields" :
    [
@@ -12303,6 +13743,28 @@
   },
   {
    "alignment" : 4,
+   "fields" :
+   [
+    {
+     "access" : "private",
+     "field_name" : "mCount",
+     "referenced_type" : "_ZTINSt3__16atomicIiEE"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android12LightRefBaseINS_19VirtualLightRefBaseEEE",
+   "name" : "android::LightRefBase<android::VirtualLightRefBase>",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android12LightRefBaseINS_19VirtualLightRefBaseEEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android12LightRefBaseINS_19VirtualLightRefBaseEEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/LightRefBase.h",
+   "template_args" :
+   [
+    "_ZTIN7android19VirtualLightRefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
+   ]
+  },
+  {
+   "alignment" : 4,
    "base_specifiers" :
    [
     {
@@ -12611,6 +14073,16 @@
    "source_file" : "system/core/libutils/include/utils/RefBase.h"
   },
   {
+   "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android14ReferenceMoverE",
+   "name" : "android::ReferenceMover",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android14ReferenceMoverE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android14ReferenceMoverE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
+  },
+  {
    "alignment" : 4,
    "base_specifiers" :
    [
@@ -12633,7 +14105,7 @@
    "referenced_type" : "_ZTIN7android14StaticString16ILj1EEE",
    "self_type" : "_ZTIN7android14StaticString16ILj1EEE",
    "size" : 12,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -12716,6 +14188,30 @@
   },
   {
    "alignment" : 4,
+   "linker_set_key" : "_ZTIN7android16ReferenceRenamerE",
+   "name" : "android::ReferenceRenamer",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android16ReferenceRenamerE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android16ReferenceRenamerE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h",
+   "vtable_components" :
+   [
+    {
+     "kind" : "offset_to_top"
+    },
+    {
+     "kind" : "rtti",
+     "mangled_component_name" : "_ZTIN7android16ReferenceRenamerE"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android16ReferenceRenamerclEj"
+    }
+   ]
+  },
+  {
+   "alignment" : 4,
    "base_specifiers" :
    [
     {
@@ -12777,6 +14273,68 @@
    ]
   },
   {
+   "alignment" : 4,
+   "base_specifiers" :
+   [
+    {
+     "referenced_type" : "_ZTIN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android16SortedVectorImplE",
+   "name" : "android::SortedVectorImpl",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android16SortedVectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android16SortedVectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 20,
+   "source_file" : "system/core/libutils/binder/include/utils/VectorImpl.h",
+   "vtable_components" :
+   [
+    {
+     "kind" : "offset_to_top"
+    },
+    {
+     "kind" : "rtti",
+     "mangled_component_name" : "_ZTIN7android16SortedVectorImplE"
+    },
+    {
+     "kind" : "complete_dtor_pointer",
+     "mangled_component_name" : "_ZN7android16SortedVectorImplD1Ev"
+    },
+    {
+     "kind" : "deleting_dtor_pointer",
+     "mangled_component_name" : "_ZN7android16SortedVectorImplD0Ev"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl12do_constructEPvj"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl10do_destroyEPvj"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl7do_copyEPvPKvj"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl8do_splatEPvPKvj"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl15do_move_forwardEPvPKvj"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android10VectorImpl16do_move_backwardEPvPKvj"
+    },
+    {
+     "is_pure" : true,
+     "mangled_component_name" : "_ZNK7android16SortedVectorImpl10do_compareEPKvS2_"
+    }
+   ]
+  },
+  {
    "alignment" : 1,
    "base_specifiers" :
    [
@@ -12981,6 +14539,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIbEE",
+   "name" : "android::trait_trivial_copy<bool>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIb"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIcEE",
    "name" : "android::trait_trivial_copy<char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIcEE",
@@ -12994,6 +14565,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIcEE",
+   "name" : "android::trait_trivial_copy<char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIc"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIdEE",
    "name" : "android::trait_trivial_copy<double>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIdEE",
@@ -13007,6 +14591,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIdEE",
+   "name" : "android::trait_trivial_copy<double>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTId"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIfEE",
    "name" : "android::trait_trivial_copy<float>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIfEE",
@@ -13020,6 +14617,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIfEE",
+   "name" : "android::trait_trivial_copy<float>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIf"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIhEE",
    "name" : "android::trait_trivial_copy<unsigned char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIhEE",
@@ -13033,6 +14643,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIhEE",
+   "name" : "android::trait_trivial_copy<unsigned char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIh"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIiEE",
    "name" : "android::trait_trivial_copy<int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIiEE",
@@ -13046,6 +14669,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIiEE",
+   "name" : "android::trait_trivial_copy<int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIi"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIjEE",
    "name" : "android::trait_trivial_copy<unsigned int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIjEE",
@@ -13059,6 +14695,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIjEE",
+   "name" : "android::trait_trivial_copy<unsigned int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIj"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIlEE",
    "name" : "android::trait_trivial_copy<long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIlEE",
@@ -13072,6 +14721,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIlEE",
+   "name" : "android::trait_trivial_copy<long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIl"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyImEE",
    "name" : "android::trait_trivial_copy<unsigned long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyImEE",
@@ -13085,6 +14747,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyImEE",
+   "name" : "android::trait_trivial_copy<unsigned long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIm"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIsEE",
    "name" : "android::trait_trivial_copy<short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIsEE",
@@ -13098,6 +14773,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIsEE",
+   "name" : "android::trait_trivial_copy<short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIs"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyItEE",
    "name" : "android::trait_trivial_copy<unsigned short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyItEE",
@@ -13111,6 +14799,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyItEE",
+   "name" : "android::trait_trivial_copy<unsigned short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIt"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIvEE",
    "name" : "android::trait_trivial_copy<void>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIvEE",
@@ -13124,6 +14825,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIvEE",
+   "name" : "android::trait_trivial_copy<void>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIv"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIxEE",
    "name" : "android::trait_trivial_copy<long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIxEE",
@@ -13137,6 +14851,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIxEE",
+   "name" : "android::trait_trivial_copy<long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIx"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_copyIyEE",
    "name" : "android::trait_trivial_copy<unsigned long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_copyIyEE",
@@ -13150,6 +14877,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_copyIyEE",
+   "name" : "android::trait_trivial_copy<unsigned long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_copyIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_copyIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIy"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorINS_28sysprop_change_callback_infoEEE",
    "name" : "android::trait_trivial_ctor<android::sysprop_change_callback_info>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorINS_28sysprop_change_callback_infoEEE",
@@ -13202,6 +14942,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIbEE",
+   "name" : "android::trait_trivial_ctor<bool>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIb"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIcEE",
    "name" : "android::trait_trivial_ctor<char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIcEE",
@@ -13215,6 +14968,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIcEE",
+   "name" : "android::trait_trivial_ctor<char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIc"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIdEE",
    "name" : "android::trait_trivial_ctor<double>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIdEE",
@@ -13228,6 +14994,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIdEE",
+   "name" : "android::trait_trivial_ctor<double>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTId"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIfEE",
    "name" : "android::trait_trivial_ctor<float>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIfEE",
@@ -13241,6 +15020,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIfEE",
+   "name" : "android::trait_trivial_ctor<float>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIf"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIhEE",
    "name" : "android::trait_trivial_ctor<unsigned char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIhEE",
@@ -13254,6 +15046,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIhEE",
+   "name" : "android::trait_trivial_ctor<unsigned char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIh"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIiEE",
    "name" : "android::trait_trivial_ctor<int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIiEE",
@@ -13267,6 +15072,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIiEE",
+   "name" : "android::trait_trivial_ctor<int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIi"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIjEE",
    "name" : "android::trait_trivial_ctor<unsigned int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIjEE",
@@ -13280,6 +15098,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIjEE",
+   "name" : "android::trait_trivial_ctor<unsigned int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIj"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIlEE",
    "name" : "android::trait_trivial_ctor<long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIlEE",
@@ -13293,6 +15124,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIlEE",
+   "name" : "android::trait_trivial_ctor<long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIl"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorImEE",
    "name" : "android::trait_trivial_ctor<unsigned long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorImEE",
@@ -13306,6 +15150,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorImEE",
+   "name" : "android::trait_trivial_ctor<unsigned long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIm"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIsEE",
    "name" : "android::trait_trivial_ctor<short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIsEE",
@@ -13319,6 +15176,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIsEE",
+   "name" : "android::trait_trivial_ctor<short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIs"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorItEE",
    "name" : "android::trait_trivial_ctor<unsigned short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorItEE",
@@ -13332,6 +15202,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorItEE",
+   "name" : "android::trait_trivial_ctor<unsigned short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIt"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIvEE",
    "name" : "android::trait_trivial_ctor<void>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIvEE",
@@ -13345,6 +15228,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIvEE",
+   "name" : "android::trait_trivial_ctor<void>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIv"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIxEE",
    "name" : "android::trait_trivial_ctor<long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIxEE",
@@ -13358,6 +15254,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIxEE",
+   "name" : "android::trait_trivial_ctor<long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIx"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIyEE",
    "name" : "android::trait_trivial_ctor<unsigned long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_ctorIyEE",
@@ -13371,6 +15280,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_ctorIyEE",
+   "name" : "android::trait_trivial_ctor<unsigned long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_ctorIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_ctorIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIy"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorINS_28sysprop_change_callback_infoEEE",
    "name" : "android::trait_trivial_dtor<android::sysprop_change_callback_info>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorINS_28sysprop_change_callback_infoEEE",
@@ -13423,6 +15345,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIbEE",
+   "name" : "android::trait_trivial_dtor<bool>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIb"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIcEE",
    "name" : "android::trait_trivial_dtor<char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIcEE",
@@ -13436,6 +15371,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIcEE",
+   "name" : "android::trait_trivial_dtor<char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIc"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIdEE",
    "name" : "android::trait_trivial_dtor<double>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIdEE",
@@ -13449,6 +15397,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIdEE",
+   "name" : "android::trait_trivial_dtor<double>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTId"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIfEE",
    "name" : "android::trait_trivial_dtor<float>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIfEE",
@@ -13462,6 +15423,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIfEE",
+   "name" : "android::trait_trivial_dtor<float>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIf"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIhEE",
    "name" : "android::trait_trivial_dtor<unsigned char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIhEE",
@@ -13475,6 +15449,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIhEE",
+   "name" : "android::trait_trivial_dtor<unsigned char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIh"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIiEE",
    "name" : "android::trait_trivial_dtor<int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIiEE",
@@ -13488,6 +15475,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIiEE",
+   "name" : "android::trait_trivial_dtor<int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIi"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIjEE",
    "name" : "android::trait_trivial_dtor<unsigned int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIjEE",
@@ -13501,6 +15501,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIjEE",
+   "name" : "android::trait_trivial_dtor<unsigned int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIj"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIlEE",
    "name" : "android::trait_trivial_dtor<long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIlEE",
@@ -13514,6 +15527,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIlEE",
+   "name" : "android::trait_trivial_dtor<long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIl"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorImEE",
    "name" : "android::trait_trivial_dtor<unsigned long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorImEE",
@@ -13527,6 +15553,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorImEE",
+   "name" : "android::trait_trivial_dtor<unsigned long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIm"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIsEE",
    "name" : "android::trait_trivial_dtor<short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIsEE",
@@ -13540,6 +15579,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIsEE",
+   "name" : "android::trait_trivial_dtor<short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIs"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorItEE",
    "name" : "android::trait_trivial_dtor<unsigned short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorItEE",
@@ -13553,6 +15605,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorItEE",
+   "name" : "android::trait_trivial_dtor<unsigned short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIt"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIvEE",
    "name" : "android::trait_trivial_dtor<void>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIvEE",
@@ -13566,6 +15631,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIvEE",
+   "name" : "android::trait_trivial_dtor<void>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIv"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIxEE",
    "name" : "android::trait_trivial_dtor<long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIxEE",
@@ -13579,6 +15657,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIxEE",
+   "name" : "android::trait_trivial_dtor<long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIx"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIyEE",
    "name" : "android::trait_trivial_dtor<unsigned long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_dtorIyEE",
@@ -13592,6 +15683,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_dtorIyEE",
+   "name" : "android::trait_trivial_dtor<unsigned long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_dtorIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_dtorIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIy"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveINS_28sysprop_change_callback_infoEEE",
    "name" : "android::trait_trivial_move<android::sysprop_change_callback_info>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveINS_28sysprop_change_callback_infoEEE",
@@ -13644,12 +15748,25 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveINS_7String8EEE",
+   "name" : "android::trait_trivial_move<android::String8>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveINS_7String8EEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveINS_7String8EEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h",
+   "template_args" :
+   [
+    "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveINS_8String16EEE",
    "name" : "android::trait_trivial_move<android::String16>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveINS_8String16EEE",
    "self_type" : "_ZTIN7android18trait_trivial_moveINS_8String16EEE",
    "size" : 1,
-   "source_file" : "system/core/libutils/include/utils/String16.h",
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h",
    "template_args" :
    [
     "_ZTIN7android8String16E"
@@ -13670,6 +15787,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIbEE",
+   "name" : "android::trait_trivial_move<bool>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIbEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIb"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIcEE",
    "name" : "android::trait_trivial_move<char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIcEE",
@@ -13683,6 +15813,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIcEE",
+   "name" : "android::trait_trivial_move<char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIcEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIc"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIdEE",
    "name" : "android::trait_trivial_move<double>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIdEE",
@@ -13696,6 +15839,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIdEE",
+   "name" : "android::trait_trivial_move<double>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIdEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTId"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIfEE",
    "name" : "android::trait_trivial_move<float>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIfEE",
@@ -13709,6 +15865,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIfEE",
+   "name" : "android::trait_trivial_move<float>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIfEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIf"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIhEE",
    "name" : "android::trait_trivial_move<unsigned char>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIhEE",
@@ -13722,6 +15891,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIhEE",
+   "name" : "android::trait_trivial_move<unsigned char>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIhEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIh"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIiEE",
    "name" : "android::trait_trivial_move<int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIiEE",
@@ -13735,6 +15917,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIiEE",
+   "name" : "android::trait_trivial_move<int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIiEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIi"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIjEE",
    "name" : "android::trait_trivial_move<unsigned int>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIjEE",
@@ -13748,6 +15943,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIjEE",
+   "name" : "android::trait_trivial_move<unsigned int>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIjEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIj"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIlEE",
    "name" : "android::trait_trivial_move<long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIlEE",
@@ -13761,6 +15969,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIlEE",
+   "name" : "android::trait_trivial_move<long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIlEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIl"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveImEE",
    "name" : "android::trait_trivial_move<unsigned long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveImEE",
@@ -13774,6 +15995,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveImEE",
+   "name" : "android::trait_trivial_move<unsigned long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveImEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIm"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIsEE",
    "name" : "android::trait_trivial_move<short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIsEE",
@@ -13787,6 +16021,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIsEE",
+   "name" : "android::trait_trivial_move<short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIsEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIs"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveItEE",
    "name" : "android::trait_trivial_move<unsigned short>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveItEE",
@@ -13800,6 +16047,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveItEE",
+   "name" : "android::trait_trivial_move<unsigned short>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveItEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIt"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIvEE",
    "name" : "android::trait_trivial_move<void>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIvEE",
@@ -13813,6 +16073,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIvEE",
+   "name" : "android::trait_trivial_move<void>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIvEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIv"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIxEE",
    "name" : "android::trait_trivial_move<long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIxEE",
@@ -13826,6 +16099,19 @@
   },
   {
    "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIxEE",
+   "name" : "android::trait_trivial_move<long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIxEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIx"
+   ]
+  },
+  {
+   "alignment" : 1,
    "linker_set_key" : "_ZTIN7android18trait_trivial_moveIyEE",
    "name" : "android::trait_trivial_move<unsigned long long>",
    "referenced_type" : "_ZTIN7android18trait_trivial_moveIyEE",
@@ -13838,6 +16124,19 @@
    ]
   },
   {
+   "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android18trait_trivial_moveIyEE",
+   "name" : "android::trait_trivial_move<unsigned long long>",
+   "referenced_type" : "_ZTIN7android18trait_trivial_moveIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android18trait_trivial_moveIyEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/TypeHelpers.h",
+   "template_args" :
+   [
+    "_ZTIy"
+   ]
+  },
+  {
    "alignment" : 4,
    "base_specifiers" :
    [
@@ -13876,6 +16175,40 @@
    "base_specifiers" :
    [
     {
+     "referenced_type" : "_ZTIN7android12LightRefBaseINS_19VirtualLightRefBaseEEE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android19VirtualLightRefBaseE",
+   "name" : "android::VirtualLightRefBase",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android19VirtualLightRefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android19VirtualLightRefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/LightRefBase.h",
+   "vtable_components" :
+   [
+    {
+     "kind" : "offset_to_top"
+    },
+    {
+     "kind" : "rtti",
+     "mangled_component_name" : "_ZTIN7android19VirtualLightRefBaseE"
+    },
+    {
+     "kind" : "complete_dtor_pointer",
+     "mangled_component_name" : "_ZN7android19VirtualLightRefBaseD1Ev"
+    },
+    {
+     "kind" : "deleting_dtor_pointer",
+     "mangled_component_name" : "_ZN7android19VirtualLightRefBaseD0Ev"
+    }
+   ]
+  },
+  {
+   "alignment" : 4,
+   "base_specifiers" :
+   [
+    {
      "referenced_type" : "_ZTIN7android14LooperCallbackE"
     }
    ],
@@ -14845,7 +17178,7 @@
    [
     {
      "access" : "private",
-     "referenced_type" : "_ZTIN7android10VectorImplE"
+     "referenced_type" : "_ZTIN7android10VectorImplE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
     }
    ],
    "linker_set_key" : "_ZTIN7android6VectorINS_7String8EEE",
@@ -14854,10 +17187,10 @@
    "referenced_type" : "_ZTIN7android6VectorINS_7String8EEE",
    "self_type" : "_ZTIN7android6VectorINS_7String8EEE",
    "size" : 20,
-   "source_file" : "system/core/libutils/include/utils/Vector.h",
+   "source_file" : "system/core/libutils/binder/include/utils/Vector.h",
    "template_args" :
    [
-    "_ZTIN7android7String8E"
+    "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump"
    ],
    "vtable_components" :
    [
@@ -15045,6 +17378,16 @@
    "source_file" : "system/core/libutils/include/utils/RefBase.h"
   },
   {
+   "alignment" : 1,
+   "linker_set_key" : "_ZTIN7android7RefBase12weakref_typeE",
+   "name" : "android::RefBase::weakref_type",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android7RefBase12weakref_typeE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 1,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h"
+  },
+  {
    "alignment" : 4,
    "fields" :
    [
@@ -15099,6 +17442,55 @@
    [
     {
      "access" : "private",
+     "field_name" : "mRefs",
+     "field_offset" : 32,
+     "referenced_type" : "_ZTIKPN7android7RefBase12weakref_implE"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android7RefBaseE",
+   "name" : "android::RefBase",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android7RefBaseE#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 8,
+   "source_file" : "system/core/libutils/binder/include/utils/RefBase.h",
+   "vtable_components" :
+   [
+    {
+     "kind" : "offset_to_top"
+    },
+    {
+     "kind" : "rtti",
+     "mangled_component_name" : "_ZTIN7android7RefBaseE"
+    },
+    {
+     "kind" : "complete_dtor_pointer",
+     "mangled_component_name" : "_ZN7android7RefBaseD1Ev"
+    },
+    {
+     "kind" : "deleting_dtor_pointer",
+     "mangled_component_name" : "_ZN7android7RefBaseD0Ev"
+    },
+    {
+     "mangled_component_name" : "_ZN7android7RefBase10onFirstRefEv"
+    },
+    {
+     "mangled_component_name" : "_ZN7android7RefBase15onLastStrongRefEPKv"
+    },
+    {
+     "mangled_component_name" : "_ZN7android7RefBase20onIncStrongAttemptedEjPKv"
+    },
+    {
+     "mangled_component_name" : "_ZN7android7RefBase13onLastWeakRefEPKv"
+    }
+   ]
+  },
+  {
+   "alignment" : 4,
+   "fields" :
+   [
+    {
+     "access" : "private",
      "field_name" : "mString",
      "referenced_type" : "_ZTIPKc"
     }
@@ -15116,6 +17508,24 @@
    "fields" :
    [
     {
+     "access" : "private",
+     "field_name" : "mString",
+     "referenced_type" : "_ZTIPKc"
+    }
+   ],
+   "linker_set_key" : "_ZTIN7android7String8E",
+   "name" : "android::String8",
+   "record_kind" : "class",
+   "referenced_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "self_type" : "_ZTIN7android7String8E#ODR:out/soong/.intermediates/system/core/libutils/binder/libutils_binder/android_vendor.VanillaIceCream_arm_armv8-a_static_afdo-libutils/e560d7b19ebf7276b3e850d3d346dec8/obj/system/core/libutils/binder/RefBase.sdump",
+   "size" : 4,
+   "source_file" : "system/core/libutils/binder/include/utils/String8.h"
+  },
+  {
+   "alignment" : 4,
+   "fields" :
+   [
+    {
      "field_name" : "size",
      "referenced_type" : "_ZTIKj"
     },
@@ -15130,7 +17540,7 @@
    "referenced_type" : "_ZTIN7android8String1610StaticDataILj1EEE",
    "self_type" : "_ZTIN7android8String1610StaticDataILj1EEE",
    "size" : 8,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -15148,34 +17558,7 @@
    "referenced_type" : "_ZTIN7android8String16E",
    "self_type" : "_ZTIN7android8String16E",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
-  },
-  {
-   "alignment" : 1,
-   "linker_set_key" : "_ZTIN7android9CallStack12StackDeleterE",
-   "name" : "android::CallStack::StackDeleter",
-   "referenced_type" : "_ZTIN7android9CallStack12StackDeleterE",
-   "self_type" : "_ZTIN7android9CallStack12StackDeleterE",
-   "size" : 1,
-   "source_file" : "system/core/libutils/include/utils/CallStack.h"
-  },
-  {
-   "alignment" : 4,
-   "fields" :
-   [
-    {
-     "access" : "private",
-     "field_name" : "mFrameLines",
-     "referenced_type" : "_ZTIN7android6VectorINS_7String8EEE"
-    }
-   ],
-   "linker_set_key" : "_ZTIN7android9CallStackE",
-   "name" : "android::CallStack",
-   "record_kind" : "class",
-   "referenced_type" : "_ZTIN7android9CallStackE",
-   "self_type" : "_ZTIN7android9CallStackE",
-   "size" : 20,
-   "source_file" : "system/core/libutils/include/utils/CallStack.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   },
   {
    "alignment" : 4,
@@ -15441,7 +17824,7 @@
    "referenced_type" : "_ZTIN7android8String16E",
    "self_type" : "_ZTION7android8String16E",
    "size" : 4,
-   "source_file" : "system/core/libutils/include/utils/String16.h"
+   "source_file" : "system/core/libutils/binder/include/utils/String16.h"
   }
  ]
 }
diff --git a/libutils/binder/Android.bp b/libutils/binder/Android.bp
index a049f3d..60b0cb6 100644
--- a/libutils/binder/Android.bp
+++ b/libutils/binder/Android.bp
@@ -3,9 +3,9 @@
 }
 
 cc_defaults {
-    name: "libutils_binder_impl_defaults",
+    name: "libutils_binder_impl_defaults_nodeps",
     defaults: [
-        "libutils_defaults",
+        "libutils_defaults_nodeps",
         "apex-lowest-min-sdk-version",
     ],
     native_bridge_supported: true,
@@ -30,11 +30,33 @@
     afdo: true,
 }
 
+cc_defaults {
+    name: "libutils_binder_impl_defaults",
+    defaults: [
+        "libutils_defaults",
+        "libutils_binder_impl_defaults_nodeps",
+    ],
+}
+
 cc_library {
     name: "libutils_binder",
     defaults: ["libutils_binder_impl_defaults"],
 }
 
+cc_library_shared {
+    name: "libutils_binder_sdk",
+    defaults: ["libutils_binder_impl_defaults_nodeps"],
+
+    header_libs: [
+        "liblog_stub",
+    ],
+
+    cflags: [
+        "-DANDROID_LOG_STUB_WEAK_PRINT",
+        "-DANDROID_UTILS_CALLSTACK_ENABLED=0",
+    ],
+}
+
 cc_library {
     name: "libutils_binder_test_compile",
     defaults: ["libutils_binder_impl_defaults"],
diff --git a/libutils/binder/RefBase_test.cpp b/libutils/binder/RefBase_test.cpp
index d675598..65d40a2 100644
--- a/libutils/binder/RefBase_test.cpp
+++ b/libutils/binder/RefBase_test.cpp
@@ -300,8 +300,8 @@
     std::atomic<int>* mDeleteCount;
 };
 
-static sp<Bar> buffer;
-static std::atomic<bool> bufferFull(false);
+[[clang::no_destroy]] static constinit sp<Bar> buffer;
+static constinit std::atomic<bool> bufferFull(false);
 
 // Wait until bufferFull has value val.
 static inline void waitFor(bool val) {
@@ -380,8 +380,8 @@
     }  // Otherwise this is slow and probably pointless on a uniprocessor.
 }
 
-static wp<Bar> wpBuffer;
-static std::atomic<bool> wpBufferFull(false);
+[[clang::no_destroy]] static constinit wp<Bar> wpBuffer;
+static constinit std::atomic<bool> wpBufferFull(false);
 
 // Wait until wpBufferFull has value val.
 static inline void wpWaitFor(bool val) {
diff --git a/libutils/binder/SharedBuffer_test.cpp b/libutils/binder/SharedBuffer_test.cpp
index 1d6317f..26702b0 100644
--- a/libutils/binder/SharedBuffer_test.cpp
+++ b/libutils/binder/SharedBuffer_test.cpp
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-#define __STDC_LIMIT_MACROS
-
 #include <gtest/gtest.h>
 
 #include <memory>
diff --git a/libutils/binder/String8.cpp b/libutils/binder/String8.cpp
index 749bfcb..1de9e8b 100644
--- a/libutils/binder/String8.cpp
+++ b/libutils/binder/String8.cpp
@@ -14,15 +14,13 @@
  * limitations under the License.
  */
 
-#define __STDC_LIMIT_MACROS
-#include <stdint.h>
-
 #include <utils/String8.h>
 
 #include <log/log.h>
 #include <utils/String16.h>
 
 #include <ctype.h>
+#include <stdint.h>
 
 #include <limits>
 #include <string>
diff --git a/libutils/binder/StrongPointer_test.cpp b/libutils/binder/StrongPointer_test.cpp
index f27c1f1..aa993c3 100644
--- a/libutils/binder/StrongPointer_test.cpp
+++ b/libutils/binder/StrongPointer_test.cpp
@@ -106,3 +106,17 @@
     EXPECT_DEATH(sp<TypeParam>::fromExisting(foo), "");
     delete foo;
 }
+
+TYPED_TEST(StrongPointer, release) {
+    bool isDeleted = false;
+    TypeParam* foo = nullptr;
+    {
+        sp<TypeParam> sp1 = sp<TypeParam>::make(&isDeleted);
+        ASSERT_EQ(1, sp1->getStrongCount());
+        foo = sp1.release();
+    }
+    ASSERT_FALSE(isDeleted) << "release failed, deleted anyway when sp left scope";
+    ASSERT_EQ(1, foo->getStrongCount()) << "release mismanaged refcount";
+    foo->decStrong(nullptr);
+    ASSERT_TRUE(isDeleted) << "foo was leaked!";
+}
diff --git a/libutils/binder/Vector_test.cpp b/libutils/binder/Vector_test.cpp
index 6d90eaa..312dcf6 100644
--- a/libutils/binder/Vector_test.cpp
+++ b/libutils/binder/Vector_test.cpp
@@ -16,7 +16,6 @@
 
 #define LOG_TAG "Vector_test"
 
-#define __STDC_LIMIT_MACROS
 #include <stdint.h>
 #include <unistd.h>
 
diff --git a/libutils/binder/include/utils/RefBase.h b/libutils/binder/include/utils/RefBase.h
index 5e3fa7d..f03e1be 100644
--- a/libutils/binder/include/utils/RefBase.h
+++ b/libutils/binder/include/utils/RefBase.h
@@ -404,7 +404,7 @@
 public:
     typedef typename RefBase::weakref_type weakref_type;
 
-    inline wp() : m_ptr(nullptr), m_refs(nullptr) { }
+    inline constexpr wp() : m_ptr(nullptr), m_refs(nullptr) { }
 
     // if nullptr, returns nullptr
     //
diff --git a/libutils/binder/include/utils/StrongPointer.h b/libutils/binder/include/utils/StrongPointer.h
index 54aa691..fb9b8e8 100644
--- a/libutils/binder/include/utils/StrongPointer.h
+++ b/libutils/binder/include/utils/StrongPointer.h
@@ -30,7 +30,7 @@
 template<typename T>
 class sp {
 public:
-    inline sp() : m_ptr(nullptr) { }
+    inline constexpr sp() : m_ptr(nullptr) { }
 
     // The old way of using sp<> was like this. This is bad because it relies
     // on implicit conversion to sp<>, which we would like to remove (if an
@@ -98,6 +98,15 @@
 
     void clear();
 
+    // Releases the ownership of the object managed by this instance of sp, if any.
+    // The caller is now responsible for managing it. That is, the caller must ensure
+    // decStrong() is called when the pointer is no longer used.
+    [[nodiscard]] inline T* release() noexcept {
+        auto ret = m_ptr;
+        m_ptr = nullptr;
+        return ret;
+    }
+
     // Accessors
 
     inline T&       operator* () const     { return *m_ptr; }
diff --git a/libutils/include/utils/CallStack.h b/libutils/include/utils/CallStack.h
index fe4d4f5..0239b68 100644
--- a/libutils/include/utils/CallStack.h
+++ b/libutils/include/utils/CallStack.h
@@ -14,8 +14,7 @@
  * limitations under the License.
  */
 
-#ifndef ANDROID_CALLSTACK_H
-#define ANDROID_CALLSTACK_H
+#pragma once
 
 #include <memory>
 
@@ -27,17 +26,19 @@
 #include <sys/types.h>
 
 #if !defined(__APPLE__) && !defined(_WIN32)
-# define WEAKS_AVAILABLE 1
+# define CALLSTACK_WEAKS_AVAILABLE 1
 #endif
 #ifndef CALLSTACK_WEAK
-# ifdef WEAKS_AVAILABLE
+# ifdef CALLSTACK_WEAKS_AVAILABLE
 #   define CALLSTACK_WEAK __attribute__((weak))
-# else // !WEAKS_AVAILABLE
+# else // !CALLSTACK_WEAKS_AVAILABLE
 #   define CALLSTACK_WEAK
-# endif // !WEAKS_AVAILABLE
+# endif // !CALLSTACK_WEAKS_AVAILABLE
 #endif // CALLSTACK_WEAK predefined
 
-#define ALWAYS_INLINE __attribute__((always_inline))
+#ifndef CALLSTACK_ALWAYS_INLINE
+#define CALLSTACK_ALWAYS_INLINE __attribute__((always_inline))
+#endif  // CALLSTACK_ALWAYS_INLINE predefined
 
 namespace android {
 
@@ -89,7 +90,7 @@
     //
     // DO NOT USE THESE. They will disappear.
     struct StackDeleter {
-#ifdef WEAKS_AVAILABLE
+#ifdef CALLSTACK_WEAKS_AVAILABLE
         void operator()(CallStack* stack) {
             deleteStack(stack);
         }
@@ -101,8 +102,8 @@
     typedef std::unique_ptr<CallStack, StackDeleter> CallStackUPtr;
 
     // Return current call stack if possible, nullptr otherwise.
-#ifdef WEAKS_AVAILABLE
-    static CallStackUPtr ALWAYS_INLINE getCurrent(int32_t ignoreDepth = 1) {
+#ifdef CALLSTACK_WEAKS_AVAILABLE
+    static CallStackUPtr CALLSTACK_ALWAYS_INLINE getCurrent(int32_t ignoreDepth = 1) {
         if (reinterpret_cast<uintptr_t>(getCurrentInternal) == 0) {
             ALOGW("CallStack::getCurrentInternal not linked, returning null");
             return CallStackUPtr(nullptr);
@@ -110,15 +111,16 @@
             return getCurrentInternal(ignoreDepth);
         }
     }
-#else // !WEAKS_AVAILABLE
-    static CallStackUPtr ALWAYS_INLINE getCurrent(int32_t = 1) {
+#else // !CALLSTACK_WEAKS_AVAILABLE
+    static CallStackUPtr CALLSTACK_ALWAYS_INLINE getCurrent(int32_t = 1) {
         return CallStackUPtr(nullptr);
     }
-#endif // !WEAKS_AVAILABLE
+#endif // !CALLSTACK_WEAKS_AVAILABLE
 
-#ifdef WEAKS_AVAILABLE
-    static void ALWAYS_INLINE logStack(const char* logtag, CallStack* stack = getCurrent().get(),
-                                       android_LogPriority priority = ANDROID_LOG_DEBUG) {
+#ifdef CALLSTACK_WEAKS_AVAILABLE
+    static void CALLSTACK_ALWAYS_INLINE logStack(const char* logtag,
+                                                 CallStack* stack = getCurrent().get(),
+                                                 android_LogPriority priority = ANDROID_LOG_DEBUG) {
         if (reinterpret_cast<uintptr_t>(logStackInternal) != 0 && stack != nullptr) {
             logStackInternal(logtag, stack, priority);
         } else {
@@ -127,30 +129,31 @@
     }
 
 #else
-    static void ALWAYS_INLINE logStack(const char* logtag, CallStack* = getCurrent().get(),
-                                       android_LogPriority = ANDROID_LOG_DEBUG) {
+    static void CALLSTACK_ALWAYS_INLINE logStack(const char* logtag,
+                                                 CallStack* = getCurrent().get(),
+                                                 android_LogPriority = ANDROID_LOG_DEBUG) {
         ALOG(LOG_WARN, logtag, "CallStack::logStackInternal not linked");
     }
-#endif // !WEAKS_AVAILABLE
+#endif // !CALLSTACK_WEAKS_AVAILABLE
 
-#ifdef WEAKS_AVAILABLE
-    static String8 ALWAYS_INLINE stackToString(const char* prefix = nullptr,
-                                               const CallStack* stack = getCurrent().get()) {
+#ifdef CALLSTACK_WEAKS_AVAILABLE
+    static String8 CALLSTACK_ALWAYS_INLINE
+    stackToString(const char* prefix = nullptr, const CallStack* stack = getCurrent().get()) {
         if (reinterpret_cast<uintptr_t>(stackToStringInternal) != 0 && stack != nullptr) {
             return stackToStringInternal(prefix, stack);
         } else {
             return String8::format("%s<CallStack package not linked>", (prefix ? prefix : ""));
         }
     }
-#else // !WEAKS_AVAILABLE
-    static String8 ALWAYS_INLINE stackToString(const char* prefix = nullptr,
-                                               const CallStack* = getCurrent().get()) {
+#else // !CALLSTACK_WEAKS_AVAILABLE
+    static String8 CALLSTACK_ALWAYS_INLINE stackToString(const char* prefix = nullptr,
+                                                         const CallStack* = getCurrent().get()) {
         return String8::format("%s<CallStack package not linked>", (prefix ? prefix : ""));
     }
-#endif // !WEAKS_AVAILABLE
+#endif // !CALLSTACK_WEAKS_AVAILABLE
 
   private:
-#ifdef WEAKS_AVAILABLE
+#ifdef CALLSTACK_WEAKS_AVAILABLE
     static CallStackUPtr CALLSTACK_WEAK getCurrentInternal(int32_t ignoreDepth);
     static void CALLSTACK_WEAK logStackInternal(const char* logtag, const CallStack* stack,
                                                 android_LogPriority priority);
@@ -158,11 +161,13 @@
     // The deleter is only invoked on non-null pointers. Hence it will never be
     // invoked if CallStack is not linked.
     static void CALLSTACK_WEAK deleteStack(CallStack* stack);
-#endif // WEAKS_AVAILABLE
+#endif // CALLSTACK_WEAKS_AVAILABLE
 
     Vector<String8> mFrameLines;
 };
 
 }  // namespace android
 
-#endif // ANDROID_CALLSTACK_H
+#undef CALLSTACK_WEAKS_AVAILABLE
+#undef CALLSTACK_WEAK
+#undef CALLSTACK_ALWAYS_INLINE
diff --git a/libutils/include/utils/Looper.h b/libutils/include/utils/Looper.h
index b387d68..41c5536 100644
--- a/libutils/include/utils/Looper.h
+++ b/libutils/include/utils/Looper.h
@@ -345,6 +345,18 @@
     int removeFd(int fd);
 
     /**
+     * Tell the kernel to check for the same events we're already checking for
+     * with this FD. This is to be used when there is a kernel driver bug where
+     * the kernel does not properly mark itself as having new data available, in
+     * order to force "fd_op->poll()" to be called. You probably don't want to
+     * use this in general, and you shouldn't use it unless there is a plan to
+     * fix the kernel. See also b/296817256.
+     *
+     * Returns 1 if successfully repolled, 0 if not.
+     */
+    int repoll(int fd);
+
+    /**
      * Enqueues a message to be processed by the specified handler.
      *
      * The handler must not be null.
diff --git a/libvendorsupport/Android.bp b/libvendorsupport/Android.bp
new file mode 100644
index 0000000..e87959e
--- /dev/null
+++ b/libvendorsupport/Android.bp
@@ -0,0 +1,65 @@
+// Copyright (C) 2024 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.
+
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+cc_library {
+    name: "libvendorsupport",
+    native_bridge_supported: true,
+    recovery_available: true,
+    llndk: {
+        symbol_file: "libvendorsupport.map.txt",
+    },
+    srcs: ["version_props.c"],
+    cflags: [
+        "-Wall",
+        "-Werror",
+    ],
+    local_include_dirs: ["include/vendorsupport"],
+    export_include_dirs: ["include"],
+    shared_libs: [
+        "liblog",
+    ],
+}
+
+cc_library_headers {
+    name: "libvendorsupport_llndk_headers",
+    host_supported: true,
+    vendor_available: true,
+    recovery_available: true,
+    ramdisk_available: true,
+    vendor_ramdisk_available: true,
+    native_bridge_supported: true,
+
+    export_include_dirs: ["include_llndk"],
+    llndk: {
+        llndk_headers: true,
+    },
+
+    apex_available: [
+        "//apex_available:platform",
+        "//apex_available:anyapex",
+    ],
+    min_sdk_version: "apex_inherit",
+
+    system_shared_libs: [],
+    stl: "none",
+
+    // This header library is used for libc and must be available to any sdk
+    // versions.
+    // Setting sdk_version to the lowest version allows the dependencies.
+    sdk_version: "1",
+}
diff --git a/libvendorsupport/OWNERS b/libvendorsupport/OWNERS
new file mode 100644
index 0000000..2ab18eb
--- /dev/null
+++ b/libvendorsupport/OWNERS
@@ -0,0 +1,2 @@
+jiyong@google.com
+justinyun@google.com
diff --git a/libvendorsupport/TEST_MAPPING b/libvendorsupport/TEST_MAPPING
new file mode 100644
index 0000000..5bd09ba
--- /dev/null
+++ b/libvendorsupport/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "postsubmit": [
+    {
+      "name": "libvendorsupport-tests"
+    }
+  ]
+}
diff --git a/libvendorsupport/include/vendorsupport/api_level.h b/libvendorsupport/include/vendorsupport/api_level.h
new file mode 100644
index 0000000..d365075
--- /dev/null
+++ b/libvendorsupport/include/vendorsupport/api_level.h
@@ -0,0 +1,47 @@
+// Copyright (C) 2024 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.
+
+#pragma once
+
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+
+#define __ANDROID_VENDOR_API_MAX__ 1000000
+#define __INVALID_API_LEVEL -1
+
+/**
+ * @brief Find corresponding vendor API level from an SDK API version.
+ *
+ * @details
+ * SDK API versions and vendor API levels are not compatible and not
+ * exchangeable. However, this function can be used to compare the two versions
+ * to know which one is newer than the other.
+ *
+ * @param sdkApiLevel The SDK version int. This must be less than 10000.
+ * @return The corresponding vendor API level of the SDK version. -1 if the SDK
+ * version is invalid or 10000.
+ */
+int AVendorSupport_getVendorApiLevelOf(int sdkApiLevel);
+
+/**
+ * @brief Find corresponding SDK API version from a vendor API level.
+ *
+ * @param vendorApiLevel The vendor API level int.
+ * @return The corresponding SDK API version of the vendor API level. -1 if the
+ * vendor API level is invalid.
+ */
+int AVendorSupport_getSdkApiLevelOf(int vendorApiLevel);
+
+__END_DECLS
diff --git a/libvendorsupport/include_llndk/android/llndk-versioning.h b/libvendorsupport/include_llndk/android/llndk-versioning.h
new file mode 100644
index 0000000..58cd18d
--- /dev/null
+++ b/libvendorsupport/include_llndk/android/llndk-versioning.h
@@ -0,0 +1,56 @@
+// Copyright (C) 2024 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.
+
+#pragma once
+
+/* As a vendor default header included in all vendor modules, this header MUST NOT include other
+ * header files or any declarations. Only macros are allowed.
+ */
+#if defined(__ANDROID_VENDOR__)
+
+// LLNDK (https://source.android.com/docs/core/architecture/vndk/build-system#ll-ndk) is similar to
+// NDK, but uses its own versioning of YYYYMM format for vendor builds. The LLNDK symbols are
+// enabled when the vendor api level is equal to or newer than the ro.board.api_level.
+#define __INTRODUCED_IN_LLNDK(vendor_api_level)                                             \
+    _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wgcc-compat\"")   \
+            __attribute__((enable_if(                                                       \
+                    __ANDROID_VENDOR_API__ >= vendor_api_level,                             \
+                    "available in vendor API level " #vendor_api_level " that "             \
+                    "is newer than the current vendor API level. Guard the API "            \
+                    "call with '#if (__ANDROID_VENDOR_API__ >= " #vendor_api_level ")'."))) \
+            _Pragma("clang diagnostic pop")
+
+// Use this macro as an `if` statement to call an API that are available to both NDK and LLNDK.
+// This returns true for the vendor modules if the vendor_api_level is less than or equal to the
+// ro.board.api_level.
+#define API_LEVEL_AT_LEAST(sdk_api_level, vendor_api_level) \
+    constexpr(__ANDROID_VENDOR_API__ >= vendor_api_level)
+
+#else  // __ANDROID_VENDOR__
+
+// __INTRODUCED_IN_LLNDK is for LLNDK only but not for NDK. Ignore this for non-vendor modules.
+// It leaves a no-op annotation for ABI analysis.
+#if !defined(__INTRODUCED_IN_LLNDK)
+#define __INTRODUCED_IN_LLNDK(vendor_api_level) \
+    __attribute__((annotate("introduced_in_llndk=" #vendor_api_level)))
+#endif
+
+// For non-vendor modules, API_LEVEL_AT_LEAST is replaced with __builtin_available(sdk_api_level) to
+// guard the API for __INTRODUCED_IN.
+#if !defined(API_LEVEL_AT_LEAST)
+#define API_LEVEL_AT_LEAST(sdk_api_level, vendor_api_level) \
+    (__builtin_available(android sdk_api_level, *))
+#endif
+
+#endif  // __ANDROID_VENDOR__
diff --git a/libvendorsupport/libvendorsupport.map.txt b/libvendorsupport/libvendorsupport.map.txt
new file mode 100644
index 0000000..d99c834
--- /dev/null
+++ b/libvendorsupport/libvendorsupport.map.txt
@@ -0,0 +1,7 @@
+LIBVENDORSUPPORT {
+  global:
+    AVendorSupport_getVendorApiLevelOf; # llndk systemapi
+    AVendorSupport_getSdkApiLevelOf; # llndk systemapi
+  local:
+    *;
+};
diff --git a/libvendorsupport/tests/Android.bp b/libvendorsupport/tests/Android.bp
new file mode 100644
index 0000000..42e3371
--- /dev/null
+++ b/libvendorsupport/tests/Android.bp
@@ -0,0 +1,33 @@
+// Copyright (C) 2024 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.
+
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+cc_test {
+    name: "libvendorsupport-tests",
+    srcs: [
+        "version_props_test.cpp",
+    ],
+    cflags: [
+        "-Wall",
+        "-Werror",
+    ],
+    shared_libs: [
+        "libvendorsupport",
+    ],
+    test_suites: ["general-tests"],
+}
+
diff --git a/libvendorsupport/tests/version_props_test.cpp b/libvendorsupport/tests/version_props_test.cpp
new file mode 100644
index 0000000..ad54c88
--- /dev/null
+++ b/libvendorsupport/tests/version_props_test.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+#include <gtest/gtest.h>
+
+#include <vendorsupport/api_level.h>
+
+using namespace std;
+
+namespace {
+
+TEST(VendorSupport, GetCorrespondingVendorApiLevel) {
+    ASSERT_EQ(__ANDROID_API_U__, AVendorSupport_getVendorApiLevelOf(__ANDROID_API_U__));
+    ASSERT_EQ(202404, AVendorSupport_getVendorApiLevelOf(__ANDROID_API_V__));
+    ASSERT_EQ(__INVALID_API_LEVEL, AVendorSupport_getVendorApiLevelOf(__ANDROID_API_FUTURE__));
+}
+
+TEST(VendorSupport, GetCorrespondingSdkApiLevel) {
+    ASSERT_EQ(__ANDROID_API_U__, AVendorSupport_getSdkApiLevelOf(__ANDROID_API_U__));
+    ASSERT_EQ(__ANDROID_API_V__, AVendorSupport_getSdkApiLevelOf(202404));
+    ASSERT_EQ(__INVALID_API_LEVEL, AVendorSupport_getSdkApiLevelOf(__ANDROID_VENDOR_API_MAX__));
+    ASSERT_EQ(__INVALID_API_LEVEL, AVendorSupport_getSdkApiLevelOf(35));
+}
+
+}  // namespace
\ No newline at end of file
diff --git a/libvendorsupport/version_props.c b/libvendorsupport/version_props.c
new file mode 100644
index 0000000..835828c
--- /dev/null
+++ b/libvendorsupport/version_props.c
@@ -0,0 +1,41 @@
+// Copyright (C) 2024 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.
+
+#include "api_level.h"
+
+#include <log/log.h>
+
+int AVendorSupport_getVendorApiLevelOf(int sdkApiLevel) {
+    if (sdkApiLevel < __ANDROID_API_V__) {
+        return sdkApiLevel;
+    }
+    // In Android V, vendor API level started with version 202404.
+    // The calculation assumes that the SDK api level bumps once a year.
+    if (sdkApiLevel < __ANDROID_API_FUTURE__) {
+        return 202404 + ((sdkApiLevel - __ANDROID_API_V__) * 100);
+    }
+    ALOGE("The SDK version must be less than 10000: %d", sdkApiLevel);
+    return __INVALID_API_LEVEL;
+}
+
+int AVendorSupport_getSdkApiLevelOf(int vendorApiLevel) {
+    if (vendorApiLevel < __ANDROID_API_V__) {
+        return vendorApiLevel;
+    }
+    if (vendorApiLevel >= 202404 && vendorApiLevel < __ANDROID_VENDOR_API_MAX__) {
+        return (vendorApiLevel - 202404) / 100 + __ANDROID_API_V__;
+    }
+    ALOGE("Unexpected vendor api level: %d", vendorApiLevel);
+    return __INVALID_API_LEVEL;
+}
diff --git a/libvndksupport/include/vndksupport/linker.h b/libvndksupport/include/vndksupport/linker.h
index 5f48c39..6845135 100644
--- a/libvndksupport/include/vndksupport/linker.h
+++ b/libvndksupport/include/vndksupport/linker.h
@@ -20,15 +20,8 @@
 extern "C" {
 #endif
 
-/*
- * Returns whether the current process is a vendor process.
- *
- * Note that this is only checking what process is running and has nothing to
- * do with what namespace the caller is loaded at.  For example, a VNDK-SP
- * library loaded by SP-HAL calling this function may still get a 'false',
- * because it is running in a system process.
- */
-int android_is_in_vendor_process();
+int android_is_in_vendor_process() __attribute__((
+        deprecated("This function would not give exact result if VNDK is deprecated.")));
 
 void* android_load_sphal_library(const char* name, int flag);
 
diff --git a/libvndksupport/libvndksupport.map.txt b/libvndksupport/libvndksupport.map.txt
index 1d94b9d..325505d 100644
--- a/libvndksupport/libvndksupport.map.txt
+++ b/libvndksupport/libvndksupport.map.txt
@@ -1,6 +1,6 @@
 LIBVNDKSUPPORT {
   global:
-    android_is_in_vendor_process; # llndk systemapi
+    android_is_in_vendor_process; # llndk-deprecated=35 systemapi
     android_load_sphal_library; # llndk systemapi
     android_unload_sphal_library; # llndk systemapi
   local:
diff --git a/property_service/libpropertyinfoparser/Android.bp b/property_service/libpropertyinfoparser/Android.bp
index 87646f9..b4a16d3 100644
--- a/property_service/libpropertyinfoparser/Android.bp
+++ b/property_service/libpropertyinfoparser/Android.bp
@@ -25,4 +25,8 @@
         },
     },
     export_include_dirs: ["include"],
+    apex_available: [
+        "//apex_available:platform",
+        "com.android.runtime",
+    ],
 }
diff --git a/rootdir/Android.bp b/rootdir/Android.bp
index c8a3cd6..6a3484e 100644
--- a/rootdir/Android.bp
+++ b/rootdir/Android.bp
@@ -71,3 +71,33 @@
     src: "adb_debug.prop",
     debug_ramdisk: true,
 }
+
+prebuilt_etc {
+    name: "init.zygote64.rc",
+    src: "init.zygote64.rc",
+    sub_dir: "init/hw",
+}
+
+prebuilt_etc {
+    name: "init.zygote32.rc",
+    src: "init.zygote32.rc",
+    sub_dir: "init/hw",
+}
+
+prebuilt_etc {
+    name: "init.zygote64_32.rc",
+    src: "init.zygote64_32.rc",
+    sub_dir: "init/hw",
+}
+
+prebuilt_etc {
+    name: "init.usb.rc",
+    src: "init.usb.rc",
+    sub_dir: "init/hw",
+}
+
+prebuilt_etc {
+    name: "init.usb.configfs.rc",
+    src: "init.usb.configfs.rc",
+    sub_dir: "init/hw",
+}
diff --git a/rootdir/Android.mk b/rootdir/Android.mk
index cc6b64a..7444f96 100644
--- a/rootdir/Android.mk
+++ b/rootdir/Android.mk
@@ -72,6 +72,11 @@
   endif
 endif
 
+EXPORT_GLOBAL_SCUDO_ALLOCATION_RING_BUFFER_SIZE :=
+ifneq ($(PRODUCT_SCUDO_ALLOCATION_RING_BUFFER_SIZE),)
+  EXPORT_GLOBAL_SCUDO_ALLOCATION_RING_BUFFER_SIZE := export SCUDO_ALLOCATION_RING_BUFFER_SIZE $(PRODUCT_SCUDO_ALLOCATION_RING_BUFFER_SIZE)
+endif
+
 EXPORT_GLOBAL_GCOV_OPTIONS :=
 ifeq ($(NATIVE_COVERAGE),true)
   EXPORT_GLOBAL_GCOV_OPTIONS := export GCOV_PREFIX /data/misc/trace
@@ -92,7 +97,7 @@
 # create some directories (some are mount points) and symlinks
 LOCAL_POST_INSTALL_CMD := mkdir -p $(addprefix $(TARGET_ROOT_OUT)/, \
     dev proc sys system data data_mirror odm oem acct config storage mnt apex bootstrap-apex debug_ramdisk \
-    linkerconfig second_stage_resources postinstall $(BOARD_ROOT_EXTRA_FOLDERS)); \
+    linkerconfig second_stage_resources postinstall tmp $(BOARD_ROOT_EXTRA_FOLDERS)); \
     ln -sf /system/bin $(TARGET_ROOT_OUT)/bin; \
     ln -sf /system/etc $(TARGET_ROOT_OUT)/etc; \
     ln -sf /data/user_de/0/com.android.shell/files/bugreports $(TARGET_ROOT_OUT)/bugreports; \
@@ -216,6 +221,7 @@
 	$(hide) sed -i -e 's?%EXPORT_GLOBAL_GCOV_OPTIONS%?$(EXPORT_GLOBAL_GCOV_OPTIONS)?g' $@
 	$(hide) sed -i -e 's?%EXPORT_GLOBAL_CLANG_COVERAGE_OPTIONS%?$(EXPORT_GLOBAL_CLANG_COVERAGE_OPTIONS)?g' $@
 	$(hide) sed -i -e 's?%EXPORT_GLOBAL_HWASAN_OPTIONS%?$(EXPORT_GLOBAL_HWASAN_OPTIONS)?g' $@
+	$(hide) sed -i -e 's?%EXPORT_GLOBAL_SCUDO_ALLOCATION_RING_BUFFER_SIZE%?$(EXPORT_GLOBAL_SCUDO_ALLOCATION_RING_BUFFER_SIZE)?g' $@
 
 # Append PLATFORM_VNDK_VERSION to base name.
 define append_vndk_version
diff --git a/rootdir/init.environ.rc.in b/rootdir/init.environ.rc.in
index bf6e986..7ba1f46 100644
--- a/rootdir/init.environ.rc.in
+++ b/rootdir/init.environ.rc.in
@@ -14,3 +14,4 @@
     %EXPORT_GLOBAL_GCOV_OPTIONS%
     %EXPORT_GLOBAL_CLANG_COVERAGE_OPTIONS%
     %EXPORT_GLOBAL_HWASAN_OPTIONS%
+    %EXPORT_GLOBAL_SCUDO_ALLOCATION_RING_BUFFER_SIZE%
diff --git a/rootdir/init.rc b/rootdir/init.rc
index 88618eb..d4cd4b8 100644
--- a/rootdir/init.rc
+++ b/rootdir/init.rc
@@ -92,6 +92,12 @@
     # checker programs.
     mkdir /dev/fscklogs 0770 root system
 
+    # Create tmpfs for use by the shell user.
+    mount tmpfs tmpfs /tmp
+    restorecon /tmp
+    chown shell shell /tmp
+    chmod 0771 /tmp
+
 on init
     sysclktz 0
 
@@ -103,6 +109,9 @@
     symlink /proc/self/fd/1 /dev/stdout
     symlink /proc/self/fd/2 /dev/stderr
 
+    # Create socket dir for ot-daemon
+    mkdir /dev/socket/ot-daemon 0770 thread_network thread_network
+
     # Create energy-aware scheduler tuning nodes
     mkdir /dev/stune/foreground
     mkdir /dev/stune/background
@@ -219,6 +228,28 @@
     write /dev/stune/nnapi-hal/schedtune.boost 1
     write /dev/stune/nnapi-hal/schedtune.prefer_idle 1
 
+    # Create blkio group and apply initial settings.
+    # This feature needs kernel to support it, and the
+    # device's init.rc must actually set the correct values.
+    mkdir /dev/blkio/background
+    chown system system /dev/blkio
+    chown system system /dev/blkio/background
+    chown system system /dev/blkio/tasks
+    chown system system /dev/blkio/background/tasks
+    chown system system /dev/blkio/cgroup.procs
+    chown system system /dev/blkio/background/cgroup.procs
+    chmod 0664 /dev/blkio/tasks
+    chmod 0664 /dev/blkio/background/tasks
+    chmod 0664 /dev/blkio/cgroup.procs
+    chmod 0664 /dev/blkio/background/cgroup.procs
+    write /dev/blkio/blkio.weight 1000
+    write /dev/blkio/background/blkio.weight 200
+    write /dev/blkio/background/blkio.bfq.weight 10
+    write /dev/blkio/blkio.group_idle 0
+    write /dev/blkio/background/blkio.group_idle 0
+    write /dev/blkio/blkio.prio.class promote-to-rt
+    write /dev/blkio/background/blkio.prio.class restrict-to-be
+
     restorecon_recursive /mnt
 
     mount configfs none /config nodev noexec nosuid
@@ -273,6 +304,9 @@
     mkdir /mnt/runtime/full 0755 root root
     mkdir /mnt/runtime/full/self 0755 root root
 
+    # For Pre-reboot Dexopt
+    mkdir /mnt/pre_reboot_dexopt 0755 artd artd
+
     # Symlink to keep legacy apps working in multi-user world
     symlink /storage/self/primary /mnt/sdcard
     symlink /mnt/user/0/primary /mnt/runtime/default/self/primary
@@ -610,6 +644,13 @@
     restorecon_recursive /metadata/apex
 
     mkdir /metadata/staged-install 0770 root system
+
+    mkdir /metadata/aconfig 0775 root system
+    mkdir /metadata/aconfig/flags 0770 root system
+    mkdir /metadata/aconfig/boot 0775 root system
+    exec_start aconfigd-init
+    start aconfigd
+
 on late-fs
     # Ensure that tracefs has the correct permissions.
     # This does not work correctly if it is called in post-fs.
@@ -674,7 +715,7 @@
 
     # Start tombstoned early to be able to store tombstones.
     mkdir /data/anr 0775 system system encryption=Require
-    mkdir /data/tombstones 0771 system system encryption=Require
+    mkdir /data/tombstones 0775 system system encryption=Require
     mkdir /data/vendor/tombstones 0771 root root
     mkdir /data/vendor/tombstones/wifi 0771 wifi wifi
     start tombstoned
@@ -772,11 +813,11 @@
     mkdir /data/misc/apns 0770 system radio
     mkdir /data/misc/emergencynumberdb 0770 system radio
     mkdir /data/misc/network_watchlist 0774 system system
+    mkdir /data/misc/telephonyconfig 0770 system radio
     mkdir /data/misc/textclassifier 0771 system system
     mkdir /data/misc/vpn 0770 system vpn
     mkdir /data/misc/shared_relro 0771 shared_relro shared_relro
     mkdir /data/misc/systemkeys 0700 system system
-    mkdir /data/misc/threadnetwork 0770 thread_network thread_network
     mkdir /data/misc/wifi 0770 wifi wifi
     mkdir /data/misc/wifi/sockets 0770 wifi wifi
     mkdir /data/misc/wifi/wpa_supplicant 0770 wifi wifi
@@ -808,6 +849,7 @@
     mkdir /data/misc/apexdata 0711 root root
     mkdir /data/misc/apexrollback 0700 root root
     mkdir /data/misc/appcompat/ 0700 system system
+    mkdir /data/misc/uprobestats-configs/ 0777 uprobestats uprobestats
     mkdir /data/misc/snapshotctl_log 0755 root root
     # create location to store pre-reboot information
     mkdir /data/misc/prereboot 0700 system system
@@ -1324,3 +1366,16 @@
   write /sys/kernel/mm/lru_gen/enabled 5
 on property:persist.device_config.mglru_native.lru_gen_config=all
   write /sys/kernel/mm/lru_gen/enabled 7
+
+# Allow other processes to run `snapshotctl` through `init`. This requires
+# `set_prop` permission on `snapshotctl_prop`.
+on property:sys.snapshotctl.map=requested
+    # "root" is needed to talk to gsid and pass its check on uid.
+    # "system" is needed to write to "/dev/socket/snapuserd" to talk to
+    # snapuserd.
+    exec - root root system -- /system/bin/snapshotctl map
+    setprop sys.snapshotctl.map "finished"
+
+on property:sys.snapshotctl.unmap=requested
+    exec - root root system -- /system/bin/snapshotctl unmap
+    setprop sys.snapshotctl.unmap "finished"
diff --git a/rootdir/ueventd.rc b/rootdir/ueventd.rc
index 60dcc2a..3927501 100644
--- a/rootdir/ueventd.rc
+++ b/rootdir/ueventd.rc
@@ -71,6 +71,7 @@
 /dev/mtp_usb              0660   root       mtp
 /dev/usb_accessory        0660   root       usb
 /dev/tun                  0660   system     vpn
+/dev/hidraw*              0660   system     system
 
 # CDMA radio interface MUX
 /dev/ppp                  0660   radio      vpn
diff --git a/storaged/Android.bp b/storaged/Android.bp
index fe8c1f3..357c0e6 100644
--- a/storaged/Android.bp
+++ b/storaged/Android.bp
@@ -24,7 +24,7 @@
     shared_libs: [
         "android.hardware.health@1.0",
         "android.hardware.health@2.0",
-        "android.hardware.health-V2-ndk",
+        "android.hardware.health-V3-ndk",
         "libbase",
         "libbinder",
         "libbinder_ndk",
diff --git a/toolbox/Android.bp b/toolbox/Android.bp
index 8594ec4..120cc6e 100644
--- a/toolbox/Android.bp
+++ b/toolbox/Android.bp
@@ -69,6 +69,7 @@
     name: "toolbox",
     defaults: ["toolbox_binary_defaults"],
     recovery_available: true,
+    vendor_ramdisk_available: true,
 }
 
 cc_binary {
diff --git a/toolbox/modprobe.cpp b/toolbox/modprobe.cpp
index 17d4e31..45dd9b8 100644
--- a/toolbox/modprobe.cpp
+++ b/toolbox/modprobe.cpp
@@ -112,6 +112,7 @@
     android::base::SetMinimumLogSeverity(android::base::INFO);
 
     std::vector<std::string> modules;
+    std::string modules_load_file;
     std::string module_parameters;
     std::string mods;
     std::vector<std::string> mod_dirs;
@@ -119,7 +120,7 @@
     bool blocklist = false;
     int rv = EXIT_SUCCESS;
 
-    int opt;
+    int opt, fd;
     int option_index = 0;
     // NB: We have non-standard short options -l and -D to make it easier for
     // OEMs to transition from toybox.
@@ -144,16 +145,19 @@
                 // is supported here by default, ignore flag if no argument.
                 check_mode();
                 if (optarg == NULL) break;
-                if (!android::base::ReadFileToString(optarg, &mods)) {
+
+                // Since libmodprobe doesn't fail when the modules load file
+                // doesn't exist, let's check that here so that we don't
+                // silently fail.
+                fd = open(optarg, O_RDONLY | O_CLOEXEC | O_BINARY);
+                if (fd == -1) {
                     PLOG(ERROR) << "Failed to open " << optarg;
-                    rv = EXIT_FAILURE;
+                    return EXIT_FAILURE;
                 }
-                for (auto mod : android::base::Split(stripComments(mods), "\n")) {
-                    mod = android::base::Trim(mod);
-                    if (mod == "") continue;
-                    if (std::find(modules.begin(), modules.end(), mod) != modules.end()) continue;
-                    modules.emplace_back(mod);
-                }
+                close(fd);
+
+                mod_dirs.emplace_back(android::base::Dirname(optarg));
+                modules_load_file = android::base::Basename(optarg);
                 break;
             case 'b':
                 blocklist = true;
@@ -233,30 +237,39 @@
     LOG(DEBUG) << "mode is " << mode;
     LOG(DEBUG) << "mod_dirs is: " << android::base::Join(mod_dirs, " ");
     LOG(DEBUG) << "modules is: " << android::base::Join(modules, " ");
+    LOG(DEBUG) << "modules load file is: " << modules_load_file;
     LOG(DEBUG) << "module parameters is: " << android::base::Join(module_parameters, " ");
 
     if (modules.empty()) {
         if (mode == ListModulesMode) {
             // emulate toybox modprobe list with no pattern (list all)
             modules.emplace_back("*");
-        } else {
+        } else if (modules_load_file.empty()) {
             LOG(ERROR) << "No modules given.";
             print_usage();
             return EXIT_FAILURE;
         }
     }
-    if (parameter_count && modules.size() > 1) {
+    if (parameter_count && (modules.size() > 1 || !modules_load_file.empty())) {
         LOG(ERROR) << "Only one module may be loaded when specifying module parameters.";
         print_usage();
         return EXIT_FAILURE;
     }
 
-    Modprobe m(mod_dirs, "modules.load", blocklist);
+    Modprobe m(mod_dirs, modules_load_file.empty() ? "modules.load" : modules_load_file, blocklist);
+    if (mode == AddModulesMode && !modules_load_file.empty()) {
+        if (!m.LoadListedModules(false)) {
+            PLOG(ERROR) << "Failed to load all the modules from " << modules_load_file;
+            return EXIT_FAILURE;
+        }
+        /* Fall-through to load modules provided on the command line (if any)*/
+    }
 
     for (const auto& module : modules) {
         switch (mode) {
             case AddModulesMode:
                 if (!m.LoadWithAliases(module, true, module_parameters)) {
+                    if (m.IsBlocklisted(module)) continue;
                     PLOG(ERROR) << "Failed to load module " << module;
                     rv = EXIT_FAILURE;
                 }
diff --git a/trusty/OWNERS b/trusty/OWNERS
index bf16912..4016792 100644
--- a/trusty/OWNERS
+++ b/trusty/OWNERS
@@ -2,7 +2,6 @@
 arve@android.com
 danielangell@google.com
 gmar@google.com
-marcone@google.com
 mikemcternan@google.com
 mmaurer@google.com
 ncbray@google.com
diff --git a/trusty/apploader/apploader.cpp b/trusty/apploader/apploader.cpp
index f782d2a..0915eab 100644
--- a/trusty/apploader/apploader.cpp
+++ b/trusty/apploader/apploader.cpp
@@ -107,7 +107,11 @@
         return {};
     }
 
-    assert(st.st_size >= 0);
+    if (st.st_size == 0) {
+        LOG(ERROR) << "Zero length file '" << file_name << "'";
+        return {};
+    }
+
     file_size = st.st_size;
 
     /* The dmabuf size needs to be a multiple of the page size */
@@ -123,7 +127,8 @@
     BufferAllocator alloc;
     unique_fd dmabuf_fd(alloc.Alloc(kDmabufSystemHeapName, file_page_size));
     if (!dmabuf_fd.ok()) {
-        LOG(ERROR) << "Error creating dmabuf: " << dmabuf_fd.get();
+        LOG(ERROR) << "Error creating dmabuf for " << file_page_size
+                   << " bytes: " << dmabuf_fd.get();
         return dmabuf_fd;
     }
 
diff --git a/trusty/fuzz/Android.bp b/trusty/fuzz/Android.bp
index 5d0ff79..8a93e5e 100644
--- a/trusty/fuzz/Android.bp
+++ b/trusty/fuzz/Android.bp
@@ -41,9 +41,6 @@
         "utils.cpp",
     ],
     export_include_dirs: ["include"],
-    static_libs: [
-        "libFuzzer",
-    ],
     shared_libs: [
         "libtrusty_coverage",
         "libbase",
diff --git a/trusty/fuzz/counters.cpp b/trusty/fuzz/counters.cpp
index 65a3ba6..e730ec3 100644
--- a/trusty/fuzz/counters.cpp
+++ b/trusty/fuzz/counters.cpp
@@ -16,12 +16,12 @@
 
 #define LOG_TAG "trusty-fuzz-counters"
 
-#include <FuzzerDefs.h>
-
 #include <trusty/fuzz/counters.h>
 
 #include <android-base/logging.h>
+#include <assert.h>
 #include <log/log.h>
+#include <string.h>
 #include <trusty/coverage/coverage.h>
 #include <trusty/coverage/tipc.h>
 
@@ -45,9 +45,6 @@
         return;
     }
 
-    assert(fuzzer::ExtraCountersBegin());
-    assert(fuzzer::ExtraCountersEnd());
-
     volatile uint8_t* begin = NULL;
     volatile uint8_t* end = NULL;
     record_->GetRawCounts(&begin, &end);
@@ -66,9 +63,8 @@
     if (!record_->IsOpen()) {
         return;
     }
-
     record_->ResetCounts();
-    fuzzer::ClearExtraCounters();
+    memset_explicit(const_cast<uint8_t*>(counters), 0, sizeof(counters));
 }
 
 void ExtraCounters::Flush() {
diff --git a/trusty/fuzz/tipc_fuzzer.cpp b/trusty/fuzz/tipc_fuzzer.cpp
index edc2a79..f265ced 100644
--- a/trusty/fuzz/tipc_fuzzer.cpp
+++ b/trusty/fuzz/tipc_fuzzer.cpp
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-#include <android-base/result.h>
-#include <fuzzer/FuzzedDataProvider.h>
 #include <stdlib.h>
 #include <trusty/coverage/coverage.h>
 #include <trusty/coverage/uuid.h>
@@ -25,7 +23,6 @@
 #include <iostream>
 #include <memory>
 
-using android::base::Result;
 using android::trusty::coverage::CoverageRecord;
 using android::trusty::fuzz::ExtraCounters;
 using android::trusty::fuzz::TrustyApp;
@@ -44,14 +41,7 @@
 #error "Binary file name must be parameterized using -DTRUSTY_APP_FILENAME."
 #endif
 
-#ifdef TRUSTY_APP_MAX_CONNECTIONS
-constexpr size_t MAX_CONNECTIONS = TRUSTY_APP_MAX_CONNECTIONS;
-#else
-constexpr size_t MAX_CONNECTIONS = 1;
-#endif
-
-static_assert(MAX_CONNECTIONS >= 1);
-
+static TrustyApp kTrustyApp(TIPC_DEV, TRUSTY_APP_PORT);
 static std::unique_ptr<CoverageRecord> record;
 
 extern "C" int LLVMFuzzerInitialize(int* /* argc */, char*** /* argv */) {
@@ -63,8 +53,7 @@
     }
 
     /* Make sure lazy-loaded TAs have started and connected to coverage service. */
-    TrustyApp ta(TIPC_DEV, TRUSTY_APP_PORT);
-    auto ret = ta.Connect();
+    auto ret = kTrustyApp.Connect();
     if (!ret.ok()) {
         std::cerr << ret.error() << std::endl;
         exit(-1);
@@ -84,56 +73,24 @@
     return 0;
 }
 
-Result<void> testOneInput(FuzzedDataProvider& provider) {
-    std::vector<TrustyApp> trustyApps;
-
-    while (provider.remaining_bytes() > 0) {
-        if (trustyApps.size() < MAX_CONNECTIONS && provider.ConsumeBool()) {
-            auto& ta = trustyApps.emplace_back(TIPC_DEV, TRUSTY_APP_PORT);
-            const auto result = ta.Connect();
-            if (!result.ok()) {
-                return result;
-            }
-        } else {
-            const auto i = provider.ConsumeIntegralInRange<size_t>(0, trustyApps.size());
-            std::swap(trustyApps[i], trustyApps.back());
-
-            if (provider.ConsumeBool()) {
-                auto& ta = trustyApps.back();
-
-                const auto data = provider.ConsumeRandomLengthString();
-                auto result = ta.Write(data.data(), data.size());
-                if (!result.ok()) {
-                    return result;
-                }
-
-                std::array<uint8_t, TIPC_MAX_MSG_SIZE> buf;
-                result = ta.Read(buf.data(), buf.size());
-                if (!result.ok()) {
-                    return result;
-                }
-
-                // Reconnect to ensure that the service is still up.
-                ta.Disconnect();
-                result = ta.Connect();
-                if (!result.ok()) {
-                    std::cerr << result.error() << std::endl;
-                    android::trusty::fuzz::Abort();
-                    return result;
-                }
-            } else {
-                trustyApps.pop_back();
-            }
-        }
-    }
-    return {};
-}
-
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+    static uint8_t buf[TIPC_MAX_MSG_SIZE];
+
     ExtraCounters counters(record.get());
     counters.Reset();
 
-    FuzzedDataProvider provider(data, size);
-    const auto result = testOneInput(provider);
-    return result.ok() ? 0 : -1;
+    auto ret = kTrustyApp.Write(data, size);
+    if (ret.ok()) {
+        ret = kTrustyApp.Read(&buf, sizeof(buf));
+    }
+
+    // Reconnect to ensure that the service is still up
+    kTrustyApp.Disconnect();
+    ret = kTrustyApp.Connect();
+    if (!ret.ok()) {
+        std::cerr << ret.error() << std::endl;
+        android::trusty::fuzz::Abort();
+    }
+
+    return ret.ok() ? 0 : -1;
 }
diff --git a/trusty/keymint/src/keymint_hal_main.rs b/trusty/keymint/src/keymint_hal_main.rs
index cfa859f..eda986a 100644
--- a/trusty/keymint/src/keymint_hal_main.rs
+++ b/trusty/keymint/src/keymint_hal_main.rs
@@ -92,8 +92,8 @@
     android_logger::init_once(
         android_logger::Config::default()
             .with_tag("keymint-hal-trusty")
-            .with_min_level(log::Level::Info)
-            .with_log_id(android_logger::LogId::System),
+            .with_max_level(log::LevelFilter::Info)
+            .with_log_buffer(android_logger::LogId::System),
     );
     // Redirect panic messages to logcat.
     panic::set_hook(Box::new(|panic_info| {
diff --git a/trusty/libtrusty/tipc-test/tipc_test.c b/trusty/libtrusty/tipc-test/tipc_test.c
index 0f50787..dabe118 100644
--- a/trusty/libtrusty/tipc-test/tipc_test.c
+++ b/trusty/libtrusty/tipc-test/tipc_test.c
@@ -22,8 +22,10 @@
 #include <unistd.h>
 #include <getopt.h>
 #define __USE_GNU
+#include <inttypes.h>
 #include <sys/mman.h>
 #include <sys/uio.h>
+#include <time.h>
 
 #include <BufferAllocator/BufferAllocatorWrapper.h>
 
@@ -31,8 +33,27 @@
 
 #define TIPC_DEFAULT_DEVNAME "/dev/trusty-ipc-dev0"
 
-static const char *dev_name = NULL;
-static const char *test_name = NULL;
+/* clang-format off */
+#define BENCH_RESULT_TPL                                    \
+"{"                                                         \
+"    \"schema_version\": 3,"                                \
+"    \"suite_name\": \"crypto\","                           \
+"    \"bench_name\": \"%s\","                               \
+"    \"results\": ["                                        \
+"        {"                                                 \
+"            \"metric_name\": \"time_micro_sec\","          \
+"            \"min\": \"%" PRId64 "\","                     \
+"            \"max\": \"%" PRId64 "\","                     \
+"            \"avg\": \"%" PRId64 "\","                     \
+"            \"cold\": \"%" PRId64 "\","                    \
+"            \"raw_min\": %" PRId64 ","                     \
+"            \"raw_max\": %" PRId64 ","                     \
+"            \"raw_avg\": %" PRId64 ","                     \
+"            \"raw_cold\": %" PRId64 ""                     \
+"        },"                                                \
+"    ]"                                                     \
+"}"
+/* clang-format on */
 
 static const char *uuid_name = "com.android.ipc-unittest.srv.uuid";
 static const char *echo_name = "com.android.ipc-unittest.srv.echo";
@@ -46,7 +67,7 @@
 static const char* receiver_name = "com.android.trusty.memref.receiver";
 static const size_t memref_chunk_size = 4096;
 
-static const char* _sopts = "hsvDS:t:r:m:b:";
+static const char* _sopts = "hsvDS:t:r:m:b:B:";
 /* clang-format off */
 static const struct option _lopts[] =  {
     {"help",    no_argument,       0, 'h'},
@@ -57,6 +78,8 @@
     {"repeat",  required_argument, 0, 'r'},
     {"burst",   required_argument, 0, 'b'},
     {"msgsize", required_argument, 0, 'm'},
+    {"test",    required_argument, 0, 't'},
+    {"bench",   required_argument, 0, 'B'},
     {0, 0, 0, 0}
 };
 /* clang-format on */
@@ -74,6 +97,7 @@
         "  -m, --msgsize size    max message size\n"
         "  -v, --variable        variable message size\n"
         "  -s, --silent          silent\n"
+        "  -B, --bench           Run as Benchmark N times\n"
         "\n";
 
 static const char* usage_long =
@@ -96,12 +120,34 @@
         "   send-fd      - transmit dma_buf to trusty, use as shm\n"
         "\n";
 
-static uint opt_repeat  = 1;
-static uint opt_msgsize = 32;
-static uint opt_msgburst = 32;
-static bool opt_variable = false;
-static bool opt_silent = false;
-static char* srv_name = NULL;
+struct tipc_test_params {
+    uint repeat;
+    uint msgsize;
+    uint msgburst;
+    bool variable;
+    bool silent;
+    uint bench;
+    char* srv_name;
+    char* dev_name;
+    char* test_name;
+};
+typedef int (*tipc_test_func_t)(const struct tipc_test_params*);
+
+struct tipc_test_def {
+    char* test_name;
+    tipc_test_func_t func;
+};
+
+static void init_params(struct tipc_test_params* params) {
+    params->repeat = 1;
+    params->msgsize = 32;
+    params->msgburst = 32;
+    params->variable = false;
+    params->silent = false;
+    params->bench = 0;
+    params->srv_name = NULL;
+    params->test_name = NULL;
+}
 
 static void print_usage_and_exit(const char *prog, int code, bool verbose)
 {
@@ -110,8 +156,7 @@
     exit(code);
 }
 
-static void parse_options(int argc, char **argv)
-{
+static void parse_options(int argc, char** argv, struct tipc_test_params* params) {
     int c;
     int oidx = 0;
 
@@ -121,35 +166,39 @@
 
         switch (c) {
             case 'D':
-                dev_name = strdup(optarg);
+                params->dev_name = strdup(optarg);
                 break;
 
             case 'S':
-                srv_name = strdup(optarg);
+                params->srv_name = strdup(optarg);
                 break;
 
             case 't':
-                test_name = strdup(optarg);
+                params->test_name = strdup(optarg);
                 break;
 
             case 'v':
-                opt_variable = true;
+                params->variable = true;
                 break;
 
             case 'r':
-                opt_repeat = atoi(optarg);
+                params->repeat = atoi(optarg);
                 break;
 
             case 'm':
-                opt_msgsize = atoi(optarg);
+                params->msgsize = atoi(optarg);
                 break;
 
             case 'b':
-                opt_msgburst = atoi(optarg);
+                params->msgburst = atoi(optarg);
                 break;
 
             case 's':
-                opt_silent = true;
+                params->silent = true;
+                break;
+
+            case 'B':
+                params->bench = atoi(optarg);
                 break;
 
             case 'h':
@@ -162,32 +211,31 @@
     }
 }
 
-static int connect_test(uint repeat)
-{
+static int connect_test(const struct tipc_test_params* params) {
     uint i;
     int echo_fd;
     int dsink_fd;
     int custom_fd;
 
-    if (!opt_silent) {
-        printf("%s: repeat = %u\n", __func__, repeat);
+    if (!params->silent) {
+        printf("%s: repeat = %u\n", __func__, params->repeat);
     }
 
-    for (i = 0; i < repeat; i++) {
-        if (srv_name) {
-            custom_fd = tipc_connect(dev_name, srv_name);
+    for (i = 0; i < params->repeat; i++) {
+        if (params->srv_name) {
+            custom_fd = tipc_connect(params->dev_name, params->srv_name);
             if (custom_fd < 0) {
-                fprintf(stderr, "Failed to connect to '%s' service\n", srv_name);
+                fprintf(stderr, "Failed to connect to '%s' service\n", params->srv_name);
             }
             if (custom_fd >= 0) {
                 tipc_close(custom_fd);
             }
         } else {
-            echo_fd = tipc_connect(dev_name, echo_name);
+            echo_fd = tipc_connect(params->dev_name, echo_name);
             if (echo_fd < 0) {
                 fprintf(stderr, "Failed to connect to '%s' service\n", "echo");
             }
-            dsink_fd = tipc_connect(dev_name, datasink_name);
+            dsink_fd = tipc_connect(params->dev_name, datasink_name);
             if (dsink_fd < 0) {
                 fprintf(stderr, "Failed to connect to '%s' service\n", "datasink");
             }
@@ -201,79 +249,75 @@
         }
     }
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("%s: done\n", __func__);
     }
 
     return 0;
 }
 
-static int connect_foo(uint repeat)
-{
+static int connect_foo(const struct tipc_test_params* params) {
     uint i;
     int fd;
 
-    if (!opt_silent) {
-        printf("%s: repeat = %u\n", __func__, repeat);
+    if (!params->silent) {
+        printf("%s: repeat = %u\n", __func__, params->repeat);
     }
 
-    for (i = 0; i < repeat; i++) {
-        fd = tipc_connect(dev_name, "foo");
+    for (i = 0; i < params->repeat; i++) {
+        fd = tipc_connect(params->dev_name, "foo");
         if (fd >= 0) {
             fprintf(stderr, "succeeded to connect to '%s' service\n", "foo");
             tipc_close(fd);
         }
     }
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("%s: done\n", __func__);
     }
 
     return 0;
 }
 
-
-static int closer1_test(uint repeat)
-{
+static int closer1_test(const struct tipc_test_params* params) {
     uint i;
     int fd;
 
-    if (!opt_silent) {
-        printf("%s: repeat = %u\n", __func__, repeat);
+    if (!params->silent) {
+        printf("%s: repeat = %u\n", __func__, params->repeat);
     }
 
-    for (i = 0; i < repeat; i++) {
-        fd = tipc_connect(dev_name, closer1_name);
+    for (i = 0; i < params->repeat; i++) {
+        fd = tipc_connect(params->dev_name, closer1_name);
         if (fd < 0) {
             fprintf(stderr, "Failed to connect to '%s' service\n", "closer1");
             continue;
         }
-        if (!opt_silent) {
+        if (!params->silent) {
             printf("%s: connected\n", __func__);
         }
         tipc_close(fd);
     }
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("%s: done\n", __func__);
     }
 
     return 0;
 }
 
-static int closer2_test(uint repeat)
-{
+static int closer2_test(const struct tipc_test_params* params) {
     uint i;
     int fd;
 
-    if (!opt_silent) {
-        printf("%s: repeat = %u\n", __func__, repeat);
+    if (!params->silent) {
+        printf("%s: repeat = %u\n", __func__, params->repeat);
     }
 
-    for (i = 0; i < repeat; i++) {
-        fd = tipc_connect(dev_name, closer2_name);
+    for (i = 0; i < params->repeat; i++) {
+        fd = tipc_connect(params->dev_name, closer2_name);
         if (fd < 0) {
-            if (!opt_silent) {
+            if (!params->silent) {
                 printf("failed to connect to '%s' service\n", "closer2");
             }
         } else {
@@ -283,38 +327,37 @@
         }
     }
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("%s: done\n", __func__);
     }
 
     return 0;
 }
 
-static int closer3_test(uint repeat)
-{
+static int closer3_test(const struct tipc_test_params* params) {
     uint i, j;
     ssize_t rc;
     int fd[4];
     char buf[64];
 
-    if (!opt_silent) {
-        printf("%s: repeat = %u\n", __func__, repeat);
+    if (!params->silent) {
+        printf("%s: repeat = %u\n", __func__, params->repeat);
     }
 
-    for (i = 0; i < repeat; i++) {
+    for (i = 0; i < params->repeat; i++) {
         /* open 4 connections to closer3 service */
         for (j = 0; j < 4; j++) {
-            fd[j] = tipc_connect(dev_name, closer3_name);
+            fd[j] = tipc_connect(params->dev_name, closer3_name);
             if (fd[j] < 0) {
                 fprintf(stderr, "fd[%d]: failed to connect to '%s' service\n", j, "closer3");
             } else {
-                if (!opt_silent) {
+                if (!params->silent) {
                     printf("%s: fd[%d]=%d: connected\n", __func__, j, fd[j]);
                 }
                 memset(buf, i + j, sizeof(buf));
                 rc = write(fd[j], buf, sizeof(buf));
                 if (rc != sizeof(buf)) {
-                    if (!opt_silent) {
+                    if (!params->silent) {
                         printf("%s: fd[%d]=%d: write returned  = %zd\n", __func__, j, fd[j], rc);
                     }
                     perror("closer3_test: write");
@@ -330,7 +373,7 @@
             if (fd[j] < 0) continue;
             rc = write(fd[j], buf, sizeof(buf));
             if (rc != sizeof(buf)) {
-                if (!opt_silent) {
+                if (!params->silent) {
                     printf("%s: fd[%d]=%d: write returned = %zd\n", __func__, j, fd[j], rc);
                 }
                 perror("closer3_test: write");
@@ -345,38 +388,36 @@
         }
     }
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("%s: done\n", __func__);
     }
 
     return 0;
 }
 
-
-static int echo_test(uint repeat, uint msgsz, bool var)
-{
+static int echo_test(const struct tipc_test_params* params) {
     uint i;
     ssize_t rc;
     size_t msg_len;
     int echo_fd = -1;
-    char tx_buf[msgsz];
-    char rx_buf[msgsz];
+    char tx_buf[params->msgsize];
+    char rx_buf[params->msgsize];
 
-    if (!opt_silent) {
-        printf("%s: repeat %u: msgsz %u: variable %s\n", __func__, repeat, msgsz,
-               var ? "true" : "false");
+    if (!params->silent) {
+        printf("%s: repeat %u: params->msgsize %u: variable %s\n", __func__, params->repeat,
+               params->msgsize, params->variable ? "true" : "false");
     }
 
-    echo_fd = tipc_connect(dev_name, echo_name);
+    echo_fd = tipc_connect(params->dev_name, echo_name);
     if (echo_fd < 0) {
         fprintf(stderr, "Failed to connect to service\n");
         return echo_fd;
     }
 
-    for (i = 0; i < repeat; i++) {
-        msg_len = msgsz;
-        if (opt_variable && msgsz) {
-            msg_len = rand() % msgsz;
+    for (i = 0; i < params->repeat; i++) {
+        msg_len = params->msgsize;
+        if (params->variable && params->msgsize) {
+            msg_len = rand() % params->msgsize;
         }
 
         memset(tx_buf, i + 1, msg_len);
@@ -406,37 +447,37 @@
 
     tipc_close(echo_fd);
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("%s: done\n", __func__);
     }
 
     return 0;
 }
 
-static int burst_write_test(uint repeat, uint msgburst, uint msgsz, bool var)
-{
+static int burst_write_test(const struct tipc_test_params* params) {
     int fd;
     uint i, j;
     ssize_t rc;
     size_t msg_len;
-    char tx_buf[msgsz];
+    char tx_buf[params->msgsize];
 
-    if (!opt_silent) {
-        printf("%s: repeat %u: burst %u: msgsz %u: variable %s\n", __func__, repeat, msgburst,
-               msgsz, var ? "true" : "false");
+    if (!params->silent) {
+        printf("%s: repeat %u: burst %u: params->msgsize %u: variable %s\n", __func__,
+               params->repeat, params->msgburst, params->msgsize,
+               params->variable ? "true" : "false");
     }
 
-    for (i = 0; i < repeat; i++) {
-        fd = tipc_connect(dev_name, datasink_name);
+    for (i = 0; i < params->repeat; i++) {
+        fd = tipc_connect(params->dev_name, datasink_name);
         if (fd < 0) {
             fprintf(stderr, "Failed to connect to '%s' service\n", "datasink");
             break;
         }
 
-        for (j = 0; j < msgburst; j++) {
-            msg_len = msgsz;
-            if (var && msgsz) {
-                msg_len = rand() % msgsz;
+        for (j = 0; j < params->msgburst; j++) {
+            msg_len = params->msgsize;
+            if (params->variable && params->msgsize) {
+                msg_len = rand() % params->msgsize;
             }
 
             memset(tx_buf, i + 1, msg_len);
@@ -450,23 +491,21 @@
         tipc_close(fd);
     }
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("%s: done\n", __func__);
     }
 
     return 0;
 }
 
-
-static int _wait_for_msg(int fd, uint msgsz, int timeout)
-{
+static int _wait_for_msg(int fd, int timeout, const struct tipc_test_params* params) {
     int rc;
     fd_set rfds;
     uint msgcnt = 0;
-    char rx_buf[msgsz];
+    char rx_buf[params->msgsize];
     struct timeval tv;
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("waiting (%d) for msg\n", timeout);
     }
 
@@ -480,7 +519,7 @@
         rc = select(fd + 1, &rfds, NULL, NULL, &tv);
 
         if (rc == 0) {
-            if (!opt_silent) {
+            if (!params->silent) {
                 printf("select timedout\n");
             }
             break;
@@ -502,42 +541,40 @@
         }
     }
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("got %u messages\n", msgcnt);
     }
 
     return 0;
 }
 
-
-static int select_test(uint repeat, uint msgburst, uint msgsz)
-{
+static int select_test(const struct tipc_test_params* params) {
     int fd;
     uint i, j;
     ssize_t rc;
-    char tx_buf[msgsz];
+    char tx_buf[params->msgsize];
 
-    if (!opt_silent) {
-        printf("%s: repeat %u\n", __func__, repeat);
+    if (!params->silent) {
+        printf("%s: repeat %u\n", __func__, params->repeat);
     }
 
-    fd = tipc_connect(dev_name, echo_name);
+    fd = tipc_connect(params->dev_name, echo_name);
     if (fd < 0) {
         fprintf(stderr, "Failed to connect to '%s' service\n", "echo");
         return fd;
     }
 
-    for (i = 0; i < repeat; i++) {
-        _wait_for_msg(fd, msgsz, 1);
+    for (i = 0; i < params->repeat; i++) {
+        _wait_for_msg(fd, 1, params);
 
-        if (!opt_silent) {
-            printf("sending burst: %u msg\n", msgburst);
+        if (!params->silent) {
+            printf("sending burst: %u msg\n", params->msgburst);
         }
 
-        for (j = 0; j < msgburst; j++) {
-            memset(tx_buf, i + j, msgsz);
-            rc = write(fd, tx_buf, msgsz);
-            if ((size_t)rc != msgsz) {
+        for (j = 0; j < params->msgburst; j++) {
+            memset(tx_buf, i + j, params->msgsize);
+            rc = write(fd, tx_buf, params->msgsize);
+            if ((size_t)rc != params->msgsize) {
                 perror("burst_test: write");
                 break;
             }
@@ -546,37 +583,36 @@
 
     tipc_close(fd);
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("%s: done\n", __func__);
     }
 
     return 0;
 }
 
-static int blocked_read_test(uint repeat)
-{
+static int blocked_read_test(const struct tipc_test_params* params) {
     int fd;
     uint i;
     ssize_t rc;
     char rx_buf[512];
 
-    if (!opt_silent) {
-        printf("%s: repeat %u\n", __func__, repeat);
+    if (!params->silent) {
+        printf("%s: repeat %u\n", __func__, params->repeat);
     }
 
-    fd = tipc_connect(dev_name, echo_name);
+    fd = tipc_connect(params->dev_name, echo_name);
     if (fd < 0) {
         fprintf(stderr, "Failed to connect to '%s' service\n", "echo");
         return fd;
     }
 
-    for (i = 0; i < repeat; i++) {
+    for (i = 0; i < params->repeat; i++) {
         rc = read(fd, rx_buf, sizeof(rx_buf));
         if (rc < 0) {
             perror("select_test: read");
             break;
         } else {
-            if (!opt_silent) {
+            if (!params->silent) {
                 printf("got %zd bytes\n", rc);
             }
         }
@@ -584,15 +620,14 @@
 
     tipc_close(fd);
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("%s: done\n", __func__);
     }
 
     return 0;
 }
 
-static int ta2ta_ipc_test(void)
-{
+static int ta2ta_ipc_test(const struct tipc_test_params* params) {
     enum test_message_header {
         TEST_PASSED = 0,
         TEST_FAILED = 1,
@@ -604,11 +639,11 @@
     int ret;
     unsigned char rx_buf[256];
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("%s:\n", __func__);
     }
 
-    fd = tipc_connect(dev_name, main_ctrl_name);
+    fd = tipc_connect(params->dev_name, main_ctrl_name);
     if (fd < 0) {
         fprintf(stderr, "Failed to connect to '%s' service\n", "main_ctrl");
         return fd;
@@ -658,13 +693,12 @@
            uuid->clock_seq_and_node[7]);
 }
 
-static int dev_uuid_test(void)
-{
+static int dev_uuid_test(const struct tipc_test_params* params) {
     int fd;
     ssize_t rc;
     uuid_t uuid;
 
-    fd = tipc_connect(dev_name, uuid_name);
+    fd = tipc_connect(params->dev_name, uuid_name);
     if (fd < 0) {
         fprintf(stderr, "Failed to connect to '%s' service\n", "uuid");
         return fd;
@@ -677,7 +711,7 @@
     } else if (rc != sizeof(uuid)) {
         fprintf(stderr, "unexpected uuid size (%d vs. %d)\n", (int)rc, (int)sizeof(uuid));
     } else {
-        print_uuid(dev_name, &uuid);
+        print_uuid(params->dev_name, &uuid);
     }
 
     tipc_close(fd);
@@ -685,61 +719,58 @@
     return 0;
 }
 
-static int ta_access_test(void)
-{
+static int ta_access_test(const struct tipc_test_params* params) {
     int fd;
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("%s:\n", __func__);
     }
 
-    fd = tipc_connect(dev_name, ta_only_name);
+    fd = tipc_connect(params->dev_name, ta_only_name);
     if (fd >= 0) {
         fprintf(stderr, "Succeed to connect to '%s' service\n", "ta_only");
         tipc_close(fd);
     }
 
-    fd = tipc_connect(dev_name, ns_only_name);
+    fd = tipc_connect(params->dev_name, ns_only_name);
     if (fd < 0) {
         fprintf(stderr, "Failed to connect to '%s' service\n", "ns_only");
         return fd;
     }
     tipc_close(fd);
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("%s: done\n", __func__);
     }
 
     return 0;
 }
 
-
-static int writev_test(uint repeat, uint msgsz, bool var)
-{
+static int writev_test(const struct tipc_test_params* params) {
     uint i;
     ssize_t rc;
     size_t msg_len;
     int echo_fd = -1;
-    char tx0_buf[msgsz];
-    char tx1_buf[msgsz];
-    char rx_buf[msgsz];
+    char tx0_buf[params->msgsize];
+    char tx1_buf[params->msgsize];
+    char rx_buf[params->msgsize];
     struct iovec iovs[2] = {{tx0_buf, 0}, {tx1_buf, 0}};
 
-    if (!opt_silent) {
-        printf("%s: repeat %u: msgsz %u: variable %s\n", __func__, repeat, msgsz,
-               var ? "true" : "false");
+    if (!params->silent) {
+        printf("%s: repeat %u: params->msgsize %u: variable %s\n", __func__, params->repeat,
+               params->msgsize, params->variable ? "true" : "false");
     }
 
-    echo_fd = tipc_connect(dev_name, echo_name);
+    echo_fd = tipc_connect(params->dev_name, echo_name);
     if (echo_fd < 0) {
         fprintf(stderr, "Failed to connect to service\n");
         return echo_fd;
     }
 
-    for (i = 0; i < repeat; i++) {
-        msg_len = msgsz;
-        if (opt_variable && msgsz) {
-            msg_len = rand() % msgsz;
+    for (i = 0; i < params->repeat; i++) {
+        msg_len = params->msgsize;
+        if (params->variable && params->msgsize) {
+            msg_len = rand() % params->msgsize;
         }
 
         iovs[0].iov_len = msg_len / 3;
@@ -786,39 +817,38 @@
 
     tipc_close(echo_fd);
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("%s: done\n", __func__);
     }
 
     return 0;
 }
 
-static int readv_test(uint repeat, uint msgsz, bool var)
-{
+static int readv_test(const struct tipc_test_params* params) {
     uint i;
     ssize_t rc;
     size_t msg_len;
     int echo_fd = -1;
-    char tx_buf[msgsz];
-    char rx0_buf[msgsz];
-    char rx1_buf[msgsz];
+    char tx_buf[params->msgsize];
+    char rx0_buf[params->msgsize];
+    char rx1_buf[params->msgsize];
     struct iovec iovs[2] = {{rx0_buf, 0}, {rx1_buf, 0}};
 
-    if (!opt_silent) {
-        printf("%s: repeat %u: msgsz %u: variable %s\n", __func__, repeat, msgsz,
-               var ? "true" : "false");
+    if (!params->silent) {
+        printf("%s: repeat %u: params->msgsize %u: variable %s\n", __func__, params->repeat,
+               params->msgsize, params->variable ? "true" : "false");
     }
 
-    echo_fd = tipc_connect(dev_name, echo_name);
+    echo_fd = tipc_connect(params->dev_name, echo_name);
     if (echo_fd < 0) {
         fprintf(stderr, "Failed to connect to service\n");
         return echo_fd;
     }
 
-    for (i = 0; i < repeat; i++) {
-        msg_len = msgsz;
-        if (opt_variable && msgsz) {
-            msg_len = rand() % msgsz;
+    for (i = 0; i < params->repeat; i++) {
+        msg_len = params->msgsize;
+        if (params->variable && params->msgsize) {
+            msg_len = rand() % params->msgsize;
         }
 
         iovs[0].iov_len = msg_len / 3;
@@ -865,14 +895,14 @@
 
     tipc_close(echo_fd);
 
-    if (!opt_silent) {
+    if (!params->silent) {
         printf("%s: done\n", __func__);
     }
 
     return 0;
 }
 
-static int send_fd_test(void) {
+static int send_fd_test(const struct tipc_test_params* params) {
     int ret;
     int dma_buf = -1;
     int fd = -1;
@@ -881,7 +911,7 @@
 
     const size_t num_chunks = 10;
 
-    fd = tipc_connect(dev_name, receiver_name);
+    fd = tipc_connect(params->dev_name, receiver_name);
     if (fd < 0) {
         fprintf(stderr, "Failed to connect to test support TA - is it missing?\n");
         ret = -1;
@@ -948,6 +978,73 @@
     return ret;
 }
 
+uint64_t get_time_us(void) {
+    struct timespec spec;
+
+    clock_gettime(CLOCK_MONOTONIC, &spec);
+    return spec.tv_sec * 1000000 + spec.tv_nsec / 1000;
+}
+
+static const struct tipc_test_def tipc_tests[] = {
+        {"connect", connect_test},
+        {"connect_foo", connect_foo},
+        {"burst_write", burst_write_test},
+        {"select", select_test},
+        {"blocked_read", blocked_read_test},
+        {"closer1", closer1_test},
+        {"closer2", closer2_test},
+        {"closer3", closer3_test},
+        {"echo", echo_test},
+        {"ta2ta-ipc", ta2ta_ipc_test},
+        {"dev-uuid", dev_uuid_test},
+        {"ta-access", ta_access_test},
+        {"writev", writev_test},
+        {"readv", readv_test},
+        {"send-fd", send_fd_test},
+};
+
+tipc_test_func_t get_test_function(const struct tipc_test_params* params) {
+    for (size_t i = 0; i < sizeof(tipc_tests) / sizeof(tipc_tests[0]); i++) {
+        if (strcmp(params->test_name, tipc_tests[i].test_name) == 0) {
+            return tipc_tests[i].func;
+        }
+    }
+    fprintf(stderr, "Unrecognized test name '%s'\n", params->test_name);
+    exit(1);
+}
+
+static int run_as_bench(const struct tipc_test_params* params) {
+    int rc = 0;
+    int64_t min = INT64_MAX;
+    int64_t max = 0;
+    int64_t avg = 0;
+    int64_t cold = 0;
+
+    uint64_t start;
+    uint64_t end;
+
+    tipc_test_func_t test = get_test_function(params);
+
+    for (size_t i = 0; (i < params->bench + 1) && rc == 0; ++i) {
+        start = get_time_us();
+        rc |= test(params);
+        end = get_time_us();
+        int64_t t = end - start;
+
+        if (i == 0) {
+            cold = t;
+        } else {
+            min = (t < min) ? t : min;
+            max = (t > max) ? t : max;
+            avg += t;
+        }
+    }
+    avg /= params->bench;
+
+    fprintf(stderr, BENCH_RESULT_TPL, params->test_name, min, max, avg, cold, min, max, avg, cold);
+    return rc;
+}
+
 int main(int argc, char **argv)
 {
     int rc = 0;
@@ -955,52 +1052,25 @@
     if (argc <= 1) {
         print_usage_and_exit(argv[0], EXIT_FAILURE, false);
     }
+    struct tipc_test_params params;
+    init_params(&params);
+    parse_options(argc, argv, &params);
 
-    parse_options(argc, argv);
-
-    if (!dev_name) {
-        dev_name = TIPC_DEFAULT_DEVNAME;
+    if (!params.dev_name) {
+        params.dev_name = TIPC_DEFAULT_DEVNAME;
     }
 
-    if (!test_name) {
+    if (!params.test_name) {
         fprintf(stderr, "need a Test to run\n");
         print_usage_and_exit(argv[0], EXIT_FAILURE, true);
     }
 
-    if (strcmp(test_name, "connect") == 0) {
-        rc = connect_test(opt_repeat);
-    } else if (strcmp(test_name, "connect_foo") == 0) {
-        rc = connect_foo(opt_repeat);
-    } else if (strcmp(test_name, "burst_write") == 0) {
-        rc = burst_write_test(opt_repeat, opt_msgburst, opt_msgsize, opt_variable);
-    } else if (strcmp(test_name, "select") == 0) {
-        rc = select_test(opt_repeat, opt_msgburst, opt_msgsize);
-    } else if (strcmp(test_name, "blocked_read") == 0) {
-        rc = blocked_read_test(opt_repeat);
-    } else if (strcmp(test_name, "closer1") == 0) {
-        rc = closer1_test(opt_repeat);
-    } else if (strcmp(test_name, "closer2") == 0) {
-        rc = closer2_test(opt_repeat);
-    } else if (strcmp(test_name, "closer3") == 0) {
-        rc = closer3_test(opt_repeat);
-    } else if (strcmp(test_name, "echo") == 0) {
-        rc = echo_test(opt_repeat, opt_msgsize, opt_variable);
-    } else if (strcmp(test_name, "ta2ta-ipc") == 0) {
-        rc = ta2ta_ipc_test();
-    } else if (strcmp(test_name, "dev-uuid") == 0) {
-        rc = dev_uuid_test();
-    } else if (strcmp(test_name, "ta-access") == 0) {
-        rc = ta_access_test();
-    } else if (strcmp(test_name, "writev") == 0) {
-        rc = writev_test(opt_repeat, opt_msgsize, opt_variable);
-    } else if (strcmp(test_name, "readv") == 0) {
-        rc = readv_test(opt_repeat, opt_msgsize, opt_variable);
-    } else if (strcmp(test_name, "send-fd") == 0) {
-        rc = send_fd_test();
+    if (params.bench > 0) {
+        rc = run_as_bench(&params);
+        params.bench = 0;
     } else {
-        fprintf(stderr, "Unrecognized test name '%s'\n", test_name);
-        print_usage_and_exit(argv[0], EXIT_FAILURE, true);
+        tipc_test_func_t test = get_test_function(&params);
+        rc = test(&params);
     }
-
     return rc == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
diff --git a/trusty/metrics/include/trusty/metrics/tipc.h b/trusty/metrics/include/trusty/metrics/tipc.h
index 66d0876..e2cf57b 100644
--- a/trusty/metrics/include/trusty/metrics/tipc.h
+++ b/trusty/metrics/include/trusty/metrics/tipc.h
@@ -39,14 +39,17 @@
  * repository. They must be kept in sync.
  */
 
-#define METRICS_PORT "com.android.trusty.metrics"
+#define METRICS_PORT "com.android.trusty.metrics.consumer"
+
+#define UUID_STR_SIZE (37)
 
 /**
  * enum metrics_cmd - command identifiers for metrics interface
- * @METRICS_CMD_RESP_BIT:          message is a response
- * @METRICS_CMD_REQ_SHIFT:         number of bits used by @METRICS_CMD_RESP_BIT
- * @METRICS_CMD_REPORT_EVENT_DROP: report gaps in the event stream
- * @METRICS_CMD_REPORT_CRASH:      report an app crash event
+ * @METRICS_CMD_RESP_BIT:             message is a response
+ * @METRICS_CMD_REQ_SHIFT:            number of bits used by @METRICS_CMD_RESP_BIT
+ * @METRICS_CMD_REPORT_EVENT_DROP:    report gaps in the event stream
+ * @METRICS_CMD_REPORT_CRASH:         report an app crash event
+ * @METRICS_CMD_REPORT_STORAGE_ERROR: report trusty storage error
  */
 enum metrics_cmd {
     METRICS_CMD_RESP_BIT = 1,
@@ -54,6 +57,7 @@
 
     METRICS_CMD_REPORT_EVENT_DROP = (1 << METRICS_CMD_REQ_SHIFT),
     METRICS_CMD_REPORT_CRASH = (2 << METRICS_CMD_REQ_SHIFT),
+    METRICS_CMD_REPORT_STORAGE_ERROR = (3 << METRICS_CMD_REQ_SHIFT),
 };
 
 /**
@@ -90,14 +94,70 @@
 /**
  * struct metrics_report_crash_req - arguments of %METRICS_CMD_REPORT_CRASH
  *                                   requests
- * @app_id_len: length of app ID that follows this structure
+ * @app_id: uuid of the app that crashed
+ * @crash_reason: architecture-specific code representing the reason for the
+ *                crash
  */
 struct metrics_report_crash_req {
-    uint32_t app_id_len;
+    char app_id[UUID_STR_SIZE];
+    uint32_t crash_reason;
 } __attribute__((__packed__));
 
-#define METRICS_MAX_APP_ID_LEN 256
+enum TrustyStorageErrorType {
+  TRUSTY_STORAGE_ERROR_UNKNOWN = 0,
+  TRUSTY_STORAGE_ERROR_SUPERBLOCK_INVALID = 1,
+  TRUSTY_STORAGE_ERROR_BLOCK_MAC_MISMATCH = 2,
+  TRUSTY_STORAGE_ERROR_BLOCK_HEADER_INVALID = 3,
+  TRUSTY_STORAGE_ERROR_RPMB_COUNTER_MISMATCH = 4,
+  TRUSTY_STORAGE_ERROR_RPMB_COUNTER_MISMATCH_RECOVERED = 5,
+  TRUSTY_STORAGE_ERROR_RPMB_COUNTER_READ_FAILURE = 6,
+  TRUSTY_STORAGE_ERROR_RPMB_MAC_MISMATCH = 7,
+  TRUSTY_STORAGE_ERROR_RPMB_ADDR_MISMATCH = 8,
+  TRUSTY_STORAGE_ERROR_RPMB_FAILURE_RESPONSE = 9,
+  TRUSTY_STORAGE_ERROR_RPMB_UNKNOWN = 10,
+  TRUSTY_STORAGE_ERROR_RPMB_SCSI_ERROR = 11,
+  TRUSTY_STORAGE_ERROR_IO_ERROR = 12,
+  TRUSTY_STORAGE_ERROR_PROXY_COMMUNICATION_FAILURE = 13,
+};
 
-#define METRICS_MAX_MSG_SIZE                                                \
-    (sizeof(struct metrics_req) + sizeof(struct metrics_report_crash_req) + \
-     METRICS_MAX_APP_ID_LEN)
+enum TrustyFileSystem {
+  TRUSTY_FS_UNKNOWN = 0,
+  TRUSTY_FS_TP = 1,
+  TRUSTY_FS_TD = 2,
+  TRUSTY_FS_TDP = 3,
+  TRUSTY_FS_TDEA = 4,
+  TRUSTY_FS_NSP = 5,
+};
+
+enum TrustyBlockType {
+  TRUSTY_BLOCKTYPE_UNKNOWN = 0,
+  TRUSTY_BLOCKTYPE_FILES_ROOT = 1,
+  TRUSTY_BLOCKTYPE_FREE_ROOT = 2,
+  TRUSTY_BLOCKTYPE_FILES_INTERNAL = 3,
+  TRUSTY_BLOCKTYPE_FREE_INTERNAL = 4,
+  TRUSTY_BLOCKTYPE_FILE_ENTRY = 5,
+  TRUSTY_BLOCKTYPE_FILE_BLOCK_MAP = 6,
+  TRUSTY_BLOCKTYPE_FILE_DATA = 7,
+  TRUSTY_BLOCKTYPE_CHECKPOINT_ROOT = 8,
+  TRUSTY_BLOCKTYPE_CHECKPOINT_FILES_ROOT = 9,
+  TRUSTY_BLOCKTYPE_CHECKPOINT_FREE_ROOT = 10,
+};
+
+struct metrics_report_storage_error_req {
+    enum TrustyStorageErrorType error;
+    char app_id[UUID_STR_SIZE];
+    char client_app_id[UUID_STR_SIZE];
+    uint32_t write;
+    enum TrustyFileSystem file_system;
+    uint64_t file_path_hash;
+    enum TrustyBlockType block_type;
+    uint64_t repair_counter;
+} __attribute__((__packed__));
+
+struct metrics_msg {
+    struct metrics_req req;
+    union {
+        struct metrics_report_crash_req crash_args;
+        struct metrics_report_storage_error_req storage_args;
+    };
+} __attribute__((__packed__));
\ No newline at end of file
diff --git a/trusty/metrics/metrics.cpp b/trusty/metrics/metrics.cpp
index 3ac128a..d2f0b0a 100644
--- a/trusty/metrics/metrics.cpp
+++ b/trusty/metrics/metrics.cpp
@@ -78,9 +78,8 @@
         return Error() << "connection to Metrics TA has not been initialized yet";
     }
 
-    uint8_t msg[METRICS_MAX_MSG_SIZE];
-
-    auto rc = read(metrics_fd_, msg, sizeof(msg));
+    struct metrics_msg metrics_msg;
+    int rc = read(metrics_fd_, &metrics_msg, sizeof(metrics_msg));
     if (rc < 0) {
         return ErrnoError() << "failed to read metrics message";
     }
@@ -89,23 +88,14 @@
     if (msg_len < sizeof(metrics_req)) {
         return Error() << "message too small: " << rc;
     }
-    auto req = reinterpret_cast<metrics_req*>(msg);
-    size_t offset = sizeof(metrics_req);
+    uint32_t cmd = metrics_msg.req.cmd;
     uint32_t status = METRICS_NO_ERROR;
 
-    switch (req->cmd) {
+    switch (cmd) {
         case METRICS_CMD_REPORT_CRASH: {
-            if (msg_len < offset + sizeof(metrics_report_crash_req)) {
-                return Error() << "message too small: " << rc;
-            }
-            auto crash_args = reinterpret_cast<metrics_report_crash_req*>(msg + offset);
-            offset += sizeof(metrics_report_crash_req);
-
-            if (msg_len < offset + crash_args->app_id_len) {
-                return Error() << "message too small: " << rc;
-            }
-            auto app_id_ptr = reinterpret_cast<char*>(msg + offset);
-            std::string app_id(app_id_ptr, crash_args->app_id_len);
+            struct metrics_report_crash_req crash_args = metrics_msg.crash_args;
+            auto app_id_ptr = crash_args.app_id;
+            std::string app_id(app_id_ptr, UUID_STR_SIZE);
 
             HandleCrash(app_id);
             break;
@@ -121,7 +111,7 @@
     }
 
     metrics_resp resp = {
-            .cmd = req->cmd | METRICS_CMD_RESP_BIT,
+            .cmd = cmd | METRICS_CMD_RESP_BIT,
             .status = status,
     };
 
diff --git a/trusty/secretkeeper/Android.bp b/trusty/secretkeeper/Android.bp
new file mode 100644
index 0000000..6523eda
--- /dev/null
+++ b/trusty/secretkeeper/Android.bp
@@ -0,0 +1,97 @@
+//
+// Copyright (C) 2022 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.
+
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+rust_binary {
+    name: "android.hardware.security.secretkeeper.trusty",
+    relative_install_path: "hw",
+    vendor: true,
+    init_rc: ["android.hardware.security.secretkeeper.trusty.rc"],
+    vintf_fragments: ["android.hardware.security.secretkeeper.trusty.xml"],
+    srcs: [
+        "src/hal_main.rs",
+    ],
+    rustlibs: [
+        "libandroid_logger",
+        "libauthgraph_hal",
+        "libauthgraph_wire",
+        "libbinder_rs",
+        "liblibc",
+        "liblog_rust",
+        "libsecretkeeper_hal",
+        "libtrusty-rs",
+    ],
+    defaults: [
+        "secretkeeper_use_latest_hal_aidl_rust",
+    ],
+    prefer_rlib: true,
+}
+
+cc_defaults {
+    name: "trusty_secretkeeper_fuzz_defaults",
+    srcs: [":trusty_tipc_fuzzer"],
+    fuzz_config: {
+        cc: [
+            "alanstokes@google.com",
+            "drysdale@google.com",
+            "shikhapanwar@google.com",
+        ],
+        componentid: 867125,
+        // TODO: add Secretkeeper hotlist
+        // hotlists: [""],
+    },
+}
+
+cc_fuzz {
+    name: "trusty_secretkeeper_sk_fuzzer",
+    defaults: [
+        "trusty_fuzzer_defaults",
+        "trusty_secretkeeper_fuzz_defaults",
+    ],
+    cflags: [
+        "-DTRUSTY_APP_PORT=\"com.android.trusty.secretkeeper\"",
+        "-DTRUSTY_APP_UUID=\"4582bf12-1f7d-4830-9be5-36e6bd91c2c6\"",
+        "-DTRUSTY_APP_FILENAME=\"secretkeeper_app.syms.elf\"",
+    ],
+}
+
+cc_fuzz {
+    name: "trusty_secretkeeper_ag_fuzzer",
+    defaults: [
+        "trusty_fuzzer_defaults",
+        "trusty_secretkeeper_fuzz_defaults",
+    ],
+    cflags: [
+        "-DTRUSTY_APP_PORT=\"com.android.trusty.secretkeeper.authgraph\"",
+        "-DTRUSTY_APP_UUID=\"4582bf12-1f7d-4830-9be5-36e6bd91c2c6\"",
+        "-DTRUSTY_APP_FILENAME=\"secretkeeper_app.syms.elf\"",
+    ],
+}
+
+cc_fuzz {
+    name: "trusty_secretkeeper_bl_fuzzer",
+    defaults: [
+        "trusty_fuzzer_defaults",
+        "trusty_secretkeeper_fuzz_defaults",
+    ],
+    cflags: [
+        "-DTRUSTY_APP_PORT=\"com.android.trusty.secretkeeper.bootloader\"",
+        "-DTRUSTY_APP_UUID=\"4582bf12-1f7d-4830-9be5-36e6bd91c2c6\"",
+        "-DTRUSTY_APP_FILENAME=\"secretkeeper_app.syms.elf\"",
+    ],
+}
diff --git a/trusty/secretkeeper/android.hardware.security.secretkeeper.trusty.rc b/trusty/secretkeeper/android.hardware.security.secretkeeper.trusty.rc
new file mode 100644
index 0000000..3be03ad
--- /dev/null
+++ b/trusty/secretkeeper/android.hardware.security.secretkeeper.trusty.rc
@@ -0,0 +1,4 @@
+service vendor.secretkeeper.trusty /vendor/bin/hw/android.hardware.security.secretkeeper.trusty
+    class hal
+    user nobody
+    group drmrpc
\ No newline at end of file
diff --git a/trusty/secretkeeper/android.hardware.security.secretkeeper.trusty.xml b/trusty/secretkeeper/android.hardware.security.secretkeeper.trusty.xml
new file mode 100644
index 0000000..2ac152b
--- /dev/null
+++ b/trusty/secretkeeper/android.hardware.security.secretkeeper.trusty.xml
@@ -0,0 +1,7 @@
+<manifest version="1.0" type="device">
+    <hal format="aidl">
+        <name>android.hardware.security.secretkeeper</name>
+        <version>1</version>
+        <fqname>ISecretkeeper/default</fqname>
+    </hal>
+</manifest>
diff --git a/trusty/secretkeeper/src/hal_main.rs b/trusty/secretkeeper/src/hal_main.rs
new file mode 100644
index 0000000..df30493
--- /dev/null
+++ b/trusty/secretkeeper/src/hal_main.rs
@@ -0,0 +1,149 @@
+//
+// Copyright (C) 2022 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.
+
+//! This module implements the HAL service for Secretkeeper in Trusty.
+use authgraph_hal::channel::SerializedChannel;
+use authgraph_wire::fragmentation::{Fragmenter, Reassembler};
+use secretkeeper_hal::SecretkeeperService;
+use android_hardware_security_secretkeeper::aidl::android::hardware::security::secretkeeper::ISecretkeeper::{
+    ISecretkeeper, BpSecretkeeper,
+};
+use log::{error, info};
+use std::{
+    ffi::CString,
+    fmt::Debug,
+    panic,
+    sync::{Arc, Mutex},
+};
+use trusty::DEFAULT_DEVICE;
+
+const SK_TIPC_SERVICE_PORT: &str = "com.android.trusty.secretkeeper";
+const AG_TIPC_SERVICE_PORT: &str = "com.android.trusty.secretkeeper.authgraph";
+const TIPC_MAX_SIZE: usize = 4000;
+
+static SERVICE_INSTANCE: &str = "default";
+
+/// Local error type for failures in the HAL service.
+#[derive(Debug, Clone)]
+struct HalServiceError(String);
+
+#[derive(Debug)]
+struct TipcChannel {
+    channel: Arc<Mutex<trusty::TipcChannel>>,
+}
+
+impl TipcChannel {
+    fn new(channel: trusty::TipcChannel) -> Self {
+        Self { channel: Arc::new(Mutex::new(channel)) }
+    }
+}
+
+fn binderr<E: Debug>(msg: &str, e: E) -> binder::Status {
+    binder::Status::new_exception(
+        binder::ExceptionCode::TRANSACTION_FAILED,
+        Some(&CString::new(format!("Failed to {msg} via tipc channel: {e:?}",)).unwrap()),
+    )
+}
+
+impl SerializedChannel for TipcChannel {
+    // No maximum size for messages passed to `execute()` because it performs fragmentation
+    // and reassembly internally.
+    const MAX_SIZE: usize = usize::MAX;
+
+    fn execute(&self, req_data: &[u8]) -> binder::Result<Vec<u8>> {
+        // Hold lock across both request and response.
+        let mut channel = self.channel.lock().unwrap();
+        let mut pending_rsp = Reassembler::default();
+
+        // Break request message into fragments to send.
+        for req_frag in Fragmenter::new(req_data, TIPC_MAX_SIZE) {
+            channel.send(&req_frag).map_err(|e| binderr("send request", e))?;
+
+            // Every request gets a response.
+            let mut rsp_frag = Vec::new();
+            channel.recv(&mut rsp_frag).map_err(|e| binderr("receive response", e))?;
+
+            if let Some(full_rsp) = pending_rsp.accumulate(&rsp_frag) {
+                return Ok(full_rsp.to_vec());
+            }
+        }
+        // There may be additional response fragments to receive.
+        loop {
+            let mut rsp_frag = Vec::new();
+            channel.recv(&mut rsp_frag).map_err(|e| binderr("receive response", e))?;
+            if let Some(full_rsp) = pending_rsp.accumulate(&rsp_frag) {
+                return Ok(full_rsp.to_vec());
+            }
+        }
+    }
+}
+
+fn main() {
+    if let Err(e) = inner_main() {
+        panic!("HAL service failed: {:?}", e);
+    }
+}
+
+fn inner_main() -> Result<(), HalServiceError> {
+    // Initialize Android logging.
+    android_logger::init_once(
+        android_logger::Config::default()
+            .with_tag("secretkeeper-hal-trusty")
+            .with_max_level(log::LevelFilter::Info)
+            .with_log_buffer(android_logger::LogId::System),
+    );
+    // Redirect panic messages to logcat.
+    panic::set_hook(Box::new(|panic_info| {
+        error!("{}", panic_info);
+    }));
+
+    info!("Trusty Secretkeeper HAL service is starting.");
+
+    info!("Starting thread pool now.");
+    binder::ProcessState::start_thread_pool();
+
+    // Create connections to the TA.
+    let ag_connection = trusty::TipcChannel::connect(DEFAULT_DEVICE, AG_TIPC_SERVICE_PORT)
+        .map_err(|e| {
+            HalServiceError(format!(
+                "Failed to connect to Trusty port {AG_TIPC_SERVICE_PORT} because of {:?}.",
+                e
+            ))
+        })?;
+    let ag_tipc_channel = TipcChannel::new(ag_connection);
+
+    let sk_connection = trusty::TipcChannel::connect(DEFAULT_DEVICE, SK_TIPC_SERVICE_PORT)
+        .map_err(|e| {
+            HalServiceError(format!(
+                "Failed to connect to Trusty port {SK_TIPC_SERVICE_PORT} because of {:?}.",
+                e
+            ))
+        })?;
+    let sk_tipc_channel = TipcChannel::new(sk_connection);
+
+    // Register the AIDL service
+    let service = SecretkeeperService::new_as_binder(sk_tipc_channel, ag_tipc_channel);
+    let service_name =
+        format!("{}/{}", <BpSecretkeeper as ISecretkeeper>::get_descriptor(), SERVICE_INSTANCE);
+    binder::add_service(&service_name, service.as_binder()).map_err(|e| {
+        HalServiceError(format!("Failed to register service {} because of {:?}.", service_name, e))
+    })?;
+
+    info!("Successfully registered Secretkeeper HAL service.");
+    info!("Joining thread pool now.");
+    binder::ProcessState::join_thread_pool();
+    info!("Secretkeeper HAL service is terminating."); // should not reach here
+    Ok(())
+}
diff --git a/trusty/storage/proxy/storage.c b/trusty/storage/proxy/storage.c
index 2299481..8c8edb7 100644
--- a/trusty/storage/proxy/storage.c
+++ b/trusty/storage/proxy/storage.c
@@ -353,7 +353,6 @@
     if (open_flags & O_CREAT) {
         sync_parent(path, watcher);
     }
-    free(path);
 
     /* at this point rc contains storage file fd */
     msg->result = STORAGE_NO_ERROR;
@@ -361,6 +360,9 @@
     ALOGV("%s: \"%s\": fd = %u: handle = %d\n",
           __func__, path, rc, resp.handle);
 
+    free(path);
+    path = NULL;
+
     /* a backing file has been opened, notify any waiting init steps */
     if (!fs_ready_initialized) {
         rc = property_set(FS_READY_PROPERTY, "1");
diff --git a/trusty/trusty-base.mk b/trusty/trusty-base.mk
index 1986c73..b21eca6 100644
--- a/trusty/trusty-base.mk
+++ b/trusty/trusty-base.mk
@@ -35,8 +35,15 @@
     LOCAL_KEYMINT_PRODUCT_PACKAGE := android.hardware.security.keymint-service.trusty
 endif
 
+ifeq ($(SECRETKEEPER_ENABLED),true)
+    LOCAL_SECRETKEEPER_PRODUCT_PACKAGE := android.hardware.security.secretkeeper.trusty
+else
+    LOCAL_SECRETKEEPER_PRODUCT_PACKAGE :=
+endif
+
 PRODUCT_PACKAGES += \
 	$(LOCAL_KEYMINT_PRODUCT_PACKAGE) \
+	$(LOCAL_SECRETKEEPER_PRODUCT_PACKAGE) \
 	android.hardware.gatekeeper-service.trusty \
 	trusty_apploader \
 
diff --git a/trusty/utils/rpmb_dev/Android.bp b/trusty/utils/rpmb_dev/Android.bp
index a270087..5e9caaf 100644
--- a/trusty/utils/rpmb_dev/Android.bp
+++ b/trusty/utils/rpmb_dev/Android.bp
@@ -24,6 +24,7 @@
     ],
     shared_libs: [
         "libc",
+        "libcutils",
         "liblog",
         "libcrypto",
     ],
diff --git a/trusty/utils/rpmb_dev/rpmb_dev.c b/trusty/utils/rpmb_dev/rpmb_dev.c
index 0a9e6a1..cee3037 100644
--- a/trusty/utils/rpmb_dev/rpmb_dev.c
+++ b/trusty/utils/rpmb_dev/rpmb_dev.c
@@ -19,6 +19,7 @@
 #include "rpmb_protocol.h"
 
 #include <assert.h>
+#include <cutils/sockets.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <getopt.h>
@@ -613,20 +614,24 @@
         return EXIT_FAILURE;
     }
 
-    cmdres_sock = socket(AF_UNIX, SOCK_STREAM, 0);
+    cmdres_sock = android_get_control_socket(socket_path);
     if (cmdres_sock < 0) {
-        ALOGE("rpmb_dev: Failed to create command/response socket: %s\n", strerror(errno));
-        return EXIT_FAILURE;
-    }
+        ALOGW("android_get_control_socket(%s) failed, fall back to create it\n", socket_path);
+        cmdres_sock = socket(AF_UNIX, SOCK_STREAM, 0);
+        if (cmdres_sock < 0) {
+            ALOGE("rpmb_dev: Failed to create command/response socket: %s\n", strerror(errno));
+            return EXIT_FAILURE;
+        }
 
-    cmdres_sockaddr.sun_family = AF_UNIX;
-    strncpy(cmdres_sockaddr.sun_path, socket_path, sizeof(cmdres_sockaddr.sun_path));
+        cmdres_sockaddr.sun_family = AF_UNIX;
+        strncpy(cmdres_sockaddr.sun_path, socket_path, sizeof(cmdres_sockaddr.sun_path));
 
-    ret = bind(cmdres_sock, (struct sockaddr*)&cmdres_sockaddr, sizeof(struct sockaddr_un));
-    if (ret < 0) {
-        ALOGE("rpmb_dev: Failed to bind command/response socket: %s: %s\n", socket_path,
-              strerror(errno));
-        return EXIT_FAILURE;
+        ret = bind(cmdres_sock, (struct sockaddr*)&cmdres_sockaddr, sizeof(struct sockaddr_un));
+        if (ret < 0) {
+            ALOGE("rpmb_dev: Failed to bind command/response socket: %s: %s\n", socket_path,
+                  strerror(errno));
+            return EXIT_FAILURE;
+        }
     }
 
     ret = listen(cmdres_sock, 1);
diff --git a/trusty/utils/rpmb_dev/rpmb_dev.rc b/trusty/utils/rpmb_dev/rpmb_dev.rc
index 9e203b8..33ec0f2 100644
--- a/trusty/utils/rpmb_dev/rpmb_dev.rc
+++ b/trusty/utils/rpmb_dev/rpmb_dev.rc
@@ -1,29 +1,34 @@
 # RPMB Mock
-on post-fs-data
-    mkdir /data/vendor/ss
-    chown root system /data/vendor/ss
-    chmod 0770 /data/vendor/ss
-    rm /data/vendor/ss/rpmb_sock
-    start rpmb_mock_init
+on post-fs
+    mkdir /mnt/vendor/persist/ss 0770 root system
+    exec_start rpmb_mock_init
     start rpmb_mock
 
+on post-fs-data
+    mkdir /data/vendor/ss 0770 root system
+    symlink /mnt/vendor/persist/ss /data/vendor/ss/persist
+    chown root system /data/vendor/ss/persist
+    chmod 0770 /data/vendor/ss/persist
+
     # Storage proxy
-    start storageproxyd
+    restart storageproxyd
 
-service storageproxyd /vendor/bin/storageproxyd -d /dev/trusty-ipc-dev0 \
-        -r /data/vendor/ss/rpmb_sock -p /data/vendor/ss -t sock
-    class main
-    disabled
-    user root
+service storageproxyd /vendor/bin/storageproxyd -d ${ro.hardware.trusty_ipc_dev:-/dev/trusty-ipc-dev0} \
+        -r /dev/socket/rpmb_mock -p /data/vendor/ss -t sock
+    class early_hal
+    user system
+    group system
 
-service rpmb_mock_init /vendor/bin/rpmb_dev --dev /data/vendor/ss/RPMB_DATA --init --size 2048
+service rpmb_mock_init /vendor/bin/rpmb_dev --dev /mnt/vendor/persist/ss/RPMB_DATA --init --size 2048
     disabled
     user system
     group system
     oneshot
 
-service rpmb_mock /vendor/bin/rpmb_dev --dev /data/vendor/ss/RPMB_DATA --sock /data/vendor/ss/rpmb_sock
+service rpmb_mock /vendor/bin/rpmb_dev --dev /mnt/vendor/persist/ss/RPMB_DATA \
+                          --sock rpmb_mock
     class main
     disabled
     user system
     group system
+    socket rpmb_mock stream 660 system system