191

我在调试模式下将 HTC Wildfire A3333 与我的 Fedora Linux 17 连接时遇到问题。Adb 说:

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

我的 udev 规则(三星的第一条规则可以正常工作,而 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"

对于三星设备一切正常:

 ./adb devices
List of devices attached 
00198a9422618e  device

我一直在尝试类似线程中给出的所有答案,但没有任何运气:Using HTC wildfire for android development

4

20 回答 20

368

我自己在 Debian Wheezy 下遇到了这个问题。我用 sudo 重新启动了 adb 守护进程:

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

一切正常:)

于 2013-02-23T17:41:24.407 回答
107

该问题的原因与系统权限有关(感谢@IsaacCisneros 的此建议)。不知何故,HTC Wildfire(也许还有其他人)需要的系统比三星设备更多。简单的解决方案是以 root 身份运行 Eclipse,但这对于像 Fedora 这样的非 sudo Linux 系统来说不是很舒服。

我找到了实现相同目标的另一种方法,这似乎对用户更友好,并且比以超级用户权限运行整个 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

之后,您将能够以 root 身份运行 adb,尽管您将使用您的普通用户帐户。您可以以普通用户身份运行 Eclipse,您的 HTC 应该会被正确发现。

./adb devices 
List of devices attached 
HT0BPPY15230    device 
于 2013-01-23T11:36:48.790 回答
95

我有一个类似的问题:

$ 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. 

这显示我的三星 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"线条。另请注意,这不适用于其他设备 ID:

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

(不返回任何内容)

修复它

好的。那么解决方法是什么?

添加规则

创建一个/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
于 2013-10-10T09:28:57.307 回答
37

您的 udev 规则似乎是错误的。我使用了它并且它有效:

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

ATTR而不是SYSFS

于 2013-08-03T12:48:18.597 回答
26

在 ubuntu 12.04 下,eclipse juno。我面临同样的问题。这是我在易宇博客上找到的

解决方法与 Leon 相同

sudo -s
adb kill-server
adb start-server
adb devices
于 2013-03-10T05:44:18.120 回答
25

从手机更改 USB 模式对我有用。(我将其设置为文件传输)

于 2017-08-12T02:59:49.623 回答
24

Stephan 的回答有效(使用 sudo adb kill-server),但它是暂时的。每次重新启动后都必须重新发布。

对于永久解决方案,必须修改 udev 配置:

Witrant 的回答是正确的想法(从官方 Android 文档中复制)。但这只是一个模板。如果这不适用于您的设备,您需要为您的设备填写正确的设备 ID。

lsusb

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

在列表中找到您的安卓设备。

然后将ID的前半部分(4位数字)用于idVendor(后半部分是idProduct,但没有必要让adb工作)。

sudo vi /etc/udev/rules.d/51-android.rules并为每个唯一的 idVendor 添加一条规则:

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

就是这么简单。您不需要某些答案中给出的所有其他字段。保存文件。

然后重新启动。更改是永久性的。(如果您不想重新启动,Roger 展示了一种重新启动 udev 的方法)。

于 2013-11-19T20:54:07.863 回答
22

...到目前为止,OP自己的答案是错误的,即没有“特殊系统权限”。– “无权限”问题归结为......没有权限。

不幸的是,调试起来并不容易,因为 adb 将它试图访问的设备保密!在 Linux 上,它会尝试打开手机的“USB 串口转换器”设备,例如 /dev/bus/usb/001/115(您的总线号和设备地址会有所不同)。这有时是从 /dev/android_adb 链接和使用的。

lsusb将有助于查找总线号和设备地址。请注意,如果您重新插入,设备地址肯定会发生变化,如果端口对使用哪种速度感到困惑(例如,一个物理端口最终位于一个逻辑总线或另一个逻辑总线上),总线编号也会发生变化。

lsusb-line 看起来类似于: Bus 001 Device 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 有一个固定的供应商 ID 列表。这个列表可以从 ~/.android/adb_usb.ini 扩展,它应该包含 0x4321(如果我们按照上面的示例 lsusb 行)。– 这里不需要,因为如果供应商 ID 未知,您甚至不会获得“无权限”。

于 2013-06-03T17:46:18.240 回答
8

我将把这篇后记放在顶部,这样它就不会在我之前的解释中丢失。

我可以通过简单地将 USB 连接类型从相机 (PTP) 更改为媒体设备 (MTP) 来可靠地产生和解决无权限问题。相机模式允许调试;媒体模式导致 ADB 中的无权限响应。

在思考了片刻之后,推理似乎很明显。调试器可以在媒体服务器模式下访问设备上的不安全内容。

===========

在您接受被调试设备上的 RSA 加密警告之前,该设备是未经许可的。在连接后的某个时刻,设备会要求接受调试连接。这是一个最低限度的安全协议,可确保您可以在初始刷卡锁定之外访问设备。我相信需要启用开发人员模式。

