Enable USB debugging on the device
This is done in Settings › Development. If you don't have that entry in your settings menu, go to Settings › About, scroll to the "Build number", and hammer it like a monkey until your device congratulates you having become a developer. Go back to the main page of the Settings menu, and close to the bottom you should see the "Development" (or "Developers") settings now. Enter it, and enable USB Debugging here.
Identify the device
First we need to know how the device identifies on the USB bus. For that, with the Android device NOT connected, grab a shell and run the command lsusb
. Then connect the device and run the command again. Spot the new line. For the Wileyfox Swift this is a "nameless device":
Bus 004 Device 003: ID 2970:2282
Setting up the rules for ADB
We now need the numbers at the end of the above line: 2970:2282
. These specify the vendor (2970) and the device itself (2282). Having those details, we need a root shell on our Linux machine to edit (or create, if it doesn't yet exist) the /etc/udev/rules.d/51-android.rules
file. In there, add a line for your device. Following example line shows how it looks for the Wileyfox Swift:¹
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2970", ATTRS{idProduct}=="2282", MODE="0666", GROUP="androiddev", SYMLINK+="android%n"
If you have a different device, replace the vendor and product IDs with what you've found above when running lsusb
. A short explanation of the line:
SUBSYSTEMS=="usb"
: obviously this rule is for USB only ;)
ATTRS{idVendor}=="2970"
: the vendor ID of the device this rule is for
ATTRS{idProduct}=="2282"
: the device ID
MODE="0666"
: permissions the device node shall get. 0666
is quite lax, giving every user on your system read and write permission – so if you're concerned, you might try replacing that with a 0660
(giving only owner and group read-write, and deny everything to others).
GROUP="androiddev"
: which group the device node should belong to. This should be a group the users intended to work with the device belong to.
SYMLINK+="android%n"
: just to give the node a nice name, so you can find it easier in /dev
(in my case, it later showed up there as /dev/android5
)
That rule entered in /etc/udev/rules.d/51-android.rules
, we must tell udev
to make use of it. Safest way (next to a reboot ;) is restarting the udev
service. Depending on your Linux distro, this can be done either via sudo service udev restart
or sudo /etc/init.d/udev restart
.
Done that, leave the root shell. Disconnect and reconnect your Android device, try adb devices
again. Most devices showed up now, but not the Wileyfox Swift – which obviously wants some extra cuddles. If you're in that situation, open (or create if it doesn't exist) the file ~/.android/adb_usb.ini
and add a single line to it, naming the vendor you've found out with lsusb
above; for the Swift that would be 0x2970
(yupp, here you need to prefix it by 0x
to point out it's a hexadecimal number). Then restart the ADB server: adb kill-server && adb start-server
. Disconnect and reconnect the device again. Now adb devices
should see it.
Connecting the device
You might have noticed adb devices
told you something like 0123456789ABCDEF unauthorized
. That's OK and for your (devices) safety: your computer must be authorized first to be able to access the device. So simply issue adb shell
now – which will be quit with an error: device unauthorized. Please check the confirmation dialog on your device.
Follow that advice (optionally mark the check-box to permanently authorize your computer), and you're done: Now you can use adb to access your device.
Updates:
¹ Note that in later Linux versions, syntax for the UDEV rules has slightly changed, as e.g. jcomeau_ictx pointed out in his comment. For the values we found above that would be:
SUBSYSTEM=="usb", ATTR{idVendor}=="2970", ATTR{idProduct}=="2282", MODE="0666", GROUP="plugdev", SYMLINK+="android%n"
Two differences: it's now SUBSYSTEM
(no plural), and the group has changed from androiddev
to plugdev
(the former does not exist on recent systems, the latter does and usually is assigned at least to the first user).
Additionally, you might need to add the vendorID to your ~/.android/adb_usb.ini
(one ID per line, in hex notation):
# ANDROID 3RD PARTY USB VENDOR ID LIST
# 1 USB VENDOR ID PER LINE.
0x2970
ANDROID 3RD PARTY USB VENDOR ID LIST -- DO NOT EDIT.
USE 'android update adb' TO GENERATE.
1 USB VENDOR ID PER LINE.
0x0e8d`
I had to ignore the advice to run
– jcomeau_ictx May 15 '17 at 02:29android update adb
and enter it manually as you stated.plugdev
instead ofandroiddev
). Not verified, but I'd say the important part here is that it's a group your user (which you want to use USB with) has as well. – Izzy May 15 '17 at 06:17SUBSYSTEM
instead ofSUBSYSTEMS
,ATTR
instead ofATTRS
, comma afterMODE="0666"
not sure if all those changes were necessary, but that's what worked.
– jcomeau_ictx May 15 '17 at 07:22sudo wget -O /etc/udev/rules.d/51-android.rules
from here worked for me for my Xiaomi Mi A1 . Of course it's better to learn but good to be lazy :) – beeshyams Aug 25 '18 at 11:02udevadm
(see https://unix.stackexchange.com/questions/39370/how-to-reload-udev-rules-without-reboot). – Skippy le Grand Gourou Sep 06 '18 at 12:41lsusb
, then replugging in the USB and runninglsusb
again showed no difference. But maybe that's because I'm using USB C ports? – Jul 29 '19 at 08:49ATTR{idVendor}=="2970"
in51-android.rules
and then another rule in99-bad.rules
targeting the same vendor id, the latter may make the former ineffective. Something to look out for. – Andy Sep 17 '19 at 22:01plugdev
, NOTandroiddev
, as previously mentioned. Not sure if it's related to Android or Linux Mint – beeshyams May 27 '21 at 08:59