Troubleshooting Android’s ‘adb devices’
I’ve been playing around a bit with Android development lately, and — for the
second time — spent a while trying to work out why adb devices
wasn’t
showing me anything:
$ adb devices
List of devices attached
$
Thanks, adb. I’m pretty sure I’ve got a Dream plugged in there, you know. I
did get it working in the end, so I thought I’d write up some of the
troubleshooting steps so that I’ll have something to refer to the next time I
run into this problem :-)
.
First off, it’s worth mentioned that if you’re on Windows, you apparently need to install some USB drivers first (and it appears that the 32-bit and 64-bit versions aren’t compatible, so you need to pick the right version too). I’m not using Windows, though, so I don’t know a whole lot about this step.
However, life’s not all rosy on Linux: the adb
command scans /dev/bus/usb/
rather than /proc/bus/usb/
(as provided by usbdevfs) or /sys/bus/usb/
(ditto, sysfs). This is absolutely the right thing to do (lsusb
works the
same way), but it means that there’s another step (udev) between the device
detection and being able to use the device.
Evidently some of the default udev rules (possibly only on some
distributions; in particular, on Ubuntu) create device nodes that aren’t
world-readable, meaning that the device node is created, but adb can’t read it.
The easiest way to tell whether you’re having this problem is to kill the adb
daemon and restart it as root
:
$ adb kill-server
$ sudo adb start-server
* daemon not running. starting it now *
* daemon started successfully *
$ adb devices
(The adb daemon appears in ps
as “adb fork-server server
”, by the way.)
I’ve also seen suggestions that you should be able to run sudo adb devices
to
start the server as root, but when I tried that I ended up with a daemon
running as myself again.
If this is your problem, the fix is mentioned on the
setup page I mentioned previously: you create a file called
something like /etc/udev/rules.d/51-android.rules
that contains rules telling
udev to make the device node world-writable when a matching device is found.
The example rule provided in the Developer Guide matches any HTC devices, which
might be a bit wide-ranging: you could presumably restrict the match to just
the device’s id. (The HTC Dream and Magic share the same device id,
0bb4:0c02
, or, strangely, 0bb4:0c01
when booting into HBOOT/fastboot mode.)
Finally, there’s one very important thing that I’d completely forgotten about:
if the devices appears in lsusb
output but adb devices
still shows nothing,
check that the phone is set up to allow debugging via USB
(Settings⇒Applications⇒Development⇒USB debugging). If
this is off, you’ll see nothing… and that was the step I’d forgotten about.
Things went much better after that: I think I might have had to restart the phone once when it was being insistent that there wasn’t a USB connection, but other than that, it’s all happy:
$ adb devices
List of devices attached
HT851N003417 device
$
One more thing: while looking around, I found an issue reported
against the Android project that states that adb
is broken against Linux
kernel versions 2.6.27 and later, with identical symptoms. I’m currently using
2.6.24, so I can’t test it, but it’s worth being aware of.