How do I get my device detected by ADB on Linux?


Question

I just got my shiny new Wileyfox Swift – and before putting it to use I want to oem unlock and root it (as I usually do with new devices ;) Trouble is, though is enabled on the device, and a corresponding line in /etc/udev/rules.d/51-android.rules exists, the device is not seen by adb devices.



I know there are several answers scattered around this site, but they are either hard to find, just cover a specific device, or don't cover all steps I finally needed. So I take this as a chance for a canonical, device-independent question and give it a detailed answer below:



How can I get my Android device seen and used by adb on Linux?


Answer

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

Topics


2D Engines   3D Engines   9-Patch   Action Bars   Activities   ADB   Advertisements   Analytics   Animations   ANR   AOP   API   APK   APT   Architecture   Audio   Autocomplete   Background Processing   Backward Compatibility   Badges   Bar Codes   Benchmarking   Bitmaps   Bluetooth   Blur Effects   Bread Crumbs   BRMS   Browser Extensions   Build Systems   Bundles   Buttons   Caching   Camera   Canvas   Cards   Carousels   Changelog   Checkboxes   Cloud Storages   Color Analysis   Color Pickers   Colors   Comet/Push   Compass Sensors   Conferences   Content Providers   Continuous Integration   Crash Reports   Credit Cards   Credits   CSV   Curl/Flip   Data Binding   Data Generators   Data Structures   Database   Database Browsers   Date &   Debugging   Decompilers   Deep Links   Dependency Injections   Design   Design Patterns   Dex   Dialogs   Distributed Computing   Distribution Platforms   Download Managers   Drawables   Emoji   Emulators   EPUB   Equalizers &   Event Buses   Exception Handling   Face Recognition   Feedback &   File System   File/Directory   Fingerprint   Floating Action   Fonts   Forms   Fragments   FRP   FSM   Functional Programming   Gamepads   Games   Geocaching   Gestures   GIF   Glow Pad   Gradle Plugins   Graphics   Grid Views   Highlighting   HTML   HTTP Mocking   Icons   IDE   IDE Plugins   Image Croppers   Image Loaders   Image Pickers   Image Processing   Image Views   Instrumentation   Intents   Job Schedulers   JSON   Keyboard   Kotlin   Layouts   Library Demos   List View   List Views   Localization   Location   Lock Patterns   Logcat   Logging   Mails   Maps   Markdown   Mathematics   Maven Plugins   MBaaS   Media   Menus   Messaging   MIME   Mobile Web   Native Image   Navigation   NDK   Networking   NFC   NoSQL   Number Pickers   OAuth   Object Mocking   OCR Engines   OpenGL   ORM   Other Pickers   Parallax List   Parcelables   Particle Systems   Password Inputs   PDF   Permissions   Physics Engines   Platforms   Plugin Frameworks   Preferences   Progress Indicators   ProGuard   Properties   Protocol Buffer   Pull To   Purchases   Push/Pull   QR Codes   Quick Return   Radio Buttons   Range Bars   Ratings   Recycler Views   Resources   REST   Ripple Effects   RSS   Screenshots   Scripting   Scroll Views   SDK   Search Inputs   Security   Sensors   Services   Showcase Views   Signatures   Sliding Panels   Snackbars   SOAP   Social Networks   Spannable   Spinners   Splash Screens   SSH   Static Analysis   Status Bars   Styling   SVG   System   Tags   Task Managers   TDD &   Template Engines   Testing   Testing Tools   Text Formatting   Text Views   Text Watchers   Text-to   Toasts   Toolkits For   Tools   Tooltips   Trainings   TV   Twitter   Updaters   USB   User Stories   Utils   Validation   Video   View Adapters   View Pagers   Views   Watch Face   Wearable Data   Wearables   Weather   Web Tools   Web Views   WebRTC   WebSockets   Wheel Widgets   Wi-Fi   Widgets   Windows   Wizards   XML   XMPP   YAML   ZIP Codes