当连接多个设备时如何使用ADB Shell?出现“error: more than one device and emulator”错误怎么办?

761
$ adb --help

-s SERIAL  use device with given serial (overrides $ANDROID_SERIAL)

$ adb devices
List of devices attached 
emulator-5554   device
7f1c864e    device

$ adb shell -s 7f1c864e
error: more than one device and emulator
16个回答

1268

41
对于模拟器而言,您需要使用IP和端口作为标识符,例如:adb -s 192.168.56.101:5555 shell - Jason Hartley
4
要使用模拟器,请使用 adb -e shelladb emu <command>。如果有多个模拟器运行,它们将失败,您需要使用 -s 切换回去。 - Corey Ogburn
2
请注意,在使用shell之前,您必须使用-s选项。不能反过来做这件事是非常糟糕的用户体验... - baptx
对于无线调试,您可以使用IP和端口作为ID,例如:adb -s 192.168.178.81:45635 shell - Wilco Verhoef
2
请注意,shell 可以替换为您想在先前指定设备上执行的任何命令。在我的情况下,该命令如下所示:adb -s emulator-5554 reverse tcp:8081 tcp:8081 - gignu
请注意,-s 必须在命令之前。 - Mohammed Elrashidy

376

adb -d shell (或者 adb -e shell)。

这个命令在大多数情况下都能帮到您,如果您懒得输入完整的ID。

参考http://developer.android.com/tools/help/adb.html#commandsummary

-d - 将adb指令直接传送到唯一的已连接USB设备。当连接了多个USB设备时会返回一个错误。

-e - 将adb指令直接传送到唯一的正在运行的模拟器。当有多个模拟器在运行时会返回一个错误。


15
如果你只有一个USB设备和一个模拟器,这会非常有用,我想这是大多数人的情况。谢谢! - Joshua Pinter
22
只需要记住一个小助记符,每次用到时 -d 表示 **"设备"**,而 -e 则表示 **"模拟器"**。如果你已经明白了这个规律,那么就可以为自己鼓掌了 ;) - Joshua Pinter
2
这应该是最佳答案。 - Georgy Ivanov
谢谢,我只需要知道如何返回正常模式或在模式之间切换。 - AmegoDev.

55

另一种选择是将环境变量ANDROID_SERIAL设置为相关串行号,这里假设你正在使用Windows:

set ANDROID_SERIAL=7f1c864e
echo %ANDROID_SERIAL%
"7f1c864e"

然后您可以使用 adb.exe shell 而不会遇到任何问题。


4
应该执行命令 set ANDROID_SERIAL=7f1c864e,即不需要引号。 - Bjonnfesk
4
对于bash,应该这样写:export ANDROID_SERIAL=7f1c864e - nivekmai
对于PowerShell,应该是$env:ANDROID_SERIAL="7f1c864e" - tteng little

48

安装APK到您的模拟器之一:

首先获取设备列表:

-> adb devices
List of devices attached
25sdfsfb3801745eg        device
emulator-0954   device

然后使用-s标志在模拟器上安装apk:

-> adb -s "25sdfsfb3801745eg" install "C:\Users\joel.joel\Downloads\release.apk"
Performing Streamed Install
Success

顺便提醒一下,这里的顺序很重要,所以-s <id>命令必须在install命令之前使用,否则它不起作用。

希望能对有所帮助!


47

在看到“存在多个设备”错误,以及两个离线手机显示时,我找到了这个问题。

C:\Program Files (x86)\Android\android-sdk\android-tools>adb devices
List of devices attached
SH436WM01785    offline
SH436WM01785    offline
SH436WM01785    sideload

如果您只连接了一个设备,请运行以下命令以消除离线连接:

adb kill-server
adb devices

2
adb kill-server 可以解决离线模拟器的问题。 - Morten Holmgaard
adb kill-server 还帮助我摆脱了几个鬼魂般存在的模拟器设备,这些设备一直困扰着我的 SDK(因为它是从 Android Studio 中复制出来的)。 - Martin Zaske
adb kill-server 杀掉了我的在线设备,但离线设备没有被移除。 - Logan Cundiff
adb kill-server解决了所有的问题。 - undefined

15

在任何特定设备上运行shell的最佳方法是使用:

adb -s << emulator UDID >> shell

For Example:
adb -s emulator-5554 shell

9
根据https://developer.android.com/studio/command-line/adb#directingcommands
以下是我测试通过的方法:
UBUNTU BASH终端:
$ adb devices
List of devices attached 
646269f0    device
8a928c2 device
$ export ANDROID_SERIAL=646269f0
$ echo $ANDROID_SERIAL
646269f0
$ adb reboot bootloader

Windows命令提示符:

$ adb devices
List of devices attached 
646269f0    device
8a928c2 device
$ set ANDROID_SERIAL=646269f0
$ echo $ANDROID_SERIAL$
646269f0
$ adb reboot bootloader

这样可以让你像只连接了一个ANDROID_SERIAL设备一样使用普通命令和脚本。
或者,你可以每次提到设备序列号。
$ adb -s 646269f0 shell

7

如果有多个设备连接,则此代码片段会为您完成大部分工作,显示一个菜单:

$ adb $(android-select-device) shell
1) 02783201431feeee device 3) emulator-5554
2) 3832380FA5F30000 device 4) emulator-5556
Select the device to use, <Q> to quit:

为了避免输入,您可以创建一个别名,其中包括设备选择,如此处所述。

1
看起来不错。太遗憾了,它与Windows(包括Cygwin)不兼容。 - Sébastien
唯一始终独特的设备ID是连接的USB端口(例如“usb:3-4”)。其他ID不应用于识别,因为它们可能对于不同的设备是相同的。在这里,我提出了您的脚本的一个分支,仅使用USB ID进行-s规范:https://gist.github.com/dmikushin/4495487dffd01af17c132644b8592cdd - Dmitry Mikushin
@DmitryMikushin 感谢您的改进! - Diego Torres Milano

6

用户@janot已经在上面提到了这一点,但是我花了一些时间来过滤最佳解决方案。

有两个广泛的用例:

1)2个硬件设备相连,第一个是模拟器,另一个是设备。
解决方案:对于模拟器,使用adb -e shell....whatever-command,对于设备,使用adb -d shell....whatever-command

2)n个设备通过USB/ADB-WiFi连接(所有模拟器或手机/平板电脑)。

解决方案: 步骤1)运行adb devices。这将给出当前连接的设备列表(通过USB或ADBoverWiFI)
步骤2)现在运行adb -s <device-id/IP-address> shell....whatever-command 无论您有多少设备。

示例
要清除连接到wifi ADB上的设备上的应用程序数据,我会执行以下操作:
adb -s 172.16.34.89:5555 shell pm clear com.package-id

要清除连接到我的USB连接设备上的应用程序数据,我会执行以下操作:
adb -s 5210d21be2a5643d shell pm clear com.package-id


5

对于Windows系统,以下是一个快速的1行示例,说明如何在多台设备上安装文件。

FOR /F "skip=1"  %x IN ('adb devices') DO start adb -s %x install -r myandroidapp.apk

如果您计划将此内容包含在批处理文件中,请将%x替换为%%x,如下所示。
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r myandroidapp.apk

1
我建议将 install -r .... 替换为 %1,然后将此脚本保存在您的路径中的某个位置。这样,您可以通过调用带有参数的脚本直接调用任何 adb 命令。例如,如果您将脚本命名为 adball,则可以调用 adball uninstall myapp - avalancha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接