26

我有一个 HTC Desire,我想在它上面调试和运行我的 Android 应用程序。但是当我在 Eclipse 中获得可以在设备之间进行选择的窗口时,我的 HTC Desire 仅列出了问号(??????????)。我究竟做错了什么?

我试过这个:

在我的设备上启用 USB 调试并在我的应用程序 Manifest.xml 文件中启用调试。

在终端我这样做:

  1. 以 root 身份登录并创建此文件:/etc/udev/rules.d/51-android.rules。
  2. SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", MODE="0666"
  3. sudo 服务 udev 重启

我还能尝试或忘记什么?

4

6 回答 6

49

您需要使用 sudo 手动运行 adb。如果您只是在没有 sudo 的情况下运行 adb(或者如果您让 Eclipse/ADT 为您执行此操作),它将没有查看您的设备所需的权限。

如果它已经在运行,那么 sudo adb kill-server 和 sudo adb start-server。

于 2010-06-28T03:28:23.487 回答
47

注意:EboMike 接受的答案是错误的。

我知道这是一个旧问题线程,但我偶然发现它试图解决同样的问题。然而,接受的答案是不正确的。一旦正确设置了 udev 规则,就不需要以 root 身份运行 adb 服务器。

http://developer.android.com/tools/device.html中的第 3 步为您提供了正确的分辨率。具体来说,使用以下行添加或修改 /etc/udev/rules.d/51-android.rules:

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

在这种情况下,0bb4 是 HTC 的供应商 ID。0fff 是 Nexus One 的产品 ID。使用上面链接中的表格或 lsusb 来识别您设备的供应商 ID 和产品 ID。例如

$ lsusb
Bus 001 Device 006: ID 18d1:4e22 Google Inc. Nexus S (debug)

18d1 是此特定设备的供应商 ID,4e22 是产品 ID。如果您想允许所有用户访问此设备,您可以省略“GROUP”定义。如果没有,请务必将自己添加到 plugdev 组(如果您尚未加入)。创建此文件后,重新启动或重新加载 udev。

udevadm control --reload-rules

如果您必须将自己添加到组中,则需要注销并重新登录。

使用“adb kill-server”杀死任何旧的 adb 服务器,插入您的设备并运行“adb devices”。这将重新启动服务器,您现在应该会看到您的设备。不需要以 root 身份运行 adb,即使只是启动 adb 服务器也是如此。除非绝对需要,否则以 root 身份运行通常也是一个坏主意。

于 2013-01-06T19:48:49.823 回答
3

命令中的 device-idadb devices实际上是使用 android usb 设备的序列号。

所以,如果你从序列号中得到一个空字符串,它会显示 ???????????

在 adb 服务器源代码中:

static size_t format_transport(atransport *t, char *buf, size_t bufsize,
                               int long_listing)
{
    const char* serial = t->serial;
    if (!serial || !serial[0])
        serial = "????????????";

因此,可能是您的 adb 服务器没有以 root 权限运行,或者您的 USB 设备不允许 adb 服务器读取。一个简单的检查是使用 lsusb -v | grep iSerial 看看你是否能得到你安卓设备的 iSerial 字段。

此外,设备中的 iSerial 字符串可能没有准备好。我见过很多工程产品根本没有 iSerial,或者所有设备都显示相同的设备 ID。

有时,驱动程序将读取闪存中的一段数据,该数据在设备之间进行唯一编程以使其成为 iSerial/设备 ID。

于 2014-06-18T08:55:04.593 回答
2

通过执行此处所说的操作,我设法让我的“砖块” Nexus S 再次工作。不过,需要添加一点点。

当您执行一个lsusb并且 USB 子系统告诉您连接了哪个 Android 设备时,我的反馈给了我:

$ lsusb
Bus 001 Device 006: ID 18d1:d001 Google Inc.

注意d001而不是任何已知状态,即 4e20、4e21 或 4e22。所以我所做的就是在51-android.rules这个未知状态下专门添加另一行并将其标记为“恢复/调试”。

断开并重新连接 Android。再次检查lsusb以确保它至少被看到。而且...这给了我这个

$ adb devices
List of devices attached
34353601BB2000EC    recovery

而不是这个

$ adb devices -l
List of devices attached 
????????????           no permissions usb:1-3

之后,我只是按照还原出厂图像的方法进行操作。希望能帮助到你。

于 2013-06-23T11:12:32.867 回答
1

这是因为您没有授予 adb 访问硬件的权限。你有两个解决方案:

临时-> 杀死所有现有的 adb 进程并以超级用户重新启动

ps -ef | grep adb | awk '{print $2}' | xargs kill

sudo adb server-restart

或者

sudo <your android SDK path>/platform-tools/adb server-restart

永久-> 将您的设备添加到 udev 列表 将以root 身份添加以下行到您的 /etc/udev/rules.d/51-android.rules 并使用此列表使用正确的idVendor

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

后跟以下命令:

chmod a+r /etc/udev/rules.d/51-android.rules

如果 adb 不起作用,请执行以下操作:

sudo ln -s <your android SDK path>/platform-tools/adb /usr/local/sbin/adb
于 2015-10-25T02:00:51.717 回答
0

确保你安装了 sudo apt-get install android-tools-adb 现在检查 sudo adb 它将显示 adb 的帮助

现在请使用以下命令杀死/启动 adb -

sudo adb kill-server sudo adb start-server

最后,sudo adb devices

希望这会奏效!

于 2015-04-10T11:42:36.610 回答