¿Cómo usar ADB Shell cuando hay varios dispositivos conectados? Falla con "error: más de un dispositivo y emulador"


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

?

Respuestas:


853

Use la -sopción ANTES del comando para especificar el dispositivo, por ejemplo:

adb -s 7f1c864e shell

Consulte también http://developer.android.com/tools/help/adb.html#directingcommands


30
Para un emulador, utiliza la IP y el puerto como id, por ejemplo:adb -s 192.168.56.101:5555 shell
Jason Hartley

2
Para un emulador use adb -e shello adb emu <command>. Que van a fallar si hay más de un emulador de ir y usted tendrá que recurrir a-s
Corey Ogburn

1
Tenga en cuenta que tiene que usar la -sopción antes shell. Es una experiencia muy mala de usuario que no se puede hacer esto al revés ...
baptx

275

adb -d shell(o adb -e shell)

Este comando lo ayudará en la mayoría de los casos, si es demasiado vago para escribir la identificación completa.

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

-d- Dirija un comando adb al único dispositivo USB conectado . Devuelve un error cuando se conecta más de un dispositivo USB.

-e- Dirija un comando adb al único emulador en ejecución . Devuelve un error cuando se está ejecutando más de un emulador.


66
Muy útil si solo tienes un dispositivo USB y un emulador, que imagino es la mayoría de las personas. ¡Gracias!
Joshua Pinter

8
Y solo un poco mnemotécnico para ayudar a recordarlo cada vez -des para "dispositivo" y -epara "emulador" . Y si ya descubriste esto, date una palmadita en la espalda. ;)
Joshua Pinter

32

Otra alternativa sería establecer la variable de entorno ANDROID_SERIAL en la serie correspondiente, suponiendo que esté utilizando Windows:

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

Entonces puede usar adb.exe shellsin ningún problema.


1
Debería ser set ANDROID_SERIAL=7f1c864e, es decir. sin comillas.
Bjonnfesk

Para bash, debería ser export ANDROID_SERIAL=7f1c864e.
nivekmai

29

Encontré esta pregunta después de ver el error 'más de un dispositivo', con 2 teléfonos sin conexión que muestran:

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

Si solo tiene un dispositivo conectado, ejecute los siguientes comandos para deshacerse de las conexiones sin conexión:

adb kill-server
adb devices

adb kill-serversoluciona el problema con los emuladores sin conexión
Morten Holmgaard

adb kill-server también ayudó a deshacerse de varios dispositivos emulator-nnnn que atormentaban mi sdk (porque fue extraído como una copia de Android Studio)
Martin Zaske

6

Esta esencia hará la mayor parte del trabajo mostrando un menú cuando hay varios dispositivos conectados:

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

Para evitar escribir, puede crear un alias que incluya la selección del dispositivo como se explica aquí .


1
Se ve bien. Lástima que sea incompatible con Windows (incluido Cygwin).
Sébastien

4

El usuario @janotya ha mencionado esto anteriormente, pero me llevó algo de tiempo filtrar la mejor solución.

Hay dos casos de uso amplios:

1) 2 hardware están conectados, primero es el emulador y otro es un dispositivo.
Solución : adb -e shell....whatever-commandpara emulador y adb -d shell....whatever-commandpara dispositivo.

2) n un número de dispositivos están conectados (todos los emuladores o teléfonos / tabletas) a través de USB / ADB-WiFi:

Solución : Paso 1) ejecutar adb devicesEsto le dará una lista de los dispositivos actualmente conectados (a través de USB o ADBoverWiFI)
Paso 2) ahora ejecute adb -s <device-id/IP-address> shell....whatever-command sin importar cómo muchos dispositivos que tienes

Ejemplo
para borrar los datos de la aplicación en un dispositivo conectado en wifi ADB Ejecutaría:
adb -s 172.16.34.89:5555 shell pm clear com.package-id

para borrar los datos de la aplicación conectados en mi dispositivo USB conectado, ejecutaría:
adb -s 5210d21be2a5643d shell pm clear com.package-id


4

Para instalar un apk en uno de tus emuladores:

Primero obtenga la lista de dispositivos:

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

Luego instale el apk en su emulador con la -sbandera:

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

¡Espero que esto ayude a alguien!


3

Ejecución de comandos adb en todos los dispositivos conectados

Crear un 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

hecho usarlo con

comando adb + // +


Creo que deberías crear un archivo .bat para Windows y ejecutarlo. No estoy seguro de no haber probado esto con Windows.
Shivaraj Patil

Aquí hay una línea para ejecutar un comando en cada dispositivo conectado (en este caso, instale un apk): dispositivos adb | awk 'FNR> 1 {print $ 1}' | mientras lee la línea; hacer adb -s $ line instalar the-app.apk; hecho
Pedro Lopes

3

Para Windows, aquí hay un ejemplo rápido de 1 línea de cómo instalar un archivo ... en múltiples dispositivos

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

Si planea incluir esto en un archivo por lotes, reemplace% x con %% x, como se muestra a continuación

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

1

Cree un Bash (tools.sh) para seleccionar una serie de dispositivos (o emulador):

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

Luego, en otra opción, puede usar adb -s(dispositivo de uso de opciones globales con un número de serie dado que anula $ ANDROID_SERIAL):

adb -s ${device} <command>

Probé este código en la terminal de MacOS, pero creo que se puede usar en ventanas a través de la Terminal de Git Bash.

También recuerde configurar las variables ambientales y las rutas del SDK de Android en el .bash_profilearchivo:

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

Usando Ubuntu 16.04: / home / user / bin / select_device: línea 35: fxValidationNumberMenu: comando no encontrado / home / user / bin / select_device: línea 41: fxMenu: comando no encontrado
gerbit

@gerbit fxMenuy fxValidatonNumberMenuson solo para referencia. Lo había comentado para evitar códigos de error. Puede ver una implementación completa en mi repositorio: github.com/equiman/hardhatmac/blob/master/tools.sh
equiman

0

La mejor manera de ejecutar shell en cualquier dispositivo en particular es usar:

adb -s << emulator UDID >> shell

For Example:
adb -s emulator-5554 shell

Funciona 100%

Por favor dale golpes


0

Aquí hay un script de shell que hice para mí:

#! /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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.