i have just done the necessary setup to do some Android development on my Fedora 12 machine using Eclipse (Galileo) and the Android SDK. As i have a HTC Dream (or G1) with me, i also wanted to deploy and test directly on the phone itself instead of using an emulator.

However, things didn’t go very smoothly when trying to connect to the phone through ADB.

What i had done to that point was:

1. Created a simple Hello World Android application.

2. Turned on the USB Debugging option on the phone (Menu > Settings > Applications > Development > USB Debugging).

3. Connected the phone to the PC (there was an acknowledgement there on the phone in the form of a notification: USB debugging connected – A computer is connected to your phone).

However, when i tried to run the application, the Android Device Chooser (i had set the Deployment Target Selection Mode to Manual) showed this:

And of course, i couldn’t run the application even after selecting the “unknown” target.

Doing a adb devices on the command line also showed a problem:

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

It turned out that this was quite a common problem (at least for those developing in Linux), and quite a number of pages (references at the end of article) were devoted to solving (or actually, working around) it. Broadly, there were three different workarounds (or rather, attempts).

1. Ensure that the phone device was added with world writable and readable permissions.

Create the new file /etc/udev/rules.d/50-android.rules containing the line

SUBSYSTEMS==”usb”, ATTRS{idVendor}==”0bb4″, MODE=”0666″

Reload the rules by doing

# udevadm control –reload-rules

Thereafter, when the phone is plugged in, the corresponding devices in /dev would have the rw-rw-rw- permission.

However, this did not work. i do not know why, but from some trial and error, it seemed like it was necessary for the ADB server process and the phone devices to be owned by the same user. This led to the other two workarounds.

2. Start the ADB server as root.

Simply, kill the existing ADB server process

# ./adb kill-server

and start it up as root

# ./adb start-server

i’m not too keen on this though, as i try and avoid starting any process as root.

3. Connect the phone device as the non-root user who starts the ADB server process.

The steps are similar to the first (unsuccessful) workaround, with the content of the /etc/udev/rules.d/50-android.rules file slightly different

SUBSYSTEMS==”usb”, ATTRS{idVendor}==”0bb4″, OWNER=”user

where user is the user who starts the ADB server process.

This is still not completely satisfactory though. If another user were to use the same machine, he/she would face the same issue. (At this point, you may be thinking about groups. i’ve tested it, and no, having the user who starts the ADB server process to be a member of the disk group (the group that owns the phone device) still is insufficient.) However, i’m running a single-user system, so this workaround was still acceptable.

Notes:
The ATTRS{idVendor}==”0bb4″ works for my HTC Dream. If you have a different Android device, you may need a different vendor ID. i’m not too sure about this.

References:
http://www.2linessoftware.com/2009/01/31/getting-android-sdk-to-work-with-fedora-10/
http://forum.xda-developers.com/showthread.php?t=561270
http://www.manvstech.com/2009/12/06/android-sdk-i386-on-64-bit-system-cannot-open-shared-object-file-issue/
http://androidforums.com/support/3534-problems-mounting-communicating-g1-ubuntu.html
http://www.mail-archive.com/android-discuss@googlegroups.com/msg14523.html

HTH.