Как устроена цепочка и где она рвётся:
Напомню схему из главы 4: клиент adb (то, что вы запускаете в терминале), сервер adb (демон на TCP-порту 5037 вашей машины) и adbd (демон на устройстве). Любая неполадка живёт в одном из трёх звеньев или на стыке. Первый диагностический шаг всегда один и тот же:
Код: Выделить всё
adb version
adb devices -l
Код: Выделить всё
Android Debug Bridge version 1.0.41
Version 36.0.0-13206524
Installed as /opt/platform-tools/adb
List of devices attached
RZ8T40KQXHE device usb:1-2 product:o1sxxx model:SM_S921B device:o1s transport_id:3
Подробное логирование: ADB_TRACE:
Переменная окружения ADB_TRACE включает трассировку. Поддерживаемые значения: all (или 1), adb, sockets, packets, rwx, usb, sync, sysdeps, transport, jdwp, services, auth, fdevent, shell. Перечислять можно через запятую.
Код: Выделить всё
# Linux/macOS: трассируем только USB и транспорт
ADB_TRACE=usb,transport adb devices
# Windows (cmd)
set ADB_TRACE=all
adb devices
# Windows (PowerShell)
$env:ADB_TRACE="all"
adb devices
Код: Выделить всё
adb D 06-11 14:02:11 48211 48211 adb_client.cpp:160: _adb_connect: host:version
adb D 06-11 14:02:11 48211 48211 adb_io.cpp:107: writex: fd=3 len=18 ...
adb D 06-11 14:02:11 48211 48211 adb_client.cpp:392: adb_query: host:devices-l
Код: Выделить всё
adb kill-server
ADB_TRACE=all adb start-server
tail -f /tmp/adb.1000.log
Код: Выделить всё
adb kill-server
ADB_TRACE=all adb server nodaemon
Код: Выделить всё
adb host-features
shell_v2,cmd,stat_v2,ls_v2,apex,abb,abb_exec,sendrecv_v2,openscreen_mdns,push_sync,libusb
adb kill-server
ADB_LIBUSB=0 adb start-server
Разбор ошибки device unauthorized:
Код: Выделить всё
List of devices attached
RZ8T40KQXHE unauthorized usb:1-2 transport_id:4
1. Разблокируйте экран. Диалог "Разрешить отладку по USB?" на залоченном устройстве не появляется.
2. Передёрните кабель, поставьте галочку "Всегда разрешать с этого компьютера".
3. Диалога нет совсем: на устройстве в разделе для разработчиков нажмите "Отозвать доступ для отладки по USB", выключите и включите отладку, переподключите кабель.
4. Не помогло, пересоздайте ключи на хосте:
Код: Выделить всё
adb kill-server
rm ~/.android/adbkey ~/.android/adbkey.pub
adb start-server
adb devices
Разбор ошибки offline:
Сервер видит транспорт, но рукопожатие с adbd не завершилось или связь протухла. Классика: старый adb на хосте против Android 14/15, зависший adbd, оборванное Wi-Fi-подключение из главы 20. Лечение по нарастающей:
Код: Выделить всё
adb reconnect # передёрнуть соединение со стороны хоста
adb reconnect offline # переподключить только offline-устройства
adb reconnect device # сброс со стороны устройства
adb kill-server && adb devices
Разбор ошибки no permissions:
Чисто линуксовая история, процессу adb не хватает прав на файл устройства в /dev/bus/usb:
Код: Выделить всё
List of devices attached
???????????? no permissions (user in plugdev group; are your udev rules wrong?); see [http://developer.android.com/tools/device.html]
Код: Выделить всё
lsusb
Bus 001 Device 014: ID 18d1:4ee7 Google Inc. Nexus/Pixel Device
Код: Выделить всё
sudo tee /etc/udev/rules.d/51-android.rules <<'EOF'
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0660", GROUP="plugdev", TAG+="uaccess"
EOF
sudo udevadm control --reload-rules
sudo udevadm trigger
sudo usermod -aG plugdev $USER
Разбор ошибки device not found (список пуст):
Устройство не доехало даже до сервера. Проверяйте снизу вверх. Кабель: зарядные шнуры без линий данных лидируют по потраченным часам, телефон заряжается, но в системе не появляется. Режим USB на телефоне: в шторке выберите "Передача файлов" вместо "Только зарядка". Отладка по USB вообще включена (глава 3). И сама шина:
Код: Выделить всё
# Linux: видит ли ядро устройство в момент подключения
dmesg -w
[ 8841.120334] usb 1-2: new high-speed USB device number 14 using xhci_hcd
[ 8841.270112] usb 1-2: Product: SM-S921B
# macOS
system_profiler SPUSBDataType
Сброс и переустановка компонентов ADB:
Шаг 1, чистый перезапуск сервера:
Код: Выделить всё
adb kill-server
adb start-server
* daemon not running; starting now at tcp:5037
* daemon started successfully
Код: Выделить всё
adb server version (39) doesn't match this client (41); killing...
Код: Выделить всё
# Linux/macOS
which -a adb
/opt/platform-tools/adb
/home/user/Android/Sdk/platform-tools/adb
# Windows
where adb
C:\platform-tools\adb.exe
C:\Android\sdk\platform-tools\adb.exe
Шаг 3, выяснить, кто занял порт 5037:
Код: Выделить всё
# Linux/macOS
lsof -i :5037
# Windows
netstat -ano | findstr 5037
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 9120
tasklist | findstr 9120
Код: Выделить всё
export ANDROID_ADB_SERVER_PORT=5038
adb start-server
Код: Выделить всё
sdkmanager "platform-tools"
Драйверы, USB-порты и конкурирующие сервисы:
Windows, единственная платформа, где adb нужен драйвер. Здоровое устройство видно в диспетчере устройств как "Android Composite ADB Interface" (иногда с префиксом вендора). Жёлтый треугольник или "Неизвестное устройство" значит, что драйвера нет или встал не тот. Для Pixel и большинства китайских брендов подходит Google USB Driver, ставится через SDK Manager или вручную через "Обновить драйвер" с указанием папки usb_driver. Samsung требует свой драйвер, он приезжает вместе со Smart Switch.
Порты и кабели. Передние порты корпуса ПК, хабы в мониторах и дешёвые разветвители дают именно offline и обрывы посреди adb push больших файлов. Втыкайте в порт на материнской плате, со старыми устройствами иногда помогает уход с USB 3.x на USB 2.0.
Конкурирующие сервисы, классика жанра. HTC Sync Manager и Samsung Kies (сегодня его роль играет Smart Switch) держат собственный adb-сервер или монопольно захватывают USB-интерфейс телефона. Симптомы: их софт устройство видит, а adb devices пуст, либо ваш сервер регулярно умирает с version mismatch. Туда же эмуляторы и их обвязка: Nox возит nox_adb.exe, BlueStacks возит HD-Adb.exe, у Genymotion свой комплект. Лечение:
Код: Выделить всё
:: Windows: выгрузить всех претендентов и поднять свой сервер
taskkill /F /IM adb.exe
taskkill /F /IM nox_adb.exe
taskkill /F /IM HD-Adb.exe
adb start-server
Финальный чек-лист:
Код: Выделить всё
adb version # версия клиента и путь к бинарю
adb kill-server && adb devices # чистый перезапуск сервера
adb devices -l # состояние: device/offline/unauthorized
which -a adb # нет ли второго adb в PATH
ADB_TRACE=all adb server nodaemon # когда непонятно, читаем трассировку