Как мне обнаружить мое устройство с помощью ADB в Linux?

Я только что получил свой блестящий новый Wileyfox Swift — и перед тем, как использовать его, я хочу его oem unlockи рутировать (как я обычно делаю с новыми устройствами;) Проблема в том, что на устройстве включена /etc/udev/rules.d/51-android.rules , и соответствующая строка существует , устройство не видно adb devices.

Я знаю, что на этом сайте разбросано несколько ответов, но их либо трудно найти, либо они охватывают конкретное устройство, либо не охватывают все шаги, которые мне, наконец, понадобились. Поэтому я использую это как шанс для канонического, независимого от устройства вопроса и даю на него подробный ответ ниже:

Как я могу сделать так, чтобы мое Android-устройство было видно и использовалось adbв Linux?

Ответы (3)

Включить отладку по USB на устройстве

Делается это в Настройки › Разработка . Если у вас нет этой записи в меню настроек, перейдите в « Настройки»> «О программе», прокрутите до «Номер сборки» и вбивайте его, как обезьяна, пока ваше устройство не поздравит вас со тем, что вы стали разработчиком. Вернитесь на главную страницу меню « Настройки », и внизу вы должны увидеть настройки «Разработка» (или «Разработчики»). Введите его и включите здесь отладку по USB .

Определите устройство

Для начала нам нужно узнать, как устройство идентифицируется на шине USB. Для этого, когда Android-устройство НЕ подключено, возьмите оболочку и выполните команду lsusb. Затем подключите устройство и снова запустите команду. Найдите новую линию. Для Wileyfox Swift это «безымянное устройство»:

Bus 004 Device 003: ID 2970:2282

Настройка правил для ADB

Теперь нам нужны числа в конце вышеуказанной строки: 2970:2282. В них указан производитель (2970) и само устройство (2282). Имея эти детали, нам нужна корневая оболочка на нашем компьютере с Linux для редактирования (или создания, если она еще не существует) /etc/udev/rules.d/51-android.rulesфайла. Там добавьте строку для вашего устройства. В следующей строке примера показано, как это выглядит для Wileyfox Swift:¹

SUBSYSTEMS=="usb", ATTRS{idVendor}=="2970", ATTRS{idProduct}=="2282", MODE="0666", GROUP="androiddev", SYMLINK+="android%n"

Если у вас другое устройство, замените идентификаторы производителя и продукта теми, которые вы нашли выше при запуске lsusb. Краткое пояснение к строке:

  • SUBSYSTEMS=="usb": очевидно, это правило только для USB ;)
  • ATTRS{idVendor}=="2970": идентификатор поставщика устройства, для которого это правило
  • ATTRS{idProduct}=="2282": идентификатор устройства
  • MODE="0666": разрешения, которые должен получить узел устройства. 0666довольно слабый, давая каждому пользователю в вашей системе разрешение на чтение и запись, поэтому, если вы обеспокоены, вы можете попробовать заменить его на 0660(предоставив только владельцу и группе чтение-запись и запретив все другим).
  • GROUP="androiddev": к какой группе должен принадлежать узел устройства. Это должна быть группа, к которой принадлежат пользователи, предназначенные для работы с устройством.
  • SYMLINK+="android%n": просто чтобы дать узлу красивое имя, чтобы его было легче найти в /dev(в моем случае позже оно появилось там как /dev/android5)

Это правило введено в /etc/udev/rules.d/51-android.rules, мы должны сказать udev, чтобы использовать его. Самый безопасный способ (рядом с перезагрузкой ;) - перезапустить udevслужбу. В зависимости от вашего дистрибутива Linux это можно сделать либо через, либо sudo service udev restartчерез sudo /etc/init.d/udev restart.

