Устройство Android Debug Bridge (adb) - без прав доступа

У меня проблема с подключением HTC Wildfire A3333 в режиме отладки с помощью моей Fedora Linux 17. Adb говорит:

./adb devices
List of devices attached 
????????????    no permissions

мои правила udev (первое правило для Samsung, которое работает отлично, а второе для HTC - нет):

SUBSYSTEM=="usb",SYSFS{idVendor}=="04e8″,SYMLINK+="android_adb",MODE="0666″,GROUP="plugdev" 
SUBSYSTEM=="usb",SYSFS{idVendor}=="0bb4″,SYMLINK+="android_adb",MODE="0666″,GROUP="plugdev"

Для устройств Samsung все в порядке:

 ./adb devices
List of devices attached 
00198a9422618e  device

Я пробовал все ответы, приведенные в simmilar thread без какой-либо удачи: Использование HTC Wildfire для разработки Android

Ответ 1

Причина этой проблемы связана с системными правами (спасибо @IsaacCisneros за это предложение). Каким-то образом HTC Wildfire (и, возможно, другие) нуждается в чем-то больше от системы, чем устройства Samsung. Простым решением является запуск Eclipse в качестве корня, но это не очень удобно для Linux-систем, отличных от sudo, таких как Fedora.

Я нашел еще один способ достижения той же цели, которая, кажется, более удобна для пользователя и имеет меньшую дыру в системе, а затем запускает всю IDE с привилегиями суперпользователя. Разумеется, это все еще только обход проблемы. Системное использование root должно быть минимальным только для административных задач, а "adb" предназначен для работы с обычной учетной записью пользователя без SUID. Несмотря на то, что правильная настройка SUID достаточно безопасна, каждое увеличение разрешений является потенциальной дырой безопасности системы.

1.Удача права собственности на двоичный файл adb (владелец - root, группа владельца - user_group):

chown root:user_group adb

2.Удаление разрешений с помощью SUID:

chmod 4550 adb

Это должно привести к чему-то подобному (ls -llh):

-r-sr-x---. 1 root user_name 1.2M Jan 8 11:42 adb

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

./adb devices 
List of devices attached 
HT0BPPY15230    device 

Ответ 2

У меня просто была проблема с Debian Wheezy. Я перезапустил демона adb с помощью sudo:

sudo ./adb kill-server
sudo ./adb start-server
sudo ./adb devices

Все работает:)

Ответ 3

У меня есть аналогичная проблема:

$ adb devices
List of devices attached 
4df15d6e02a55f15    device
????????????    no permissions

Исследование

Если я запустил lsusb, я могу видеть, какие устройства я подключил, и где:

$ lsusb
...
Bus 002 Device 050: ID 04e8:6860 Samsung Electronics Co., Ltd GT-I9100 Phone ...
Bus 002 Device 049: ID 18d1:4e42 Google Inc. 

Это показывает мою Samsung Galaxy S3 и подключен мой Nexus 7 (2012).

Проверка прав на них:

$ ls -l /dev/bus/usb/002/{049,050}
crw-rw-r--  1 root root    189, 176 Oct 10 10:09 /dev/bus/usb/002/049
crw-rw-r--+ 1 root plugdev 189, 177 Oct 10 10:12 /dev/bus/usb/002/050

Подождите. Какие? Откуда взялась группа "plugdev"?

$ cd /lib/udev/rules.d/
$ grep -R "6860.*plugdev" .
./40-libgphoto2-2.rules:ATTRS{idVendor}=="0bb4", ATTRS{idProduct}=="6860", \
  ENV{ID_GPHOTO2}="1", ENV{GPHOTO2_DRIVER}="proprietary", \
  ENV{ID_MEDIA_PLAYER}="1", MODE="0664", GROUP="plugdev"
./40-libgphoto2-2.rules:ATTRS{idVendor}=="04e8", ATTRS{idProduct}=="6860", \
  ENV{ID_GPHOTO2}="1", ENV{GPHOTO2_DRIVER}="proprietary", \
  ENV{ID_MEDIA_PLAYER}="1", MODE="0664", GROUP="plugdev"

(Я завернул эти строки)

Обратите внимание на строки GROUP="plugdev". Также обратите внимание, что это не работает для другого идентификатора устройства:

$ grep -Ri "4e42.*plugdev" .

(ничего не возвращается)

Фиксация

OK. Итак, какое исправление?

Добавить правило

Создайте файл /etc/udev/rules.d/99-adb.rules, содержащий следующую строку:

ATTRS{idVendor}=="18d1", ATTRS{idProduct}=="4e42", ENV{ID_GPHOTO2}="1",
  ENV{GPHOTO2_DRIVER}="proprietary", ENV{ID_MEDIA_PLAYER}="1",
  MODE="0664", GROUP="plugdev"

Это должна быть одна строка, я ее обернул для удобочитаемости

Перезагрузка udev

