diff --git a/system/blueberry/tests/gd/cert/gd_device.py b/system/blueberry/tests/gd/cert/gd_device.py
index b0b7d2acc6d88bf9ffc6a057459e8c86aa57f13e..811951967b2a07f08326f7ed7b9b92f62fd1b1a6 100644
--- a/system/blueberry/tests/gd/cert/gd_device.py
+++ b/system/blueberry/tests/gd/cert/gd_device.py
@@ -244,7 +244,7 @@ class GdAndroidDevice(GdDeviceBase):
         self.push_or_die(os.path.join(get_gd_root(), "target", "libgrpc++_unsecure.so"), "system/lib64")
         self.push_or_die(os.path.join(get_gd_root(), "target", "libgrpc++.so"), "system/lib64")
         self.push_or_die(os.path.join(get_gd_root(), "target", "libgrpc_wrap.so"), "system/lib64")
-        self.push_or_die(os.path.join(get_gd_root(), "target", "libstatslog.so"), "system/lib64")
+        self.push_or_die(os.path.join(get_gd_root(), "target", "libstatslog_bt.so"), "system/lib64")
 
         try:
             self.adb.shell("rm /data/misc/bluetooth/logs/btsnoop_hci.log")
diff --git a/system/btcore/fuzzer/Android.bp b/system/btcore/fuzzer/Android.bp
index ddaa6ae6e75054966b57b0919505aff63c680a68..7368d715a2ebaf7cba600da5ffaa8d68a0db7b88 100644
--- a/system/btcore/fuzzer/Android.bp
+++ b/system/btcore/fuzzer/Android.bp
@@ -27,7 +27,7 @@ cc_defaults {
     name: "btcore_fuzz_defaults",
     shared_libs: [
         "libcrypto",
-        "libstatslog",
+        "libstatslog_bt",
         "libbluetooth",
         "android.hardware.bluetooth@1.0",
         "android.hardware.bluetooth@1.1",
diff --git a/system/btif/Android.bp b/system/btif/Android.bp
index f86f3ccb2fa2cda2124a9e21f34aa6052f9f5a56..a1cd9759752478bba86ebdd9b0106959e21d8472 100644
--- a/system/btif/Android.bp
+++ b/system/btif/Android.bp
@@ -35,6 +35,58 @@ btifCommonIncludes = [
     "system/libhwbinder/include",
 ]
 
+cc_library {
+    name: "libstatslog_bt",
+    host_supported: true,
+    generated_sources: ["statslog_bt.cpp"],
+    generated_headers: ["statslog_bt.h"],
+    export_generated_headers: ["statslog_bt.h"],
+    cflags: [
+        "-Wall",
+        "-Werror",
+    ],
+    shared_libs: [
+        "libcutils",
+    ],
+    target: {
+        android: {
+            shared_libs: [
+                "libstatssocket",
+            ],
+            export_shared_lib_headers: [
+                 "libstatssocket",
+            ],
+        },
+        host: {
+            static_libs: [
+                "libstatssocket",
+            ],
+            export_static_lib_headers: [
+                "libstatssocket",
+            ],
+        },
+        darwin: {
+            enabled: false,
+        },
+    },
+}
+
+genrule {
+    name: "statslog_bt.h",
+    tools: ["stats-log-api-gen"],
+    cmd: "$(location stats-log-api-gen) --header $(genDir)/statslog_bt.h --module bluetooth"
+        + " --namespace bluetooth",
+    out: ["statslog_bt.h"],
+}
+
+genrule {
+    name: "statslog_bt.cpp",
+    tools: ["stats-log-api-gen"],
+    cmd: "$(location stats-log-api-gen) --cpp $(genDir)/statslog_bt.cpp --module bluetooth"
+        + " --namespace bluetooth --importHeader statslog_bt.h",
+    out: ["statslog_bt.cpp"],
+}
+
 // libbtif static library for target
 cc_library_static {
     name: "libbtif",
@@ -111,12 +163,9 @@ cc_library_static {
         "android.hardware.bluetooth.audio@2.0",
         "android.hardware.bluetooth.audio@2.1",
         "libcrypto",
-        "libcutils",
         "libflatbuffers-cpp",
         "libhidlbase",
-        "liblog",
         "libtinyxml2",
-        "libutils",
         "libz",
     ],
     target: {
@@ -124,7 +173,7 @@ cc_library_static {
             shared_libs: [
                 "libaaudio",
                 "libfmq",
-                "libstatslog",
+                "libstatslog_bt",
             ],
             srcs: ["src/btif_avrcp_audio_track.cc"],
         },
@@ -165,11 +214,8 @@ cc_test {
         "libbinder_ndk",
         "libfmq",
         "libhidlbase",
-        "liblog",
         "libprotobuf-cpp-lite",
-        "libcutils",
         "libprocessgroup",
-        "libutils",
         "libcrypto",
     ],
     static_libs: [
@@ -216,9 +262,7 @@ cc_test {
         "BluetoothGeneratedPackets_h",
     ],
     shared_libs: [
-        "libcutils",
         "libflatbuffers-cpp",
-        "liblog",
     ],
     static_libs: [
         "libbluetooth-types",
diff --git a/system/btif/src/btif_bqr.cc b/system/btif/src/btif_bqr.cc
index c437b2c1b1173386a6a0dcf6456c316caae11dd8..e477f4932e35c632cd689e198bf8bc99f5489b82 100644
--- a/system/btif/src/btif_bqr.cc
+++ b/system/btif/src/btif_bqr.cc
@@ -18,7 +18,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #ifdef OS_ANDROID
-#include <statslog.h>
+#include <statslog_bt.h>
 #endif
 #include <stdio.h>
 #include <sys/stat.h>
@@ -398,8 +398,8 @@ void AddLinkQualityEventToQueue(uint8_t length, uint8_t* p_link_quality_event) {
       p_bqr_event->bqr_link_quality_event_.nak_count);
 
 #ifdef OS_ANDROID
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_QUALITY_REPORT_REPORTED,
+  int ret = stats_write(
+      BLUETOOTH_QUALITY_REPORT_REPORTED,
       p_bqr_event->bqr_link_quality_event_.quality_report_id,
       p_bqr_event->bqr_link_quality_event_.packet_types,
       p_bqr_event->bqr_link_quality_event_.connection_handle,
diff --git a/system/build/Android.bp b/system/build/Android.bp
index 336cb19539a6c6bf3afdb7782c48d4949c30d050..559e4a754d4f873c0d75c2ed69c3506a6c3b99d3 100644
--- a/system/build/Android.bp
+++ b/system/build/Android.bp
@@ -109,7 +109,7 @@ fluoride_defaults {
     ],
     target: {
         darwin: {
-            // libstatslog -> libbinder doesn't build on mac
+            // libstatslog_bt -> libbinder doesn't build on mac
             enabled: false,
         },
         android: {
@@ -120,7 +120,7 @@ fluoride_defaults {
                 "libgrpc++",
                 "libgrpc_wrap",
                 "libhidlbase",
-                "libstatslog",
+                "libstatslog_bt",
                 "libutils",
             ],
             cflags: [
diff --git a/system/common/Android.bp b/system/common/Android.bp
index d8871583979c59bbcbb785c12c34071a2e19540c..3cb77b21f2e9812d2b564b55209953f1f1e5c760 100644
--- a/system/common/Android.bp
+++ b/system/common/Android.bp
@@ -33,7 +33,7 @@ cc_library_static {
     target: {
         android: {
             srcs: ["metrics.cc"],
-            shared_libs: ["libstatslog"],
+            shared_libs: ["libstatslog_bt"],
         },
         host: {
             srcs: ["metrics_linux.cc"],
diff --git a/system/common/metrics.cc b/system/common/metrics.cc
index 0aa440a1dd2c3572ff85fb28b6a99119054f4303..47870e04021235664158740c0ae85c7e4052049a 100644
--- a/system/common/metrics.cc
+++ b/system/common/metrics.cc
@@ -21,7 +21,7 @@
 #include <base/base64.h>
 #include <base/logging.h>
 #include <include/hardware/bt_av.h>
-#include <statslog.h>
+#include <statslog_bt.h>
 #include <unistd.h>
 
 #include <algorithm>
@@ -584,13 +584,12 @@ void LogLinkLayerConnectionEvent(const RawAddress* address,
     metric_id = MetricIdAllocator::GetInstance().AllocateId(*address);
   }
   // nullptr and size 0 represent missing value for obfuscated_id
-  android::util::BytesField bytes_field(
-      address != nullptr ? obfuscated_id.c_str() : nullptr,
-      address != nullptr ? obfuscated_id.size() : 0);
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_LINK_LAYER_CONNECTION_EVENT, bytes_field,
-      connection_handle, direction, link_type, hci_cmd, hci_event,
-      hci_ble_event, cmd_status, reason_code, metric_id);
+  BytesField bytes_field(address != nullptr ? obfuscated_id.c_str() : nullptr,
+                         address != nullptr ? obfuscated_id.size() : 0);
+  int ret =
+      stats_write(BLUETOOTH_LINK_LAYER_CONNECTION_EVENT, bytes_field,
+                  connection_handle, direction, link_type, hci_cmd, hci_event,
+                  hci_ble_event, cmd_status, reason_code, metric_id);
   if (ret < 0) {
     LOG(WARNING) << __func__ << ": failed to log status " << loghex(cmd_status)
                  << ", reason " << loghex(reason_code) << " from cmd "
@@ -602,9 +601,8 @@ void LogLinkLayerConnectionEvent(const RawAddress* address,
 }
 
 void LogHciTimeoutEvent(uint32_t hci_cmd) {
-  int ret =
-      android::util::stats_write(android::util::BLUETOOTH_HCI_TIMEOUT_REPORTED,
-                                 static_cast<int64_t>(hci_cmd));
+  int ret = stats_write(BLUETOOTH_HCI_TIMEOUT_REPORTED,
+                        static_cast<int64_t>(hci_cmd));
   if (ret < 0) {
     LOG(WARNING) << __func__ << ": failed for opcode " << loghex(hci_cmd)
                  << ", error " << ret;
@@ -613,9 +611,8 @@ void LogHciTimeoutEvent(uint32_t hci_cmd) {
 
 void LogRemoteVersionInfo(uint16_t handle, uint8_t status, uint8_t version,
                           uint16_t manufacturer_name, uint16_t subversion) {
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_REMOTE_VERSION_INFO_REPORTED, handle, status,
-      version, manufacturer_name, subversion);
+  int ret = stats_write(BLUETOOTH_REMOTE_VERSION_INFO_REPORTED, handle, status,
+                        version, manufacturer_name, subversion);
   if (ret < 0) {
     LOG(WARNING) << __func__ << ": failed for handle " << handle << ", status "
                  << loghex(status) << ", version " << loghex(version)
@@ -634,13 +631,12 @@ void LogA2dpAudioUnderrunEvent(const RawAddress& address,
     metric_id = MetricIdAllocator::GetInstance().AllocateId(address);
   }
   // nullptr and size 0 represent missing value for obfuscated_id
-  android::util::BytesField bytes_field(
-      address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
-      address.IsEmpty() ? 0 : obfuscated_id.size());
+  BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
+                         address.IsEmpty() ? 0 : obfuscated_id.size());
   int64_t encoding_interval_nanos = encoding_interval_millis * 1000000;
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_A2DP_AUDIO_UNDERRUN_REPORTED, bytes_field,
-      encoding_interval_nanos, num_missing_pcm_bytes, metric_id);
+  int ret =
+      stats_write(BLUETOOTH_A2DP_AUDIO_UNDERRUN_REPORTED, bytes_field,
+                  encoding_interval_nanos, num_missing_pcm_bytes, metric_id);
   if (ret < 0) {
     LOG(WARNING) << __func__ << ": failed for " << address
                  << ", encoding_interval_nanos " << encoding_interval_nanos
@@ -661,14 +657,13 @@ void LogA2dpAudioOverrunEvent(const RawAddress& address,
     metric_id = MetricIdAllocator::GetInstance().AllocateId(address);
   }
   // nullptr and size 0 represent missing value for obfuscated_id
-  android::util::BytesField bytes_field(
-      address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
-      address.IsEmpty() ? 0 : obfuscated_id.size());
+  BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
+                         address.IsEmpty() ? 0 : obfuscated_id.size());
   int64_t encoding_interval_nanos = encoding_interval_millis * 1000000;
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_A2DP_AUDIO_OVERRUN_REPORTED, bytes_field,
-      encoding_interval_nanos, num_dropped_buffers, num_dropped_encoded_frames,
-      num_dropped_encoded_bytes, metric_id);
+  int ret = stats_write(BLUETOOTH_A2DP_AUDIO_OVERRUN_REPORTED, bytes_field,
+                        encoding_interval_nanos, num_dropped_buffers,
+                        num_dropped_encoded_frames, num_dropped_encoded_bytes,
+                        metric_id);
   if (ret < 0) {
     LOG(WARNING) << __func__ << ": failed to log for " << address
                  << ", encoding_interval_nanos " << encoding_interval_nanos
@@ -688,12 +683,10 @@ void LogA2dpPlaybackEvent(const RawAddress& address, int playback_state,
     metric_id = MetricIdAllocator::GetInstance().AllocateId(address);
   }
   // nullptr and size 0 represent missing value for obfuscated_id
-  android::util::BytesField bytes_field(
-      address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
-      address.IsEmpty() ? 0 : obfuscated_id.size());
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_A2DP_PLAYBACK_STATE_CHANGED, bytes_field,
-      playback_state, audio_coding_mode, metric_id);
+  BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
+                         address.IsEmpty() ? 0 : obfuscated_id.size());
+  int ret = stats_write(BLUETOOTH_A2DP_PLAYBACK_STATE_CHANGED, bytes_field,
+                        playback_state, audio_coding_mode, metric_id);
   if (ret < 0) {
     LOG(WARNING) << __func__ << ": failed to log for " << address
                  << ", playback_state " << playback_state
@@ -711,12 +704,10 @@ void LogReadRssiResult(const RawAddress& address, uint16_t handle,
     metric_id = MetricIdAllocator::GetInstance().AllocateId(address);
   }
   // nullptr and size 0 represent missing value for obfuscated_id
-  android::util::BytesField bytes_field(
-      address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
-      address.IsEmpty() ? 0 : obfuscated_id.size());
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_DEVICE_RSSI_REPORTED, bytes_field, handle,
-      cmd_status, rssi, metric_id);
+  BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
+                         address.IsEmpty() ? 0 : obfuscated_id.size());
+  int ret = stats_write(BLUETOOTH_DEVICE_RSSI_REPORTED, bytes_field, handle,
+                        cmd_status, rssi, metric_id);
   if (ret < 0) {
     LOG(WARNING) << __func__ << ": failed for " << address << ", handle "
                  << handle << ", status " << loghex(cmd_status) << ", rssi "
@@ -734,12 +725,11 @@ void LogReadFailedContactCounterResult(const RawAddress& address,
     metric_id = MetricIdAllocator::GetInstance().AllocateId(address);
   }
   // nullptr and size 0 represent missing value for obfuscated_id
-  android::util::BytesField bytes_field(
-      address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
-      address.IsEmpty() ? 0 : obfuscated_id.size());
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_DEVICE_FAILED_CONTACT_COUNTER_REPORTED,
-      bytes_field, handle, cmd_status, failed_contact_counter, metric_id);
+  BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
+                         address.IsEmpty() ? 0 : obfuscated_id.size());
+  int ret =
+      stats_write(BLUETOOTH_DEVICE_FAILED_CONTACT_COUNTER_REPORTED, bytes_field,
+                  handle, cmd_status, failed_contact_counter, metric_id);
   if (ret < 0) {
     LOG(WARNING) << __func__ << ": failed for " << address << ", handle "
                  << handle << ", status " << loghex(cmd_status)
@@ -758,12 +748,10 @@ void LogReadTxPowerLevelResult(const RawAddress& address, uint16_t handle,
     metric_id = MetricIdAllocator::GetInstance().AllocateId(address);
   }
   // nullptr and size 0 represent missing value for obfuscated_id
-  android::util::BytesField bytes_field(
-      address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
-      address.IsEmpty() ? 0 : obfuscated_id.size());
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_DEVICE_TX_POWER_LEVEL_REPORTED, bytes_field,
-      handle, cmd_status, transmit_power_level, metric_id);
+  BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
+                         address.IsEmpty() ? 0 : obfuscated_id.size());
+  int ret = stats_write(BLUETOOTH_DEVICE_TX_POWER_LEVEL_REPORTED, bytes_field,
+                        handle, cmd_status, transmit_power_level, metric_id);
   if (ret < 0) {
     LOG(WARNING) << __func__ << ": failed for " << address << ", handle "
                  << handle << ", status " << loghex(cmd_status)
@@ -782,12 +770,12 @@ void LogSmpPairingEvent(const RawAddress& address, uint8_t smp_cmd,
     metric_id = MetricIdAllocator::GetInstance().AllocateId(address);
   }
   // nullptr and size 0 represent missing value for obfuscated_id
-  android::util::BytesField obfuscated_id_field(
+  BytesField obfuscated_id_field(
       address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
       address.IsEmpty() ? 0 : obfuscated_id.size());
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_SMP_PAIRING_EVENT_REPORTED, obfuscated_id_field,
-      smp_cmd, direction, smp_fail_reason, metric_id);
+  int ret =
+      stats_write(BLUETOOTH_SMP_PAIRING_EVENT_REPORTED, obfuscated_id_field,
+                  smp_cmd, direction, smp_fail_reason, metric_id);
   if (ret < 0) {
     LOG(WARNING) << __func__ << ": failed for " << address << ", smp_cmd "
                  << loghex(smp_cmd) << ", direction " << direction
@@ -805,13 +793,12 @@ void LogClassicPairingEvent(const RawAddress& address, uint16_t handle, uint32_t
     metric_id = MetricIdAllocator::GetInstance().AllocateId(address);
   }
   // nullptr and size 0 represent missing value for obfuscated_id
-  android::util::BytesField obfuscated_id_field(
+  BytesField obfuscated_id_field(
       address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
       address.IsEmpty() ? 0 : obfuscated_id.size());
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_CLASSIC_PAIRING_EVENT_REPORTED,
-      obfuscated_id_field, handle, hci_cmd, hci_event, cmd_status, reason_code,
-      event_value, metric_id);
+  int ret = stats_write(BLUETOOTH_CLASSIC_PAIRING_EVENT_REPORTED,
+                        obfuscated_id_field, handle, hci_cmd, hci_event,
+                        cmd_status, reason_code, event_value, metric_id);
   if (ret < 0) {
     LOG(WARNING) << __func__ << ": failed for " << address << ", handle " << handle << ", hci_cmd " << loghex(hci_cmd)
                  << ", hci_event " << loghex(hci_event) << ", cmd_status " << loghex(cmd_status) << ", reason "
@@ -829,13 +816,13 @@ void LogSdpAttribute(const RawAddress& address, uint16_t protocol_uuid,
     metric_id = MetricIdAllocator::GetInstance().AllocateId(address);
   }
   // nullptr and size 0 represent missing value for obfuscated_id
-  android::util::BytesField obfuscated_id_field(
+  BytesField obfuscated_id_field(
       address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
       address.IsEmpty() ? 0 : obfuscated_id.size());
-  android::util::BytesField attribute_field(attribute_value, attribute_size);
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_SDP_ATTRIBUTE_REPORTED, obfuscated_id_field,
-      protocol_uuid, attribute_id, attribute_field, metric_id);
+  BytesField attribute_field(attribute_value, attribute_size);
+  int ret =
+      stats_write(BLUETOOTH_SDP_ATTRIBUTE_REPORTED, obfuscated_id_field,
+                  protocol_uuid, attribute_id, attribute_field, metric_id);
   if (ret < 0) {
     LOG(WARNING) << __func__ << ": failed for " << address << ", protocol_uuid "
                  << loghex(protocol_uuid) << ", attribute_id "
@@ -855,13 +842,13 @@ void LogSocketConnectionState(
     metric_id = MetricIdAllocator::GetInstance().AllocateId(address);
   }
   // nullptr and size 0 represent missing value for obfuscated_id
-  android::util::BytesField obfuscated_id_field(
+  BytesField obfuscated_id_field(
       address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
       address.IsEmpty() ? 0 : obfuscated_id.size());
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_SOCKET_CONNECTION_STATE_CHANGED,
-      obfuscated_id_field, port, type, connection_state, tx_bytes, rx_bytes,
-      uid, server_port, socket_role, metric_id);
+  int ret =
+      stats_write(BLUETOOTH_SOCKET_CONNECTION_STATE_CHANGED,
+                  obfuscated_id_field, port, type, connection_state, tx_bytes,
+                  rx_bytes, uid, server_port, socket_role, metric_id);
   if (ret < 0) {
     LOG(WARNING) << __func__ << ": failed for " << address << ", port " << port
                  << ", type " << type << ", state " << connection_state
@@ -885,13 +872,13 @@ void LogManufacturerInfo(const RawAddress& address,
     metric_id = MetricIdAllocator::GetInstance().AllocateId(address);
   }
   // nullptr and size 0 represent missing value for obfuscated_id
-  android::util::BytesField obfuscated_id_field(
+  BytesField obfuscated_id_field(
       address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
       address.IsEmpty() ? 0 : obfuscated_id.size());
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_DEVICE_INFO_REPORTED, obfuscated_id_field,
-      source_type, source_name.c_str(), manufacturer.c_str(), model.c_str(),
-      hardware_version.c_str(), software_version.c_str(), metric_id);
+  int ret = stats_write(BLUETOOTH_DEVICE_INFO_REPORTED, obfuscated_id_field,
+                        source_type, source_name.c_str(), manufacturer.c_str(),
+                        model.c_str(), hardware_version.c_str(),
+                        software_version.c_str(), metric_id);
   if (ret < 0) {
     LOG(WARNING) << __func__ << ": failed for " << address << ", source_type "
                  << source_type << ", source_name " << source_name
@@ -909,12 +896,11 @@ void LogBluetoothHalCrashReason(const RawAddress& address, uint32_t error_code,
     obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address);
   }
   // nullptr and size 0 represent missing value for obfuscated_id
-  android::util::BytesField obfuscated_id_field(
+  BytesField obfuscated_id_field(
       address.IsEmpty() ? nullptr : obfuscated_id.c_str(),
       address.IsEmpty() ? 0 : obfuscated_id.size());
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_HAL_CRASH_REASON_REPORTED, 0,
-      obfuscated_id_field, error_code, vendor_error_code);
+  int ret = stats_write(BLUETOOTH_HAL_CRASH_REASON_REPORTED, 0,
+                        obfuscated_id_field, error_code, vendor_error_code);
   if (ret < 0) {
     LOG(WARNING) << __func__ << ": failed for " << address << ", error_code "
                  << loghex(error_code) << ", vendor_error_code "
diff --git a/system/gd/Android.bp b/system/gd/Android.bp
index 0fa4da68fdba3effc792c4c71c6281f7b87bcf97..56726787485b07bf2f91a0188b0349313bfc4b91 100644
--- a/system/gd/Android.bp
+++ b/system/gd/Android.bp
@@ -149,7 +149,7 @@ cc_defaults {
                 "libcutils",
                 "libhidlbase",
                 "libutils",
-                "libstatslog",
+                "libstatslog_bt",
             ],
         },
     },
@@ -270,7 +270,7 @@ cc_binary {
                 "libhidlbase",
                 "libutils",
                 "libcutils",
-                "libstatslog",
+                "libstatslog_bt",
             ],
         },
         host: {
@@ -322,7 +322,7 @@ cc_test {
                 "libhidlbase",
                 "libutils",
                 "libcutils",
-                "libstatslog",
+                "libstatslog_bt",
             ],
         },
     },
@@ -404,7 +404,7 @@ cc_test {
                 "libhidlbase",
                 "libutils",
                 "libcutils",
-                "libstatslog",
+                "libstatslog_bt",
             ],
         },
     },
@@ -535,7 +535,7 @@ cc_defaults {
                 "libcutils",
                 "libhidlbase",
                 "libutils",
-                "libstatslog",
+                "libstatslog_bt",
             ],
         },
     },
diff --git a/system/gd/Android.mk b/system/gd/Android.mk
index 54d22c43e07a808a0eb029022581846402e245e4..efe698ecf7ee1c5c27910eca40a40cf1180722c4 100644
--- a/system/gd/Android.mk
+++ b/system/gd/Android.mk
@@ -49,7 +49,7 @@ LOCAL_target_libraries := \
 	$(TARGET_OUT_SHARED_LIBRARIES)/libgrpc++_unsecure.so \
 	$(TARGET_OUT_SHARED_LIBRARIES)/libgrpc++.so \
 	$(TARGET_OUT_SHARED_LIBRARIES)/libgrpc_wrap.so \
-	$(TARGET_OUT_SHARED_LIBRARIES)/libstatslog.so
+	$(TARGET_OUT_SHARED_LIBRARIES)/libstatslog_bt.so
 #LINT.ThenChange(cert/run)
 
 bluetooth_cert_src_and_bin_zip := \
diff --git a/system/gd/cert/gd_device.py b/system/gd/cert/gd_device.py
index de7797239aaa9caa835887b9ebb3bb86712041a7..3c94c19f99a07cb1a48191a6a2074e89ed80d393 100644
--- a/system/gd/cert/gd_device.py
+++ b/system/gd/cert/gd_device.py
@@ -247,7 +247,7 @@ class GdAndroidDevice(GdDeviceBase):
         self.push_or_die(os.path.join(get_gd_root(), "target", "libgrpc++_unsecure.so"), "system/lib64")
         self.push_or_die(os.path.join(get_gd_root(), "target", "libgrpc++.so"), "system/lib64")
         self.push_or_die(os.path.join(get_gd_root(), "target", "libgrpc_wrap.so"), "system/lib64")
-        self.push_or_die(os.path.join(get_gd_root(), "target", "libstatslog.so"), "system/lib64")
+        self.push_or_die(os.path.join(get_gd_root(), "target", "libstatslog_bt.so"), "system/lib64")
 
         try:
             self.adb.shell("rm /data/misc/bluetooth/logs/btsnoop_hci.log")
diff --git a/system/gd/os/android/metrics.cc b/system/gd/os/android/metrics.cc
index 52608191bb0e0640f1dacef812cf4ad2d71c35d5..bb1e80e1eac970decc40193ea7b2b668078b533d 100644
--- a/system/gd/os/android/metrics.cc
+++ b/system/gd/os/android/metrics.cc
@@ -18,12 +18,13 @@
 
 #define LOG_TAG "BluetoothMetrics"
 
-#include <statslog.h>
+#include "os/metrics.h"
+
+#include <statslog_bt.h>
 
 #include "common/metric_id_manager.h"
 #include "common/strings.h"
 #include "os/log.h"
-#include "os/metrics.h"
 
 namespace bluetooth {
 
@@ -35,7 +36,7 @@ using bluetooth::hci::Address;
 /**
  * nullptr and size 0 represent missing value for obfuscated_id
  */
-static const android::util::BytesField byteField(nullptr, 0);
+static const BytesField byteField(nullptr, 0);
 
 void LogMetricLinkLayerConnectionEvent(
     const Address* address,
@@ -51,8 +52,8 @@ void LogMetricLinkLayerConnectionEvent(
   if (address != nullptr) {
     metric_id = MetricIdManager::GetInstance().AllocateId(*address);
   }
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_LINK_LAYER_CONNECTION_EVENT,
+  int ret = stats_write(
+      BLUETOOTH_LINK_LAYER_CONNECTION_EVENT,
       byteField,
       connection_handle,
       direction,
@@ -80,7 +81,7 @@ void LogMetricLinkLayerConnectionEvent(
 }
 
 void LogMetricHciTimeoutEvent(uint32_t hci_cmd) {
-  int ret = android::util::stats_write(android::util::BLUETOOTH_HCI_TIMEOUT_REPORTED, static_cast<int64_t>(hci_cmd));
+  int ret = stats_write(BLUETOOTH_HCI_TIMEOUT_REPORTED, static_cast<int64_t>(hci_cmd));
   if (ret < 0) {
     LOG_WARN("Failed for opcode %s, error %d", common::ToHexString(hci_cmd).c_str(), ret);
   }
@@ -88,8 +89,7 @@ void LogMetricHciTimeoutEvent(uint32_t hci_cmd) {
 
 void LogMetricRemoteVersionInfo(
     uint16_t handle, uint8_t status, uint8_t version, uint16_t manufacturer_name, uint16_t subversion) {
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_REMOTE_VERSION_INFO_REPORTED, handle, status, version, manufacturer_name, subversion);
+  int ret = stats_write(BLUETOOTH_REMOTE_VERSION_INFO_REPORTED, handle, status, version, manufacturer_name, subversion);
   if (ret < 0) {
     LOG_WARN(
         "Failed for handle %d, status %s, version %s, manufacturer_name %s, subversion %s, error %d",
@@ -109,12 +109,8 @@ void LogMetricA2dpAudioUnderrunEvent(
     metric_id = MetricIdManager::GetInstance().AllocateId(address);
   }
   int64_t encoding_interval_nanos = encoding_interval_millis * 1000000;
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_A2DP_AUDIO_UNDERRUN_REPORTED,
-      byteField,
-      encoding_interval_nanos,
-      num_missing_pcm_bytes,
-      metric_id);
+  int ret = stats_write(
+      BLUETOOTH_A2DP_AUDIO_UNDERRUN_REPORTED, byteField, encoding_interval_nanos, num_missing_pcm_bytes, metric_id);
   if (ret < 0) {
     LOG_WARN(
         "Failed for %s, encoding_interval_nanos %s, num_missing_pcm_bytes %d, error %d",
@@ -137,8 +133,8 @@ void LogMetricA2dpAudioOverrunEvent(
   }
 
   int64_t encoding_interval_nanos = encoding_interval_millis * 1000000;
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_A2DP_AUDIO_OVERRUN_REPORTED,
+  int ret = stats_write(
+      BLUETOOTH_A2DP_AUDIO_OVERRUN_REPORTED,
       byteField,
       encoding_interval_nanos,
       num_dropped_buffers,
@@ -164,8 +160,7 @@ void LogMetricA2dpPlaybackEvent(const Address& address, int playback_state, int
     metric_id = MetricIdManager::GetInstance().AllocateId(address);
   }
 
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_A2DP_PLAYBACK_STATE_CHANGED, byteField, playback_state, audio_coding_mode, metric_id);
+  int ret = stats_write(BLUETOOTH_A2DP_PLAYBACK_STATE_CHANGED, byteField, playback_state, audio_coding_mode, metric_id);
   if (ret < 0) {
     LOG_WARN(
         "Failed to log for %s, playback_state %d, audio_coding_mode %d,error %d",
@@ -181,8 +176,7 @@ void LogMetricReadRssiResult(const Address& address, uint16_t handle, uint32_t c
   if (!address.IsEmpty()) {
     metric_id = MetricIdManager::GetInstance().AllocateId(address);
   }
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_DEVICE_RSSI_REPORTED, byteField, handle, cmd_status, rssi, metric_id);
+  int ret = stats_write(BLUETOOTH_DEVICE_RSSI_REPORTED, byteField, handle, cmd_status, rssi, metric_id);
   if (ret < 0) {
     LOG_WARN(
         "Failed for %s, handle %d, status %s, rssi %d dBm, error %d",
@@ -200,8 +194,8 @@ void LogMetricReadFailedContactCounterResult(
   if (!address.IsEmpty()) {
     metric_id = MetricIdManager::GetInstance().AllocateId(address);
   }
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_DEVICE_FAILED_CONTACT_COUNTER_REPORTED,
+  int ret = stats_write(
+      BLUETOOTH_DEVICE_FAILED_CONTACT_COUNTER_REPORTED,
       byteField,
       handle,
       cmd_status,
@@ -224,13 +218,8 @@ void LogMetricReadTxPowerLevelResult(
   if (!address.IsEmpty()) {
     metric_id = MetricIdManager::GetInstance().AllocateId(address);
   }
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_DEVICE_TX_POWER_LEVEL_REPORTED,
-      byteField,
-      handle,
-      cmd_status,
-      transmit_power_level,
-      metric_id);
+  int ret = stats_write(
+      BLUETOOTH_DEVICE_TX_POWER_LEVEL_REPORTED, byteField, handle, cmd_status, transmit_power_level, metric_id);
   if (ret < 0) {
     LOG_WARN(
         "Failed for %s, handle %d, status %s, transmit_power_level %d packets, error %d",
@@ -248,8 +237,8 @@ void LogMetricSmpPairingEvent(
   if (!address.IsEmpty()) {
     metric_id = MetricIdManager::GetInstance().AllocateId(address);
   }
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_SMP_PAIRING_EVENT_REPORTED, byteField, smp_cmd, direction, smp_fail_reason, metric_id);
+  int ret =
+      stats_write(BLUETOOTH_SMP_PAIRING_EVENT_REPORTED, byteField, smp_cmd, direction, smp_fail_reason, metric_id);
   if (ret < 0) {
     LOG_WARN(
         "Failed for %s, smp_cmd %s, direction %d, smp_fail_reason %s, error %d",
@@ -273,8 +262,8 @@ void LogMetricClassicPairingEvent(
   if (!address.IsEmpty()) {
     metric_id = MetricIdManager::GetInstance().AllocateId(address);
   }
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_CLASSIC_PAIRING_EVENT_REPORTED,
+  int ret = stats_write(
+      BLUETOOTH_CLASSIC_PAIRING_EVENT_REPORTED,
       byteField,
       handle,
       hci_cmd,
@@ -308,14 +297,9 @@ void LogMetricSdpAttribute(
   if (!address.IsEmpty()) {
     metric_id = MetricIdManager::GetInstance().AllocateId(address);
   }
-  android::util::BytesField attribute_field(attribute_value, attribute_size);
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_SDP_ATTRIBUTE_REPORTED,
-      byteField,
-      protocol_uuid,
-      attribute_id,
-      attribute_field,
-      metric_id);
+  BytesField attribute_field(attribute_value, attribute_size);
+  int ret =
+      stats_write(BLUETOOTH_SDP_ATTRIBUTE_REPORTED, byteField, protocol_uuid, attribute_id, attribute_field, metric_id);
   if (ret < 0) {
     LOG_WARN(
         "Failed for %s, protocol_uuid %s, attribute_id %s, error %d",
@@ -340,8 +324,8 @@ void LogMetricSocketConnectionState(
   if (!address.IsEmpty()) {
     metric_id = MetricIdManager::GetInstance().AllocateId(address);
   }
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_SOCKET_CONNECTION_STATE_CHANGED,
+  int ret = stats_write(
+      BLUETOOTH_SOCKET_CONNECTION_STATE_CHANGED,
       byteField,
       port,
       type,
@@ -381,8 +365,8 @@ void LogMetricManufacturerInfo(
   if (!address.IsEmpty()) {
     metric_id = MetricIdManager::GetInstance().AllocateId(address);
   }
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_DEVICE_INFO_REPORTED,
+  int ret = stats_write(
+      BLUETOOTH_DEVICE_INFO_REPORTED,
       byteField,
       source_type,
       source_name.c_str(),
@@ -410,12 +394,8 @@ void LogMetricBluetoothHalCrashReason(
     const Address& address,
     uint32_t error_code,
     uint32_t vendor_error_code) {
-  int ret = android::util::stats_write(
-      android::util::BLUETOOTH_HAL_CRASH_REASON_REPORTED,
-      0 /* metric_id */,
-      byteField,
-      error_code,
-      vendor_error_code);
+  int ret =
+      stats_write(BLUETOOTH_HAL_CRASH_REASON_REPORTED, 0 /* metric_id */, byteField, error_code, vendor_error_code);
   if (ret < 0) {
     LOG_WARN(
         "Failed for %s, error_code %s, vendor_error_code %s, error %d",
diff --git a/system/profile/avrcp/Android.bp b/system/profile/avrcp/Android.bp
index 72a30b52aa82a5ce8f97b65b38a138ee95740e09..01589a6518f2bd6c726513cd424da316aa067a2e 100644
--- a/system/profile/avrcp/Android.bp
+++ b/system/profile/avrcp/Android.bp
@@ -106,7 +106,7 @@ cc_fuzz {
         "libcutils",
         "libevent",
         "liblog",
-        "libstatslog",
+        "libstatslog_bt",
     ],
     header_libs: ["libbluetooth_headers"],
     corpus: [