diff --git a/system/btcore/Android.bp b/system/btcore/Android.bp
index d316943b3f8000e38b970da70f379e7ec53d8f77..5f2dd17c0b90bd2d9380d9f5584bf8847569070e 100644
--- a/system/btcore/Android.bp
+++ b/system/btcore/Android.bp
@@ -8,8 +8,8 @@ package {
     default_applicable_licenses: ["system_bt_license"],
 }
 
-cc_library_static {
-    name: "libbtcore",
+cc_defaults {
+    name: "libbtcore_defaults",
     defaults: ["fluoride_defaults"],
     local_include_dirs: ["include"],
     include_dirs: [
@@ -35,6 +35,17 @@ cc_library_static {
     },
 }
 
+cc_library_static {
+    name: "libbtcore",
+    defaults: ["libbtcore_defaults"],
+}
+
+cc_library_static {
+    name: "libbtcore-static",
+    defaults: ["libbtcore_defaults"],
+    cflags: ["-DSTATIC_LIBBLUETOOTH"],
+}
+
 cc_library_headers {
     name: "libbtcore_headers",
     defaults: ["libchrome_support_defaults"],
diff --git a/system/btif/Android.bp b/system/btif/Android.bp
index 640b82caab1522acf5546ad646c990e7c02aef67..f2a156d4045034235f72f7816817a730cad0bd0e 100644
--- a/system/btif/Android.bp
+++ b/system/btif/Android.bp
@@ -88,8 +88,8 @@ genrule {
 }
 
 // libbtif static library for target
-cc_library_static {
-    name: "libbtif",
+cc_defaults {
+    name: "libbtif_defaults",
     defaults: ["fluoride_defaults"],
     include_dirs: btifCommonIncludes,
     srcs: [
@@ -195,6 +195,17 @@ cc_library_static {
     host_supported: true,
 }
 
+cc_library_static {
+    name: "libbtif",
+    defaults: ["libbtif_defaults"],
+}
+
+cc_library_static {
+    name: "libbtif-static",
+    defaults: ["libbtif_defaults"],
+    cflags: ["-DSTATIC_LIBBLUETOOTH"],
+}
+
 // btif unit tests for target
 cc_test {
     name: "net_test_btif",
diff --git a/system/gd/rust/shim/Android.bp b/system/gd/rust/shim/Android.bp
index de909f6c157774b797b0bfece58b2db4386d8bd9..3c35b628b4355edc68ecba0ea3be2710265e5efa 100644
--- a/system/gd/rust/shim/Android.bp
+++ b/system/gd/rust/shim/Android.bp
@@ -26,8 +26,8 @@ cc_defaults {
     },
 }
 
-rust_ffi_static {
-    name: "libbt_shim_ffi",
+rust_defaults {
+    name: "libbt_shim_defaults",
     defaults: ["gd_rust_defaults"],
     crate_name: "bt_shim",
     srcs: ["src/lib.rs"],
@@ -51,8 +51,18 @@ rust_ffi_static {
     ],
 }
 
+rust_library_rlib {
+    name: "libbt_shim",
+    defaults: ["libbt_shim_defaults"],
+}
+
+rust_ffi_static {
+    name: "libbt_shim_ffi",
+    defaults: ["libbt_shim_defaults"],
+}
+
 cc_library_static {
-    name: "libbluetooth_rust_interop",
+    name: "libbt_shim_bridge",
     defaults: ["gd_ffi_defaults"],
     generated_headers: [
         "libbt_init_flags_bridge_header",
@@ -87,9 +97,16 @@ cc_library_static {
     shared_libs: [
         "libchrome",
     ],
+}
+
+cc_library_static {
+    name: "libbluetooth_rust_interop",
+    defaults: ["gd_ffi_defaults"],
     whole_static_libs: [
+        "libbt_shim_bridge",
         "libbt_shim_ffi",
     ],
+    host_supported: true,
 }
 
 cc_library_static {
diff --git a/system/gd/rust/topshim/facade/Android.bp b/system/gd/rust/topshim/facade/Android.bp
index bd94010e23827f06b76ffe84aeff35b31b46324c..5b4446c8c7f07880e77be6d6c38aa9985012605a 100644
--- a/system/gd/rust/topshim/facade/Android.bp
+++ b/system/gd/rust/topshim/facade/Android.bp
@@ -12,6 +12,7 @@ rust_binary_host {
     defaults: ["gd_rust_defaults"],
     crate_name: "bt_topshim_facade",
     srcs: ["src/main.rs"],
+    ld_flags: ["-fsanitize=undefined", "-fsanitize-minimal-runtime"],
     rustlibs: [
         "libbluetooth_rs",
         "libbt_common",
@@ -25,17 +26,18 @@ rust_binary_host {
         "libbt_facade_helpers",
         "libbt_topshim",
         "libbt_topshim_facade_protobuf",
+        "libbt_shim",
     ],
     static_libs: [
         "libbt_topshim_cxx",
         "libbt-bta",
         "libbt-common",
         "libbtdevice",
-        "libbtif",
+        "libbtif-static",
         "libbt-hci",
         "libbt-stack",
         "libbt-utils",
-        "libbtcore",
+        "libbtcore-static",
         "libosi",
         "libbt-protos-lite",
         "libbte",
@@ -46,18 +48,19 @@ rust_binary_host {
         "liblc3codec",
         "libudrv-uipc",
         "libbluetooth_gd", // Gabeldorsche
-        "libbluetooth_rust_interop",
         "libbluetooth-dumpsys",
+        "libbluetooth-types",
         "libflatbuffers-cpp",
+        "libbt_shim_bridge",
     ],
     shared_libs: [
         "libcrypto",
-        "libbluetooth",
         "libchrome",
+        "liblog",
+        "libcutils",
+        "libgrpc++",
+        "libgrpc_wrap"
     ],
-    sanitize: {
-        never: true,
-    },
     proc_macros: [
         "libpaste",
     ],
diff --git a/system/gd/rust/topshim/facade/src/main.rs b/system/gd/rust/topshim/facade/src/main.rs
index 0736933330e78e2148d86ab11ed9fc9c668698be..44d27aa49b03e96a123824e28fa32af29c80ebfe 100644
--- a/system/gd/rust/topshim/facade/src/main.rs
+++ b/system/gd/rust/topshim/facade/src/main.rs
@@ -21,6 +21,18 @@ use tokio::runtime::Runtime;
 mod adapter_service;
 mod media_service;
 
+// This is needed for linking, libbt_shim_bridge needs symbols defined by
+// bt_shim, however bt_shim depends on rust crates (future, tokio) that
+// we use too, if we build and link them separately we ends with duplicate
+// symbols. To solve that we build bt_shim with bt_topshim_facade so the rust
+// compiler share the transitive dependencies.
+//
+// The `::*` is here to circuvent the single_component_path_imports from
+// clippy that is denied on the rust command line so we can't just allow it.
+// This is fine for now since bt_shim doesn't export anything
+#[allow(unused)]
+use bt_shim::*;
+
 fn main() {
     let sigint = install_sigint();
     bt_common::init_logging();