{"id":1004,"date":"2026-10-30T17:50:23","date_gmt":"2026-10-30T17:50:23","guid":{"rendered":"https:\/\/quickref.me\/blog\/?p=1004"},"modified":"2026-10-30T17:50:23","modified_gmt":"2026-10-30T17:50:23","slug":"managing-multiple-android-devices-over-adb-a-practical-reference","status":"publish","type":"post","link":"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/","title":{"rendered":"Managing multiple Android devices over ADB: a practical reference"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Managing multiple Android devices over ADB comes down to three habits: check what is connected with <\/span><span style=\"font-weight: 400;\">adb devices -l<\/span><span style=\"font-weight: 400;\">, address every command to one device with <\/span><span style=\"font-weight: 400;\">-s &lt;serial&gt;<\/span><span style=\"font-weight: 400;\"> or <\/span><span style=\"font-weight: 400;\">ANDROID_SERIAL<\/span><span style=\"font-weight: 400;\">, and wrap repeated actions in a loop over all serials. This reference collects the commands, flags and fixes for that workflow.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Getting started with ADB<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">ADB (Android Debug Bridge) connects a host to the <\/span><span style=\"font-weight: 400;\">adbd<\/span><span style=\"font-weight: 400;\"> daemon on each device through a local server. Multi-device commands are needed for testing one build on several models, debugging device-specific crashes and batch installs.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Prerequisites:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Platform-Tools installed and on <\/span><span style=\"font-weight: 400;\">PATH<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">USB debugging enabled<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">The host&#8217;s RSA key authorized on the device<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">adb version\u00a0 \u00a0 \u00a0 \u00a0 # client and platform-tools version<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb start-server \u00a0 # start the server on port 5037<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb kill-server\u00a0 \u00a0 # stop it after updates or hangs<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-weight: 400;\">Listing and identifying devices<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">adb devices\u00a0 \u00a0 \u00a0 \u00a0 # serial and state of every device<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb devices -l \u00a0 \u00a0 # adds product, model, device and transport_id<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">The <\/span><span style=\"font-weight: 400;\">-l<\/span><span style=\"font-weight: 400;\"> output helps tell identical phones apart in a long list.<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>State<\/b><\/td>\n<td><b>Meaning<\/b><\/td>\n<td><b>Action<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">device<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Connected and authorized<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Ready for commands<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">unauthorized<\/span><\/td>\n<td><span style=\"font-weight: 400;\">RSA key not accepted<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Unlock the phone and accept the prompt<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">offline<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Connected, but <\/span><span style=\"font-weight: 400;\">adbd<\/span><span style=\"font-weight: 400;\"> not responding<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Replug or restart the server<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">no permissions<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Host can&#8217;t access the USB device (Linux)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Add a udev rule and replug<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">adb -d get-serialno\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # serial of the single USB device<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; shell getprop ro.product.model \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # model name<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; shell getprop ro.build.version.release \u00a0 # Android version<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Model and Android version are useful labels when results from several phones go into one report.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Targeting a specific device<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Target flags go before the subcommand:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s R58M12ABCDE shell \u00a0 \u00a0 # by serial (USB, emulator or ip:port)<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -d install app.apk \u00a0 \u00a0 \u00a0 # the only device on USB<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -e logcat\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # the only emulator or TCP\/IP device<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -t 3 reboot\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # by transport_id from adb devices -l<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">-t<\/span><span style=\"font-weight: 400;\"> helps when two low-cost devices report the same serial, such as <\/span><span style=\"font-weight: 400;\">0123456789ABCDEF<\/span><span style=\"font-weight: 400;\">, because the transport ID is always unique.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For a session or script that works with one device, set the serial once:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">export ANDROID_SERIAL=R58M12ABCDE<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb shell getprop ro.product.model \u00a0 # goes to R58M12ABCDE<\/span><\/p>\n<p><span style=\"font-weight: 400;\">unset ANDROID_SERIAL \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # back to default targeting<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Common error:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb: more than one device\/emulator<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">ADB refuses to guess a target when several devices are attached and none is specified. The error often comes from a forgotten emulator still running. Add <\/span><span style=\"font-weight: 400;\">-s &lt;serial&gt;<\/span><span style=\"font-weight: 400;\">, export <\/span><span style=\"font-weight: 400;\">ANDROID_SERIAL<\/span><span style=\"font-weight: 400;\">, or use <\/span><span style=\"font-weight: 400;\">-d<\/span><span style=\"font-weight: 400;\"> \/ <\/span><span style=\"font-weight: 400;\">-e<\/span><span style=\"font-weight: 400;\"> when only one device of that type is connected. An explicit <\/span><span style=\"font-weight: 400;\">-s<\/span><span style=\"font-weight: 400;\"> overrides <\/span><span style=\"font-weight: 400;\">ANDROID_SERIAL<\/span><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Running commands on all devices<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Loop over every serial in the <\/span><span style=\"font-weight: 400;\">device<\/span><span style=\"font-weight: 400;\"> state:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">for s in $(adb devices | awk &#8216;NR&gt;1 &amp;&amp; $2==&#8221;device&#8221; {print $1}&#8217;); do<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0\u00a0echo &#8220;== <\/span><span style=\"font-weight: 400;\">s&#8221;adb-s&#8221;<\/span><span style=\"font-weight: 400;\">s&#8221; shell getprop ro.product.model<\/span><\/p>\n<p><span style=\"font-weight: 400;\">done<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">awk<\/span><span style=\"font-weight: 400;\"> skips the header line and ignores unauthorized or offline phones.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Run slow jobs in parallel with <\/span><span style=\"font-weight: 400;\">xargs -P<\/span><span style=\"font-weight: 400;\">:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb devices | awk &#8216;NR&gt;1 &amp;&amp; $2==&#8221;device&#8221; {print $1}&#8217; \\<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0\u00a0| xargs -P 4 -I{} adb -s {} install -r app-release.apk<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">-P 4<\/span><span style=\"font-weight: 400;\"> processes four devices at a time; <\/span><span style=\"font-weight: 400;\">-I{}<\/span><span style=\"font-weight: 400;\"> inserts each serial.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Batch jobs for the loop body:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Install a build: <\/span><span style=\"font-weight: 400;\">adb -s &#8220;$s&#8221; install -r app.apk<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Clear app data: <\/span><span style=\"font-weight: 400;\">adb -s &#8220;$s&#8221; shell pm clear com.example.app<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Take a screenshot: <\/span><span style=\"font-weight: 400;\">adb -s &#8220;<\/span><span style=\"font-weight: 400;\">s&#8221;exec-outscreencap-p&gt;&#8221;<\/span><span style=\"font-weight: 400;\">s.png&#8221;<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Pull logs: <\/span><span style=\"font-weight: 400;\">adb -s &#8220;<\/span><span style=\"font-weight: 400;\">s&#8221;logcat-d&gt;&#8221;<\/span><span style=\"font-weight: 400;\">s.log&#8221;<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">With <\/span><span style=\"font-weight: 400;\">xargs<\/span><span style=\"font-weight: 400;\">, wrap redirections in <\/span><span style=\"font-weight: 400;\">sh -c &#8216;&#8230;&#8217;<\/span><span style=\"font-weight: 400;\"> so each device writes its own file.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Wireless and network connections<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">TCP\/IP mode, starting from a USB connection:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; tcpip 5555 \u00a0 \u00a0 \u00a0 \u00a0 # restart adbd listening on TCP 5555<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb connect 192.168.1.42:5555\u00a0 \u00a0 \u00a0 # connect over Wi-Fi<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb disconnect 192.168.1.42:5555 \u00a0 # drop one; plain adb disconnect drops all<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">tcpip<\/span><span style=\"font-weight: 400;\"> mode stays active until the device reboots; after that, USB is needed again.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Android 11+ Wireless debugging needs no cable. Open Developer options \u2192 Wireless debugging \u2192 Pair device with pairing code:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb pair 192.168.1.42:37099\u00a0 \u00a0 \u00a0 \u00a0 # enter the six-digit code<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb connect 192.168.1.42:41235 \u00a0 \u00a0 # port shown on the Wireless debugging screen<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Network serials look like <\/span><span style=\"font-weight: 400;\">192.168.1.42:5555<\/span><span style=\"font-weight: 400;\"> and work with <\/span><span style=\"font-weight: 400;\">-s<\/span><span style=\"font-weight: 400;\"> like any other serial.<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>Method<\/b><\/td>\n<td><b>Speed<\/b><\/td>\n<td><b>Stability<\/b><\/td>\n<td><b>Setup<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">USB<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Fastest, no network overhead<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Most stable<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Cable and driver<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Wi-Fi (<\/span><span style=\"font-weight: 400;\">tcpip<\/span><span style=\"font-weight: 400;\">)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Network-bound<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Lost after reboot<\/span><\/td>\n<td><span style=\"font-weight: 400;\">USB cable once per boot<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Pairing (<\/span><span style=\"font-weight: 400;\">adb pair<\/span><span style=\"font-weight: 400;\">)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Network-bound<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Port changes on reconnect<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Android 11+, one-time pairing<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><span style=\"font-weight: 400;\">Working with devices you don&#8217;t physically have<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Emulators handle basic checks across API levels and appear as emulator-5554, but bugs tied to vendor skins, cameras or chipsets need real hardware. When a bug only reproduces on a model nobody on the team owns, renting a remote <\/span><a href=\"https:\/\/droiddesk.io\/use-cases\/phone-farm\"><b>phone farm<\/b><\/a><span style=\"font-weight: 400;\"> online gives access to real hardware without buying it. Such services keep physical handsets connected and let you control them from a browser, so you can install the build and reproduce the issue on the exact model.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">When a remote host exposes a device&#8217;s ADB port on its localhost, forward it over SSH:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">ssh -N -L 5555:localhost:5555 user@remote-host<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb connect localhost:5555<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Security note: never expose port 5555 to the open internet. ADB in tcpip mode is unencrypted and grants shell access.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">App and file management across devices<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; install -r app.apk<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; install-multiple base.apk split_config.arm64_v8a.apk<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; uninstall com.example.app<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; shell pm list packages | grep example<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; push config.json \/sdcard\/Download\/<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; pull \/sdcard\/Download\/report.txt .\/<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; shell am start -n com.example.app\/.MainActivity<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; shell am force-stop com.example.app<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; shell pm clear com.example.app<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">-r<\/span><span style=\"font-weight: 400;\"> keeps app data on reinstall; <\/span><span style=\"font-weight: 400;\">install-multiple<\/span><span style=\"font-weight: 400;\"> installs split APKs from an App Bundle in one session. <\/span><span style=\"font-weight: 400;\">push<\/span><span style=\"font-weight: 400;\"> and <\/span><span style=\"font-weight: 400;\">pull<\/span><span style=\"font-weight: 400;\"> copy files to and from shared storage. <\/span><span style=\"font-weight: 400;\">am start<\/span><span style=\"font-weight: 400;\"> launches an activity by component name, <\/span><span style=\"font-weight: 400;\">force-stop<\/span><span style=\"font-weight: 400;\"> kills the process, and <\/span><span style=\"font-weight: 400;\">pm clear<\/span><span style=\"font-weight: 400;\"> resets the app to first launch.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Logs, screenshots and debugging<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; logcat -c\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # clear the buffer<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; logcat -s MyAppTag \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # one tag, silence the rest<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; logcat &#8216;*:E&#8217; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # errors and above<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; logcat MyAppTag:D &#8216;*:S&#8217;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # tag at debug level<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; exec-out screencap -p &gt; screen.png<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; shell screenrecord \/sdcard\/demo.mp4 \u00a0 # Ctrl+C to stop, 3 min by default<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; pull \/sdcard\/demo.mp4<\/span><\/p>\n<p><span style=\"font-weight: 400;\">adb -s &lt;serial&gt; bugreport bugreport.zip<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">exec-out<\/span><span style=\"font-weight: 400;\"> streams binary data unaltered, so the PNG isn&#8217;t corrupted. Clear logcat before reproducing a bug to keep the capture short.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Troubleshooting<\/span><\/h2>\n<table>\n<tbody>\n<tr>\n<td><b>Problem<\/b><\/td>\n<td><b>Cause<\/b><\/td>\n<td><b>Fix<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">unauthorized<\/span><\/td>\n<td><span style=\"font-weight: 400;\">RSA key not accepted<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Accept the prompt or revoke authorizations<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">offline<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Stale connection<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Replug, restart the server<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Port 5037 in use<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Second ADB server<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Keep one Platform-Tools on <\/span><span style=\"font-weight: 400;\">PATH<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Device not listed<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Driver or charge-only cable<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Install the driver, use a data cable<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400;\">Running <\/span><span style=\"font-weight: 400;\">adb devices -l<\/span><span style=\"font-weight: 400;\"> before every batch job catches all four early.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Managing multiple Android devices over ADB comes down to three habits: check what is connected with adb devices -l, address every command to one device with -s &lt;serial&gt; or ANDROID_SERIAL, &hellip; <a href=\"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/\" class=\"more-link\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1004","post","type-post","status-publish","format-standard","hentry","category-uncategorized","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Managing multiple Android devices over ADB: a practical reference - Blog QuickRef<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Managing multiple Android devices over ADB: a practical reference - Blog QuickRef\" \/>\n<meta property=\"og:description\" content=\"Managing multiple Android devices over ADB comes down to three habits: check what is connected with adb devices -l, address every command to one device with -s &lt;serial&gt; or ANDROID_SERIAL, &hellip; Read More\" \/>\n<meta property=\"og:url\" content=\"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog QuickRef\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-30T17:50:23+00:00\" \/>\n<meta name=\"author\" content=\"tedm\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"tedm\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/\"},\"author\":{\"name\":\"tedm\",\"@id\":\"https:\/\/quickref.me\/blog\/#\/schema\/person\/781b09d7f4bdae81ce0d191fb1b1d5ec\"},\"headline\":\"Managing multiple Android devices over ADB: a practical reference\",\"datePublished\":\"2026-10-30T17:50:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/\"},\"wordCount\":1194,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/quickref.me\/blog\/#organization\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/\",\"url\":\"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/\",\"name\":\"Managing multiple Android devices over ADB: a practical reference - Blog QuickRef\",\"isPartOf\":{\"@id\":\"https:\/\/quickref.me\/blog\/#website\"},\"datePublished\":\"2026-10-30T17:50:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/quickref.me\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Managing multiple Android devices over ADB: a practical reference\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/quickref.me\/blog\/#website\",\"url\":\"https:\/\/quickref.me\/blog\/\",\"name\":\"Blog QuickRef\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/quickref.me\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/quickref.me\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/quickref.me\/blog\/#organization\",\"name\":\"Blog QuickRef\",\"url\":\"https:\/\/quickref.me\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/quickref.me\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/quickref.me\/blog\/wp-content\/uploads\/2023\/10\/cropped-wuickref.png\",\"contentUrl\":\"https:\/\/quickref.me\/blog\/wp-content\/uploads\/2023\/10\/cropped-wuickref.png\",\"width\":236,\"height\":63,\"caption\":\"Blog QuickRef\"},\"image\":{\"@id\":\"https:\/\/quickref.me\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/quickref.me\/blog\/#\/schema\/person\/781b09d7f4bdae81ce0d191fb1b1d5ec\",\"name\":\"tedm\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/quickref.me\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/2689288940b2c1525bf9633d5f4c4b96d14ab0593b0ec8d5404a1f968810e963?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/2689288940b2c1525bf9633d5f4c4b96d14ab0593b0ec8d5404a1f968810e963?s=96&d=mm&r=g\",\"caption\":\"tedm\"},\"sameAs\":[\"https:\/\/quickref.me\/blog\"],\"url\":\"https:\/\/quickref.me\/blog\/author\/tedm\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Managing multiple Android devices over ADB: a practical reference - Blog QuickRef","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/","og_locale":"en_US","og_type":"article","og_title":"Managing multiple Android devices over ADB: a practical reference - Blog QuickRef","og_description":"Managing multiple Android devices over ADB comes down to three habits: check what is connected with adb devices -l, address every command to one device with -s &lt;serial&gt; or ANDROID_SERIAL, &hellip; Read More","og_url":"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/","og_site_name":"Blog QuickRef","article_published_time":"2026-10-30T17:50:23+00:00","author":"tedm","twitter_card":"summary_large_image","twitter_misc":{"Written by":"tedm","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/#article","isPartOf":{"@id":"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/"},"author":{"name":"tedm","@id":"https:\/\/quickref.me\/blog\/#\/schema\/person\/781b09d7f4bdae81ce0d191fb1b1d5ec"},"headline":"Managing multiple Android devices over ADB: a practical reference","datePublished":"2026-10-30T17:50:23+00:00","mainEntityOfPage":{"@id":"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/"},"wordCount":1194,"commentCount":0,"publisher":{"@id":"https:\/\/quickref.me\/blog\/#organization"},"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/","url":"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/","name":"Managing multiple Android devices over ADB: a practical reference - Blog QuickRef","isPartOf":{"@id":"https:\/\/quickref.me\/blog\/#website"},"datePublished":"2026-10-30T17:50:23+00:00","breadcrumb":{"@id":"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/quickref.me\/blog\/managing-multiple-android-devices-over-adb-a-practical-reference\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/quickref.me\/blog\/"},{"@type":"ListItem","position":2,"name":"Managing multiple Android devices over ADB: a practical reference"}]},{"@type":"WebSite","@id":"https:\/\/quickref.me\/blog\/#website","url":"https:\/\/quickref.me\/blog\/","name":"Blog QuickRef","description":"","publisher":{"@id":"https:\/\/quickref.me\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/quickref.me\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/quickref.me\/blog\/#organization","name":"Blog QuickRef","url":"https:\/\/quickref.me\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/quickref.me\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/quickref.me\/blog\/wp-content\/uploads\/2023\/10\/cropped-wuickref.png","contentUrl":"https:\/\/quickref.me\/blog\/wp-content\/uploads\/2023\/10\/cropped-wuickref.png","width":236,"height":63,"caption":"Blog QuickRef"},"image":{"@id":"https:\/\/quickref.me\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/quickref.me\/blog\/#\/schema\/person\/781b09d7f4bdae81ce0d191fb1b1d5ec","name":"tedm","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/quickref.me\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/2689288940b2c1525bf9633d5f4c4b96d14ab0593b0ec8d5404a1f968810e963?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2689288940b2c1525bf9633d5f4c4b96d14ab0593b0ec8d5404a1f968810e963?s=96&d=mm&r=g","caption":"tedm"},"sameAs":["https:\/\/quickref.me\/blog"],"url":"https:\/\/quickref.me\/blog\/author\/tedm\/"}]}},"_links":{"self":[{"href":"https:\/\/quickref.me\/blog\/wp-json\/wp\/v2\/posts\/1004","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/quickref.me\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/quickref.me\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/quickref.me\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/quickref.me\/blog\/wp-json\/wp\/v2\/comments?post=1004"}],"version-history":[{"count":1,"href":"https:\/\/quickref.me\/blog\/wp-json\/wp\/v2\/posts\/1004\/revisions"}],"predecessor-version":[{"id":1005,"href":"https:\/\/quickref.me\/blog\/wp-json\/wp\/v2\/posts\/1004\/revisions\/1005"}],"wp:attachment":[{"href":"https:\/\/quickref.me\/blog\/wp-json\/wp\/v2\/media?parent=1004"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/quickref.me\/blog\/wp-json\/wp\/v2\/categories?post=1004"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/quickref.me\/blog\/wp-json\/wp\/v2\/tags?post=1004"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}