Ubuntu: Android 设备调试

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 service udev restart

还有什么其他的方法或者我忘记了些什么吗?


当您运行DDMS工具时,这种情况是否也会发生?ddms - Pentium10
打开USB调试后,运行“dmesg”命令会输出什么(最后几行)? - adamk
生成/etc/udev/rules.d/51-android.rules文件后,拔下并重新插入设备。 - Macarse
6个回答

49

您需要手动使用sudo运行adb。如果您只是运行adb而没有使用sudo(或者让Eclipse/ADT为您执行),它将没有必要的权限来查看您的设备。

如果它已经在运行,则使用sudo adb kill-server和sudo adb start-server命令。


1
将其作为init进程的一部分 - 这就是我所做的,它像魔法一样运行。创建/etc/init.d/adb,复制其他init作业所做的内容,然后分别调用"adb start-server"和"adb kill-server",并将其链接到正确的rc.d目录中 - 我创建了一个名为/etc/rc.5d/S20adb的链接。 - EboMike
3
我已经使用gnac答案在没有su权限的情况下运行它。被投票否决。 - Sijav
1
@Sivaj 两个答案都是正确的。问题是由于 USB 设备权限引起的。EboMike 建议以 root 用户身份运行 adb,以便它可以访问所需的 USB 设备,而 gnac 则更改设备的权限,使其对非 root 用户也可访问。 - 4aRk Kn1gh7

47

注意:EboMike的采纳答案是错误的。

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

第3步http://developer.android.com/tools/device.html给出了正确的解决方法。 具体而言,请添加或修改/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”。这将重新启动服务器,您现在应该能够看到您的设备。即使只是启动adb服务器,也不需要以root身份运行adb。通常情况下,除非绝对必要,否则不建议以root身份运行任何东西。

1
它就是不能工作,我甚至尝试重新启动了系统。 - Kirill Kulakov
这对我有用。我以为我已经拥有一个可工作的 51-android.rules 配置,但我不小心同时包含了模型 ATTR 和制造商信息。我将其移除了。此外,我不知道重新加载 udev 规则的正确方法。我使用了 udevadm 命令,然后 adb devices 命令正常工作了。 - Nick Coleman
1
是的!这个可以工作,但我的不同 -> SUBSYSTEM=="usb" ATTRS{idVendor}=="0fce", ATTRS{idProduct}=="6182", ENV{ID_GPHOTO2}="1", ENV{GPHOTO2_DRIVER}="proprietary", ENV{ID_MEDIA_PLAYER}="1", MODE="0666", GROUP="plugdev" -> 我有Sony Xperia ZR,请注意plugdev,也别忘了运行sudo service udev restart来重新启动整个USB服务! - Sijav
启用了开发者模式(USB 调试)后,我的手机终于能够工作了。这有点奇怪,自 Android 4.2 开始就是这样。 - 0x0me
1
两个答案都是正确的。问题是由于USB设备权限引起的。EboMike建议以root身份运行adb,以便访问所需的USB设备,而@gnac则更改设备的权限,使其对非root用户也可访问。 - 4aRk Kn1gh7
显示剩余5条评论

3
adb devices命令中的设备ID实际上使用的是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命令来查看是否可以获取到您的Android设备的iSerial字段。
此外,也有可能是设备中的iSerial字符串没有准备好。我见过很多工程产品根本没有iSerial,或所有设备都显示相同的设备ID。
有时,驱动程序会从闪存中读取一段数据,该数据在设备之间被独特地编程为iSerial/设备ID。

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

之后,我只需按照恢复出厂设置镜像的指南进行操作。希望这可以帮到您。


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

permanent -> 将您的设备添加到udev列表中 使用正确的idVendor(参考this list),作为root用户将以下行添加到您的/etc/udev/rules.d/51-android.rules文件中。

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

0

请确保您已安装以下命令:

sudo apt-get install android-tools-adb

现在,请检查以下命令:

sudo adb

它将显示adb的帮助信息。

接下来,请使用以下命令停止/启动adb:

sudo adb kill-server sudo adb start-server

最后,请输入以下命令:

sudo adb devices

希望这样可以解决问题!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接