Index: vendor/adb/client/usb_libusb.cpp
--- vendor/adb/client/usb_libusb.cpp.orig
+++ vendor/adb/client/usb_libusb.cpp
@@ -26,6 +26,7 @@
 #include <unistd.h>
 #endif
 
+#include <algorithm>
 #include <atomic>
 #include <chrono>
 #include <condition_variable>
@@ -1042,7 +1043,50 @@ void usb_init() {
             LIBUSB_CLASS_PER_INTERFACE, hotplug_callback, nullptr, nullptr);
 
     if (rc != LIBUSB_SUCCESS) {
-        LOG(FATAL) << "failed to register libusb hotplug callback";
+        LOG(WARNING) << "libusb hotplug not supported (" << libusb_error_name(rc)
+                     << "), falling back to polling";
+        // Spawn a polling thread to detect USB devices without hotplug.
+        std::thread([]() {
+            adb_thread_setname("libusb poll");
+            std::vector<libusb_device*> known;
+            for (;;) {
+                libusb_device** list = nullptr;
+                ssize_t n = libusb_get_device_list(nullptr, &list);
+                if (n >= 0) {
+                    for (ssize_t i = 0; i < n; ++i) {
+                        libusb_device* dev = list[i];
+                        if (std::find(known.begin(), known.end(), dev) == known.end()) {
+                            libusb_ref_device(dev);
+                            device_connected(dev);
+                            known.push_back(dev);
+                        }
+                    }
+                    for (auto it = known.begin(); it != known.end(); ) {
+                        bool present = false;
+                        for (ssize_t i = 0; i < n; ++i) {
+                            if (list[i] == *it) { present = true; break; }
+                        }
+                        if (!present) {
+                            device_disconnected(*it);
+                            libusb_unref_device(*it);
+                            it = known.erase(it);
+                        } else {
+                            ++it;
+                        }
+                    }
+                    libusb_free_device_list(list, 1);
+                    adb_notify_device_scan_complete();
+                }
+                std::this_thread::sleep_for(std::chrono::seconds(1));
+            }
+        }).detach();
+        std::thread([]() {
+            adb_thread_setname("libusb");
+            while (true) {
+                libusb_handle_events(nullptr);
+            }
+        }).detach();
+        return;
     }
 
     // Spawn a thread for libusb_handle_events.