“无权限”标志实际上是 adb 将设备识别为有效调试目标的良好第一个指标。请注意,它没有列出您的其他 USB 设备。

以下和相关页面的详细信息。

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

于 2013-04-12T04:24:48.883 回答
8

在 6 月 4 日升级到 4.2.2 stock rom 后 Pipo S1S 出现同样的问题。

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

上述所有建议虽然对识别您的 USB 设备有效,但不能为我解决问题。(在 Mint 15 上运行的 Android Debug Bridge 版本 1.0.31。)

更新 android 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
于 2014-01-09T17:51:10.833 回答
4

有同样的问题。这是 udev 规则的问题。尝试了上面提到的一些规则,但没有解决问题。在这里找到了一组规则,https://github.com/M0Rf30/android-udev-rules。按照那里的指南,瞧,修好了。

于 2017-07-18T04:45:12.047 回答
3

我今天遇到了同样的问题。

我遵循了官方的说明,但我没有注意到我应该运行命令
“chmod a+r /etc/udev/rules.d/51-android.rules”

在我将此文件设置为全球可读并重新插入我的 USB 电缆后,状态变为未经授权。然后只需授予权限,一切都会好起来的。

于 2015-11-28T15:36:15.363 回答
2

我同意Robert SiemerMichaël Witrant的观点。如果它不起作用,请尝试调试strace

strace adb devices

在我的情况下,它有助于杀死所有实例并删除套接字文件/tmp/ADB_PORT(默认为/tmp/5037)。

于 2014-05-22T12:07:06.743 回答
1

此问题的另一个可能来源是 USB 网络共享。如果您使用过 USB 网络共享,请将其关闭,然后从 USB 中拔下设备,重新插入,然后执行

adb kill-server
adb devices

这在我的案例中起到了作用(Ubuntu 12.04,Nexus S,在 home dir 中的 SDK,从来不需要 root 来让它运行)。不过,根据您的设备,您可能需要以adb devicesroot 身份运行。

于 2013-09-24T12:05:38.767 回答
1

尝试“android update adb”命令。它可以帮助我使用三星银河设备。

于 2014-01-15T13:59:35.360 回答
1

的输出ls -al /usr/bin/adb应该显示它由 userroot和 group拥有root。您可以使用 Linux ACL(访问控制列表)为您的本地用户授予adb以下权限:

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

这比设置 SUID 位更可取,/usr/bin/adb并且还将可以使用的用户限制adbuserNameroot

于 2015-07-16T06:24:56.790 回答
0

答案在这里的各种帖子中交织在一起,我会尽力而为,但这看起来是一个非常简单而明显的原因。

1)是在 udev 规则中通常有一个“用户”变量,比如 USER="your_user" 可能就在 GROUP="plugdev" 之后

2) 您需要为您的设备使用正确的 SYSFS{idVendor}==”####″ 和 SYSFS{idProduct}=="####" 值。如果您拥有来自多个制造商的设备,例如来自三星的设备和来自 HTC 的设备,那么您需要为每个供应商设置一个条目(规则),而不是每个设备的条目,而是您将使用的每个不同供应商的条目,所以您需要 HTC 和三星的条目。看起来你已经进入三星,现在你需要另一个。记住 USER="your_user"。像 Robert Seimer 建议的那样使用“lsusb”来查找 idVendor 和 idProduct,它们通常是这种格式的数字和字母 X#X#:#X#XI 认为第一个是 idVendor 和第二个 idProduct 但你需要为您拥有的每个品牌的手机/平板电脑执行此操作。

3)我还没有弄清楚 51-adb.rules 和 99-adb.rules 有何不同或为什么。

4)也许尝试使用“usermod -a -G plugdev your_user”将“plugdev”组添加到您的用户,尝试自行承担风险,虽然我认为它不会比以root身份启动gui更有风险,但我相信如果有必要你至少应该改用“gksudo eclipse”。

我希望这有助于澄清一些事情,udev 规则语法对我来说也有点神秘,但据我所知,不同的系统可能会有所不同,所以尝试一些东西,一次吃一个,并注意哪些改变有效.

于 2013-11-09T04:59:35.443 回答
0
  1. 关闭 running adb,可能正在关闭正在运行的 android-studio。

  2. 列出设备,

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

于 2014-07-27T17:46:46.663 回答
-1

在 THL W100 上,以 root 身份运行设备(如上所述)只能在启用网络共享的情况下工作(为此我使用了 AirDroid)。

于 2013-12-07T15:52:45.010 回答
-1

我遇到了同样的情况,三台设备连接到同一台主机,但只有一台“无权限”,其他设备在线。

在 adb 上添加 SUID 或 SGID 对我来说是另一个问题。每次 adb 重新启动时都会看到设备脱机 - 直到您每次都在设备上确认。

我通过为设备文件添加“o+w”权限解决了这个“无权限”问题。

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

于 2015-04-24T05:05:51.160 回答