Сделав это, оставьте корневую оболочку. Отключите и снова подключите устройство Android, повторите попытку adb devices. Теперь появилось большинство устройств, но не Wileyfox Swift , который явно хочет дополнительных объятий. Если вы находитесь в такой ситуации, откройте (или создайте, если он не существует) файл ~/.android/adb_usb.iniи добавьте в него одну строку, назвав поставщика, которого вы узнали lsusbвыше; для Swift это будет 0x2970(да, здесь вам нужно добавить к нему префикс, 0xчтобы указать, что это шестнадцатеричное число). Затем перезапустите сервер ADB: adb kill-server && adb start-server. Отключите и снова подключите устройство. Теперь adb devicesдолжен увидеть это.

Подключение устройства

Вы могли заметить, adb devicesсказал вам что-то вроде 0123456789ABCDEF unauthorized. Это нормально и для вашей (устройства) безопасности: сначала ваш компьютер должен быть авторизован, чтобы иметь доступ к устройству. Так что просто запустите adb shellсейчас — который будет закрыт с помощью error: device unauthorized. Please check the confirmation dialog on your device.Следуйте этому совету (при желании установите флажок, чтобы навсегда авторизовать свой компьютер), и все готово: теперь вы можете использовать для доступа к вашему устройству.


Обновления:

¹ Обратите внимание, что в более поздних версиях Linux синтаксис правил UDEV немного изменился, как, например , указал jcomeau_ictx в своем комментарии. Для значений, которые мы нашли выше, это будет:

SUBSYSTEM=="usb", ATTR{idVendor}=="2970", ATTR{idProduct}=="2282", MODE="0666", GROUP="plugdev", SYMLINK+="android%n"

Два отличия: теперь SUBSYSTEM(без множественного числа) и группа изменилась с androiddevна plugdev(первого нет в последних системах, второго нет и обычно назначается как минимум первому пользователю).

Кроме того, вам может потребоваться добавить идентификатор поставщика к вашему ~/.android/adb_usb.ini(по одному идентификатору в строке в шестнадцатеричном представлении):

# ANDROID 3RD PARTY USB VENDOR ID LIST
# 1 USB VENDOR ID PER LINE.
0x2970
формат правила udev в моей системе Jessie был другим: jcomeau@aspire:~$ tail -n 1 /etc/udev/rules.d/99-android.rules SUBSYSTEM=="usb", ATTR{idVendor}=="0e8d", ATTR{idProduct}=="201d", MODE="0666", GROUP="plugdev", SYMLINK+="android%n" jcomeau@aspire:~$ cat ~/.android/adb_usb.ini # ANDROID 3RD PARTY USB VENDOR ID LIST -- DO NOT EDIT. # USE 'android update adb' TO GENERATE. # 1 USB VENDOR ID PER LINE. 0x0e8dмне пришлось проигнорировать совет запустить android update adbи ввести его вручную, как вы сказали.
@jcomeau_ictx спасибо за отзыв! Насколько я вижу из вашего комментария, он просто использует другую группу пользователей ( plugdevвместо androiddev). Не проверено, но я бы сказал, что важной частью здесь является то, что это группа вашего пользователя (с которой вы хотите использовать USB).
также SUBSYSTEMвместо SUBSYSTEMS, ATTRвместо ATTRS, запятая после MODE="0666"не уверен, что все эти изменения были необходимы, но это то, что сработало.
О, спасибо, пропустил эти маленькие, @jcomeau_ictx - хорошая мысль!
Для Linux неопытные люди работали sudo wget -O /etc/udev/rules.d/51-android.rulesу меня над моим Xiaomi Mi A1 . Конечно, лучше учиться, но хорошо быть ленивым :)
В некоторых дистрибутивах вы перезапускаете udev с помощью udevadm(см. unix.stackexchange.com/questions/39370/… ).
Отключение USB, запуск lsusb, затем повторное подключение USB и повторный запуск lsusbне показали никакой разницы. Но, может быть, это потому, что я использую порты USB C?
Отличный ответ. Следует добавить одну вещь: правила udev более высокого уровня, нацеленные на одного и того же поставщика, могут переопределять / конфликтовать с правилами более низкого уровня. Поэтому, если у вас есть правило, нацеленное ATTR{idVendor}=="2970"на , 51-android.rulesа затем другое правило 99-bad.rules, нацеленное на тот же идентификатор поставщика, последнее может сделать первое неэффективным. Есть на что обратить внимание.
@Энди, я так глубоко не копался в udev. И поскольку это не ограничивается правилами Android, это может сделать вопрос более подходящим для Unix и Linux, не так ли?
В Android 11 я вижу группу правил как plugdev, а НЕ androiddev, как упоминалось ранее. Не уверен, связано ли это с Android или Linux Mint.
@beeshyams, вы видели, что это уже упоминается в обновлении? И это не имеет ничего общего с Android, так как это часть Linux. Даже не с Android-11, а с «Linux-версией» — вы видите, что обновление уже было сделано в 10/2017, когда даже Android-10 не было выпущено ;)
Stackexchange должен быть как Reddit. Я хотел отдать 50 баллов своего кредита напрямую, чтобы проголосовать / присудить этот ответ. Я потерял дни с этой проблемой в Интернете, ища и внедряя так много вуду, которые вы видите вокруг. +50, почему это невозможно?
Спасибо @JoãoPimentelFerreira — рад, что смог помочь! К сожалению, даже модератор не имеет влияния на "минимальную сумму" баунти-кредитов. И я согласен, что 100 как минимум многовато, особенно если у человека не так много кредитов. 50 было бы хорошим числом. Может, на Meta.SE есть соответствующий вопрос с аргументацией или даже просьбой подкорректировать…
@JoãoPimentelFerreira странно, согласно этому ответу , вы должны иметь возможность назначить награду не менее 50 повторений. Я могу вернуть вашу награду, если вы хотите попробовать еще раз.

