【问题标题】:How to use ADB Shell when Multiple Devices are connected? Fails with "error: more than one device and emulator"连接多个设备时如何使用 ADB Shell?因“错误:多个设备和模拟器”而失败
【发布时间】:2013-01-17 06:17:50
【问题描述】:
$ 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

【问题讨论】:

    标签: android shell cmd adb android-debug


    【解决方案1】:

    在命令前使用-s选项指定设备,例如:

    adb -s 7f1c864e shell
    

    另见http://developer.android.com/tools/help/adb.html#directingcommands

    【讨论】:

    • 对于模拟器,您使用 IP 和端口作为 id,例如:adb -s 192.168.56.101:5555 shell
    • 对于模拟器,请使用adb -e shell 或adb emu <command>。如果有多个模拟器运行,它们将失败,您将不得不退回到-s
    • 请注意,您必须在shell 之前使用-s 选项。这是一种非常糟糕的用户体验,你不能反过来这样做......
    • 这个解决方案适用于我在 linux 中。竖起大拇指(y)
    【解决方案2】:

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

    如果您懒得输入完整 ID,此命令将在大多数情况下为您提供帮助。

    来自http://developer.android.com/tools/help/adb.html#commandsummary:

    -d - 将 adb 命令定向到唯一连接的 USB 设备。连接多个 USB 设备时返回错误。

    -e - 将 adb 命令定向到唯一正在运行的 emulator。运行多个模拟器时返回错误。

    【讨论】:

    • 非常如果你只有一个 USB 设备和一个模拟器,我想大多数人都是这样。谢谢!
    • 每次-d 用于"device" 和-e 用于"emulator" 时,只需一点助记符即可帮助记住它.如果你已经明白了这一点,请拍拍自己的后背。 ;)
    • 这应该是最佳答案
    【解决方案3】:

    另一种选择是将环境变量 ANDROID_SERIAL 设置为相关的序列号,这里假设您使用的是 Windows:

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

    那么你可以毫无问题地使用adb.exe shell。

    【讨论】:

    • 应该是set ANDROID_SERIAL=7f1c864e,即。没有引号。
    • 对于 bash,应该是 export ANDROID_SERIAL=7f1c864e。
    【解决方案4】:

    我在看到“多个设备”错误后发现了这个问题,其中显示了 2 个离线手机:

    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
    

    【讨论】:

    • adb kill-server 修复了离线模拟器的问题
    • adb kill-server 还帮助摆脱了困扰我的 sdk 的几个 emulator-nnnn 设备(因为它是从 Android Studio 中提取的副本)
    【解决方案5】:

    要在您的一个模拟器上安装 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
    

    Ps.:这里的顺序很重要,所以-s <id>必须在install命令之前,否则将不起作用。

    希望这对某人有所帮助!

    【讨论】:

      【解决方案6】:

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

      adb -s << emulator UDID >> shell
      
      For Example:
      adb -s emulator-5554 shell
      

      【讨论】:

        【解决方案7】:

        这个gist 将为您完成大部分工作,当有多个设备连接时显示一个菜单:

        $ 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:
        

        为避免键入,您可以创建一个别名,其中包含设备选择,如 here 所述。

        【讨论】:

        • 看起来不错。太糟糕了,它与 Windows(包括 Cygwin)不兼容。
        • 唯一始终唯一的设备 ID 是连接的 USB 端口(例如“usb:3-4”)。其他 ID 不应用于标识,因为它们对于不同的设备可能是相同的。在这里,我建议你的漂亮脚本的一个分支,它只使用 USB id 作为 -s 规范:gist.github.com/dmikushin/4495487dffd01af17c132644b8592cdd
        • @DmitryMikushin 感谢您的改进!
        【解决方案8】:

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

        有两个广泛的用例:

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

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

        解决方案: 第 1 步)运行 adb devices 这将为您提供当前连接的设备列表(通过 USB 或 ADBoverWiFI)
        Step2) 现在运行adb -s &lt;device-id/IP-address&gt; 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

        【讨论】:

          【解决方案9】:

          对于 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
          

          【讨论】:

          • 我建议将install -r .... 替换为%1,然后将此脚本保存在路径中的某个位置。这样,您可以通过使用参数调用脚本来直接调用您喜欢的任何 adb 命令。例如,如果您调用脚本adball,那么您可以调用adball uninstall myapp
          • 很好的解决方案,谢谢。
          【解决方案10】:

          Running adb commands on all connected devices

          创建一个 bash (adb+)

          adb devices | while read line
          do
          if [ ! "$line" = "" ] && [ `echo $line | awk '{print $2}'` = "device" ]
          then
              device=`echo $line | awk '{print $1}'`
              echo "$device $@ ..."
              adb -s $device $@
          fi
          

          完成 使用它

          adb+ //+ 命令

          【讨论】:

          • 我认为你应该为windows创建一个.bat文件并执行。我不确定我没有用 Windows 测试过。
          • 这是一个在每个连接的设备上运行命令的单行程序(在这种情况下,安装一个 apk): adb devices | awk 'FNR>1 {打印 $1}'|而读线;做 adb -s $line install the-app.apk ;完成
          【解决方案11】:

          创建一个 Bash (tools.sh) 以从设备(或模拟器)中选择一个串行:

          clear;
          echo "====================================================================================================";
          echo " ADB DEVICES";
          echo "====================================================================================================";
          echo "";
          
          adb_devices=( $(adb devices | grep -v devices | grep device | cut -f 1)#$(adb devices | grep -v devices | grep device | cut -f 2) );
          
          if [ $((${#adb_devices[@]})) -eq "1" ] && [ "${adb_devices[0]}" == "#" ]
          then
              echo "No device found";
              echo ""; 
              echo "====================================================================================================";
              device=""
              // Call Main Menu function fxMenu;
          else
              read -p "$(
                  f=0
                  for dev in "${adb_devices[@]}"; do
                      nm="$(echo ${dev} | cut -f1 -d#)";
                      tp="$(echo ${dev} | cut -f2 -d#)";
                      echo " $((++f)). ${nm} [${tp}]";
                  done
          
                  echo "";
                  echo " 0. Quit"
                  echo "";
          
                  echo "====================================================================================================";
                  echo "";
                  echo ' Please select a device: '
              )" selection
          
              error="You think it's over just because I am dead. It's not over. The games have just begun.";
              // Call Validation Numbers fxValidationNumberMenu ${#adb_devices[@]} ${selection} "${error}" 
              case "${selection}" in
                  0)
                      // Call Main Menu function fxMenu;
                  *)  
                      device="$(echo ${adb_devices[$((selection-1))]} | cut -f1 -d#)";
                      // Call Main Menu function fxMenu;
              esac
          fi
          

          然后在另一个选项中可以使用adb -s(全局选项-s 使用具有覆盖$ANDROID_SERIAL 的给定序列号的设备):

          adb -s ${device} <command>
          

          我在 MacOS 终端上测试了这段代码,但我认为它可以在跨 Git Bash 终端的窗口上使用。

          还要记住在.bash_profile文件上配置环境变量和Android SDK路径:

          export ANDROID_HOME="/usr/local/opt/android-sdk/"
          export PATH="$ANDROID_HOME/platform-tools:$PATH"
          export PATH="$ANDROID_HOME/tools:$PATH"
          

          【讨论】:

          • 使用 Ubuntu 16.04:/home/user/bin/select_device:第 35 行:fxValidationNumberMenu:找不到命令 /home/user/bin/select_device:第 41 行:fxMenu:找不到命令
          • @gerbit fxMenu 和 fxValidatonNumberMenu 仅供参考。我评论它以避免错误代码。您可以在我的存储库中看到完整的实现:github.com/equiman/hardhatmac/blob/master/tools.sh
          【解决方案12】:

          这是我为自己制作的一个 shell 脚本:

          #! /bin/sh
          
          for device in `adb devices | awk '{print $1}'`; do
            if [ ! "$device" = "" ] && [ ! "$device" = "List" ]
            then
              echo " "
              echo "adb -s $device $@"
              echo "------------------------------------------------------"
              adb -s $device $@
            fi
          done
          

          【讨论】:

            【解决方案13】:

            为了方便,可以创建运行配置,设置ANDROID_SERIAL:

            adb_wifi.bat 可能看起来相似的地方(只有位置参数 %1% 和 "$1" 可能不同):

            adb tcpip 5555
            adb connect %1%:5555
            

            提前是,adb 将接手当前的ANDROID_SERIAL。
            在 shell 脚本中,ANDROID_SERIAL=xyz adb shell 也应该可以工作。

            这个说法不一定是错的:

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

            但也可以在运行adb 命令之前更改ANDROID_SERIAL。


            甚至可以设置例如。 ANDROID_SERIAL=192.168.2.60:5555 为adb 定义目标IP。
            这也允许运行adb shell,命令作为“脚本参数”传递。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-08-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-26
              • 2017-10-13
              相关资源
              最近更新 更多