$ sudo udevadm control --reload-rules
$ sudo service udev restart

Что он

Отключите/переустановите устройство.

Попробуйте

$ adb devices
List of devices attached 
4df15d6e02a55f15    device
015d2109ce67fa0c    device

Ответ 4

Правило udev кажется неправильным. Я использовал это, и он работал:

SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666", GROUP="plugdev"

(ATTR вместо SYSFS)

Ответ 5

под ubuntu 12.04, eclipse juno. Я сталкиваюсь с той же проблемой. Это то, что я нашел на Блог Yi Yu

Решение такое же, как Leon

sudo -s
adb kill-server
adb start-server
adb devices

Ответ 6

... собственный ответ OPs неверен до сих пор, что нет "специальных системных разрешений". - Проблема "без разрешения" сводится к... разрешениям.

К сожалению, отладка непросто, потому что adb делает секрет, какое устройство пытается получить доступ! В Linux он пытается открыть устройство "USB-последовательный преобразователь" телефона, например, /dev/bus/usb/ 001/115 (номер вашей шины и адрес устройства будут отличаться). Это иногда связано и используется с /dev/android _adb.

lsusb поможет найти номер шины и адрес устройства. Помните, что адрес устройства изменится, если вы снова подключите его, как и номер шины, если порт запутался в какой скорости использовать (например, один физический порт заканчивается на одной логической шине или другой).

Линия lsusb выглядит примерно так: Bus 001 Устройство 115: ID 4321: fedc bla bla bla

lsusb -v может помочь вам найти устройство, если "bla bla bla" недостаточно для подсказки (иногда он не содержит ни производителя, ни модель телефона).

Как только вы узнаете устройство, проверьте своими глазами, что ls -a /dev/bus/usb/001/115 действительно доступен для данного пользователя! Затем проверьте, что он работает с chmod и исправьте настройку udev.

PS1:/dev/android_adb может указывать только на одно устройство, поэтому убедитесь, что оно делает то, что вы хотите.

PS2: Не связанный с этим вопросом, но менее известный: adb имеет фиксированный список идентификаторов поставщиков, с которыми он проходит. Этот список можно расширить из ~/.android/adb_usb.ini, который должен содержать 0x4321 (если следовать примеру моего примера lsusb line сверху). - Не нужно здесь, так как вы даже не получаете "никаких разрешений", если идентификатор поставщика неизвестен.

Ответ 7

Ответ Stephan (используя sudo adb kill-server), но он временный. Он должен быть переиздан после каждой перезагрузки.

Для постоянного решения необходимо изменить конфигурацию udev:

Ответ Witrant - это правильная идея (скопирована из официальной документации на Android). Но это всего лишь шаблон. Если это не работает для вашего устройства, вам необходимо заполнить правильный идентификатор устройства для вашего устройства.

lsusb

Bus 001 Device 002: ID 05c6:9025 Qualcomm, Inc.
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
...

Найдите ваше устройство Android в списке.

Затем используйте первую половину идентификатора (4 цифры) для idVendor (последняя половина - idProduct, но нет необходимости получать работу adb).

sudo vi /etc/udev/rules.d/51-android.rules и добавьте одно правило для каждого уникального idVendor:

SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", MODE="0666", GROUP="plugdev"

Это так просто. В некоторых ответах вам не нужны все остальные поля. Сохраните файл.

Затем перезагрузитесь. Изменение является постоянным. (Роджер показывает способ перезагрузки udev, если вы не хотите перезагружаться).

Ответ 8

Я добавлю этот постскрипт наверху, чтобы он не потерялся в моем более раннем объяснении.

Я могу надежно создать и разрешить проблему без разрешения, просто изменив тип соединения USB с камеры (PTP) на мультимедийное устройство (MTP). Режим камеры позволяет отлаживать; режим мультимедиа вызывает ответ без разрешения в ADB.

Причины кажутся довольно очевидными после размышления об этом на мгновение. Необеспеченный контент на устройстве станет доступным отладчиком в режиме медиа-сервера.

===========

Устройство не принимается до тех пор, пока вы не примете предупреждение о шине RSA на отладочном устройстве. В какой-то момент после подключения устройство попросит принять отладочное соединение. Это минимальный протокол безопасности, обеспечивающий доступ к устройству за пределами начальной блокировки. Полагаю, что режим разработчика должен быть включен.

Флаг "без разрешений" на самом деле является хорошим первым показателем того, что adb распознает устройство как допустимую цель отладки. Обратите внимание, что он не перечисляет ваши другие USB-устройства.

Подробности на следующих и связанных страницах.

http://developer.android.com/tools/device.html

Ответ 9

Такая же проблема с Pipo S1S после обновления до версии 4.2.2. 4 июня.

$ adb devices
List of devices attached  
????????????    no permissions

Все приведенные выше рекомендации, хотя и действительны для распознавания устройства USB, не решают проблему для меня. (Android Debug Bridge версии 1.0.31 работает на Mint 15.)