Несколько комментариев от нового дистрибутива Linux. Fedora 29 с телефоном Nexus 5X или Nokia 7.1 (Android One).

Сначала отключите телефон, если он уже подключен.

  1. Установите инструменты Android, которые будут поставлять ADB ( sudo dnf install android-tools)
  2. Скопировать правила udev ( sudo cp /usr/share/doc/android-tools/51-android.rules /etc/udev/rules.d)
  3. Перезагрузить правила udev ( sudo udevadm control --reload-rules)
  4. Перезапустите ADB, чтобы убедиться ( sudo systemctl restart adb)

Теперь подключите телефон и запустите adb devicesиз командной строки. Вы, вероятно, увидите устройство в списке с «нет разрешений». Это хорошо.
ЕСЛИ его нет в списке, вам придется добавить свое устройство в файл правил udev, но для меня протестированные устройства просто работали с предопределенными правилами.

Запустите adb shellи, надеюсь, вы получите уведомление о безопасности на телефоне с вопросом, хотите ли вы доверять компьютеру, выберите «да».
ЕСЛИ вместо этого ваш компьютер говорит «ошибка: недостаточно прав для устройства», вам нужно убедиться, что на телефоне вы установили свой USB-порт в режим «Передача файлов», а не «Зарядить это устройство». В Android 8.1 это находится в настройках в разделе «Подключенные устройства» > «USB».

Я заметил, что даже если у вас сегодня все работает, то завтра оно может внезапно сломаться без видимой причины. Если это произойдет, сначала проверьте настройку USB-порта на устройстве, которое могло вернуться в режим зарядки, и, если это не удается, отмените авторизацию USB-отладки на устройстве (в настройках в разделе «Параметры разработчика»), и вы, надеюсь, должны получить всплывающее окно. снова вверх, когда вы бежите adb shell.

Благодаря этому я могу запускать Android Studio и работать на подключенном устройстве.

Я играл с обнюхиванием USB-пакетов с помощью Wireshark и использовал этот modprobe usbmonмодуль. Когда этот модуль загружен, adb больше не работает. В этом случае rmmod usbmonи adb kill-serverпомогает.