Como usar o ADB Shell quando vários dispositivos estão conectados? Falha com "erro: mais de um dispositivo e 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

?

Jackie
fonte

Respostas:

853

Use a -sopção ANTES do comando para especificar o dispositivo, por exemplo:

adb -s 7f1c864e shell

Consulte também http://developer.android.com/tools/help/adb.html#directingcommands

janot
fonte
30
Para um emulador, você usa o IP e a porta como o ID, por exemplo:adb -s 192.168.56.101:5555 shell
Jason Hartley
2
Para um emulador, use adb -e shellou adb emu <command>. Eles vão falhar se há mais de um emulador indo e você vai ter que cair de volta para-s
Corey Ogburn
1
Observe que você precisa usar a -sopção antes shell. É uma experiência muito ruim de usuário que você não pode fazer isso o contrário ...
baptx
275

adb -d shell(ou adb -e shell)

Este comando irá ajudá-lo na maioria dos casos, se você estiver com preguiça de digitar o ID completo.

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

-d- Direcione um comando adb para o único dispositivo USB conectado . Retorna um erro quando mais de um dispositivo USB está conectado.

-e- Direcione um comando adb para o único emulador em execução . Retorna um erro quando mais de um emulador está sendo executado.

Sazzad Hissain Khan
fonte
6
Muito útil se você tiver apenas um dispositivo USB e um emulador, o que eu imagino ser a maioria das pessoas. Obrigado!
Joshua Pinter
8
E apenas um pouco mnemônico para ajudar a lembrar sempre que -dé para "dispositivo" e -eé para "emulador" . E se você já descobriu isso, dê um tapinha nas costas. ;)
Joshua Pinter /
32

Outra alternativa seria definir a variável de ambiente ANDROID_SERIAL para o serial relevante, assumindo aqui que você esteja usando o Windows:

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

Então você pode usar adb.exe shellsem problemas.

monotux
fonte
1
Deveria ser set ANDROID_SERIAL=7f1c864e, ie. sem aspas.
Bjonnfesk 8/08/19
Para o bash, deveria ser export ANDROID_SERIAL=7f1c864e.
nivekmai 25/02
29

Encontrei esta pergunta depois de ver o erro "mais de um dispositivo", com dois telefones offline mostrando:

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

Se você tiver apenas um dispositivo conectado, execute os seguintes comandos para se livrar das conexões offline:

adb kill-server
adb devices
Danny Beckett
fonte
adb kill-servercorrige o problema com emuladores off-line
Morten Holmgaard
adb kill-servidor também ajudou a se livrar de vários dispositivos emulador-nnnn que foram assombrando minha SDK (porque foi puxado como uma cópia do Android Studio)
Martin Zaske
6

Esta essência fará a maior parte do trabalho para você mostrar um menu quando houver vários 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 a digitação, basta criar um alias que inclua a seleção do dispositivo, conforme explicado aqui .

Diego Torres Milano
fonte
1
Parece legal. Pena que é incompatível com o Windows (incluindo Cygwin).
Sébastien
4

O usuário @janotjá mencionou isso acima, mas isso levou algum tempo para filtrar a melhor solução.

Existem dois casos de uso amplos:

1) 2 hardwares estão conectados, primeiro é um emulador e outro é um dispositivo.
Solução : adb -e shell....whatever-commandpara emulador e adb -d shell....whatever-commandpara dispositivo.

2) n número de dispositivos conectados (todos os emuladores ou telefones / tablets) via USB / ADB-WiFi:

Solução : Etapa 1) execute adb devicesTHis fornecerá uma lista dos dispositivos atualmente conectados (via USB ou ADBoverWiFI) Etapa
2) agora executados, adb -s <device-id/IP-address> shell....whatever-command não importa como muitos dispositivos que você tem.

Exemplo
para limpar os dados do aplicativo em um dispositivo conectado no wifi ADB, eu executaria:
adb -s 172.16.34.89:5555 shell pm clear com.package-id

para limpar os dados do aplicativo conectados no meu dispositivo conectado a USB, eu executaria:
adb -s 5210d21be2a5643d shell pm clear com.package-id

sud007
fonte
4

Para instalar um apk em um de seus emuladores:

Primeiro, obtenha a lista de dispositivos:

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

Em seguida, instale o apk no seu emulador com a -sbandeira:

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

Espero que isso ajude alguém!

pelicano
fonte
3

Executando comandos adb em todos os dispositivos conectados

Criar um 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

feito usá-lo com

comando adb + // +

Shivaraj Patil
fonte
Eu acho que você deve criar um arquivo .bat para Windows e executar. Não tenho certeza se não testei isso com o Windows.
Shivaraj Patil
Aqui está um liner para executar um comando em todos os dispositivos conectados (neste caso, instale um apk): adb devices | awk 'FNR> 1 {print $ 1}' | enquanto lê linha; adb -s $ line instala o app.apk; pronto
Pedro Lopes
3

Para Windows, aqui está um exemplo rápido de 1 instalação de um arquivo .. em vários dispositivos

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

Se você planeja incluir isso em um arquivo em lotes, substitua% x por %% x, conforme abaixo

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

Crie um Bash (tools.sh) para selecionar uma série de dispositivos (ou 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

Em outra opção, pode usar adb -s(opção global -s use device com determinado número de série que substitui $ ANDROID_SERIAL):

adb -s ${device} <command>

Testei esse código no terminal MacOS, mas acho que ele pode ser usado no Windows no Git Bash Terminal.

Lembre-se também de configurar variáveis ​​ambientais e caminhos do SDK do Android no .bash_profilearquivo:

export ANDROID_HOME="/usr/local/opt/android-sdk/"
export PATH="$ANDROID_HOME/platform-tools:$PATH"
export PATH="$ANDROID_HOME/tools:$PATH"
equiman
fonte
Usando o Ubuntu 16.04: / home / user / bin / select_device: line 35: fxValidationNumberMenu: comando não encontrado / home / user / bin / select_device: line 41: fxMenu: command not found
gerbit
@gerbit fxMenue fxValidatonNumberMenusão apenas para referência. Eu comentei para evitar códigos de erro. Você pode ver uma implementação completa no meu repositório: github.com/equiman/hardhatmac/blob/master/tools.sh
equiman
0

A melhor maneira de executar o shell em qualquer dispositivo específico é usar:

adb -s << emulator UDID >> shell

For Example:
adb -s emulator-5554 shell

Works 100%

Por favor, dê uma batida

Shivam Bharadwaj
fonte
0

Aqui está um script de shell que eu criei para mim:

#! /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
Francois Dermu
fonte