Обновление инструментов andddd sdk сбрасывает ~/.android/adb_usb.ini.

Чтобы распознать Pipo VendorID 0x2207, выполните следующие действия.

Добавить в строку /etc/udev/rules.d/51-android.rules

SUBSYSTEM=="usb", ATTR{idVendor}=="0x2207", MODE="0666", GROUP="plugdev"

Добавить строку в ~/.android/adb_usb.ini:

0x2207

Затем удалите файлы adbkey

rm -f ~/.android/adbkey ~/.android/adbkey.pub

и снова подключите свое устройство к восстановлению файлов ключей с правильным подключением adb. Некоторые устройства будут запрашивать повторную авторизацию.

sudo adb kill-server
sudo adb start-server   
adb devices

Ответ 10

Изменение режима USB с телефона сделало трюк для меня. (Я установил его в File Transfer)

Ответ 11

Сегодня я столкнулся с той же проблемой.

Я следил за официальными инструкциями, но я не заметил, что Я ДОЛЖЕН  введите команду "chmod a + r/etc/udev/rules.d/51-android.rules"

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

Ответ 12

Я согласен с Robert Siemer и Michaël Witrant. Если он не работает, попробуйте отладить с помощью strace

strace adb devices

В моем случае это помогает убить все экземпляры и удалить файл сокета /tmp/ADB_PORT (по умолчанию это /tmp/5037).

Ответ 13

Другим возможным источником этой проблемы является USB-модем. Если вы использовали USB-модем, выключите его, затем отключите устройство от USB, подключите его обратно, затем выполните

adb kill-server
adb devices

Это сделало трюк в моем случае (Ubuntu 12.04, Nexus S, SDK в домашнем каталоге, никогда не нуждался в корне, чтобы запустить его). В зависимости от вашего устройства вам может потребоваться запустить adb devices как root.

Ответ 14

Попробуйте команду "adroid update adb". Это помогает мне с галактикой Samsung.

Ответ 15

Вывод ls -al /usr/bin/adb должен показать, что он принадлежит пользователю root и группе root. Вы можете использовать Linux ACL (Списки контроля доступа), чтобы предоставить свои локальные разрешения для пользователя adb следующим образом:

setfacl -m "u:userName:rwx" /usr/bin/adb

Это предпочтительнее устанавливать бит SUID на /usr/bin/adb, а также ограничивать пользователей, которые могут использовать adb для userName и root.

Ответ 16

Ответ сплетен среди различных сообщений здесь, я буду таким лучшим, но это выглядит очень простой и очевидной причиной.

1) заключается в том, что обычно в переменной udev обычно используется "пользовательская" переменная, например, USER = "your_user" сразу после GROUP = "plugdev"

2) Для вашего устройства необходимо использовать правильные значения SYSFS {idVendor} == "####" и SYSFS {idProduct} == "####". Если у вас есть устройства с более чем одно производство, скажем, как у Samsung и у HTC, тогда вам нужно иметь запись (правило) для каждого поставщика, а не запись для каждого устройства, но для каждого другого поставщика, который вы будете использовать, поэтому вам нужна запись для HTC и Samsung, похоже, что у вас есть запись для Samsung, теперь вам нужно другое. Помните USER = "your_user". Используйте "lsusb", например, Роберт Сеймер предлагает найти idVendor и idProduct, обычно это числа и буквы в этом формате X #X #: # X # XI считают, что первым является idVendor и второй idProduct, но вам нужно будет сделать это для каждой марки телефона/планшета, который у вас есть.

3) Я не понял, как 51-adb.rules и 99-adb.rules отличаются или почему.

4), возможно, попробуйте добавить группу "plugdev" к вашему пользователю с помощью "usermod -a -G plugdev your_user". Попробуйте это на свой страх и риск, хотя я не думаю, что это более опасно, чем запуск gui как root, но я верю если необходимо, вы должны хотя бы использовать "gksudo eclipse".

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

Ответ 17

  • Завершить работу adb, может быть закрытие бегущей андроид-студии.

  • список устройств,

/usr/local/android-studio/sdk/platform-tools/adb devices

Ответ 18

Была та же проблема. Это была проблема с правилами udev. Пробовал несколько из упомянутых выше правил, но не исправил проблему. Здесь был найден набор правил, https://github.com/M0Rf30/android-udev-rules. Затем следовали руководство и, вуаля, исправлены.

Ответ 19

В THL W100 запуск устройства с правами root (как описано выше) работал только с включенным подключением модема (для этого я использовал AirDroid).

Ответ 20

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

Добавление SUID или SGID в adb было еще одной проблемой для меня. Устройства, видимые в автономном режиме каждый раз, когда adb перезапускается - пока вы не подтвердите это на устройствах каждый раз.

Я решил эту проблему "без разрешения", добавив разрешение "o + w" для файла устройства.

chmod o + w/dev/bus/usb/00n/xxx