Come utilizzare ADB Shell quando sono collegati più dispositivi? Errore "errore: più di un dispositivo ed emulatore"


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

?

Risposte:


853

Utilizzare l' -sopzione PRIMA del comando per specificare il dispositivo, ad esempio:

adb -s 7f1c864e shell

Vedi anche http://developer.android.com/tools/help/adb.html#directingcommands


30
Per un emulatore, usi l'IP e la porta come id, ad esempio:adb -s 192.168.56.101:5555 shell
Jason Hartley,

2
Per un emulatore usare adb -e shello adb emu <command>. Falliranno se c'è più di un emulatore in corso e dovrai -s
ricorrere

1
Nota che devi usare l' -sopzione prima shell. È una brutta esperienza per l'utente che non si possa fare il contrario ...
baptx

275

adb -d shell(o adb -e shell).

Questo comando ti aiuterà nella maggior parte dei casi, se sei troppo pigro per digitare l'ID completo.

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

-d- Dirigi un comando adb sull'unico dispositivo USB collegato . Restituisce un errore quando è collegato più di un dispositivo USB.

-e- Indirizza un comando adb all'unico emulatore in esecuzione . Restituisce un errore quando è in esecuzione più di un emulatore.


6
Molto utile se hai solo un dispositivo USB e un emulatore, che immagino sia la maggior parte delle persone. Grazie!
Joshua Pinter

8
E solo un po 'di mnemonico per ricordare che ogni volta -dè per "dispositivo" ed -eè per "emulatore" . E se lo hai già capito, concediti una pacca sulla spalla. ;)
Joshua Pinter

32

Un'altra alternativa sarebbe quella di impostare la variabile di ambiente ANDROID_SERIAL sul seriale pertinente, assumendo qui che si stia utilizzando Windows:

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

Quindi è possibile utilizzare adb.exe shellsenza problemi.


1
Dovrebbe essere set ANDROID_SERIAL=7f1c864e, cioè. senza virgolette.
Bjonnfesk,

Per bash, dovrebbe essere export ANDROID_SERIAL=7f1c864e.
nivekmai,

29

Ho trovato questa domanda dopo aver visto l'errore "più di un dispositivo", con 2 telefoni offline che mostrano:

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

Se hai solo un dispositivo connesso, esegui i seguenti comandi per eliminare le connessioni offline:

adb kill-server
adb devices

adb kill-serverrisolve il problema con gli emulatori offline
Morten Holmgaard

adb kill-server ha anche aiutato a sbarazzarsi di diversi dispositivi di emulazione-nnnn che stavano perseguitando il mio sdk (perché è stato estratto come copia da Android Studio)
Martin Zaske il

6

Questa sintesi farà la maggior parte del lavoro per te mostrando un menu quando ci sono più dispositivi collegati:

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

Per evitare di digitare, puoi semplicemente creare un alias che includesse la selezione del dispositivo, come spiegato qui .


1
Sembra bello. Peccato che sia incompatibile con Windows (incluso Cygwin).
Sébastien,

4

L'utente lo @janotha già menzionato sopra, ma mi ci è voluto del tempo per filtrare la soluzione migliore.

Esistono due casi d'uso generali:

1) 2 hardware sono collegati, il primo è l'emulatore e l'altro è un dispositivo.
Soluzione : adb -e shell....whatever-commandper emulatore e adb -d shell....whatever-commandper dispositivo.

2) n numero di dispositivi collegati (tutti gli emulatori o telefoni / tablet) tramite USB / ADB-WiFi:

Soluzione : passaggio 1) esegui Questo adb devicesti fornirà un elenco dei dispositivi attualmente collegati (tramite USB o ADBoverWiFI) passaggio
2) ora funziona adb -s <device-id/IP-address> shell....whatever-command indipendentemente da come molti dispositivi che hai.

Esempio
per cancellare i dati dell'app su un dispositivo collegato su ADB wifi che eseguirò:
adb -s 172.16.34.89:5555 shell pm clear com.package-id

per cancellare i dati delle app collegati sul mio dispositivo USB collegato eseguo:
adb -s 5210d21be2a5643d shell pm clear com.package-id


4

Per installare un apk su uno dei tuoi emulatori:

Prima ottenere l'elenco dei dispositivi:

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

Quindi installa l'apk sul tuo emulatore con il -sflag:

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

Spero che questo aiuti qualcuno!


3

Esecuzione di comandi adb su tutti i dispositivi collegati

Crea 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

fatto con

comando adb + // +


Penso che dovresti creare un file .bat per Windows ed eseguirlo. Non sono sicuro di non averlo testato con Windows.
Shivaraj Patil,

Ecco una riga per eseguire un comando su ogni dispositivo collegato (in questo caso, installare un apk): adb devices | awk 'FNR> 1 {print $ 1}' | mentre leggi la riga; adb -s $ line installa the-app.apk; fatto
Pedro Lopes il

3

Per Windows, ecco un rapido esempio da 1 riga di come installare un file ... su più dispositivi

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

Se prevedi di includerlo in un file batch, sostituisci% x con %% x, come di seguito

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

1

Crea un Bash (tools.sh) per selezionare un seriale da dispositivi (o emulatore):

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

Quindi in un'altra opzione puoi usare adb -s(l'opzione globale -s usa il dispositivo con un determinato numero seriale che sostituisce $ ANDROID_SERIAL):

adb -s ${device} <command>

Ho testato questo codice sul terminale MacOS, ma penso che possa essere utilizzato su Windows attraverso Git Bash Terminal.

Ricorda inoltre di configurare le variabili ambientali e i percorsi dell'SDK Android su .bash_profilefile:

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: riga 35: fxValidationNumberMenu: comando non trovato / home / user / bin / select_device: riga 41: fxMenu: comando non trovato
gerbit

@gerbit fxMenue fxValidatonNumberMenusono solo per riferimento. L'avevo commentato per evitare codici di errore. Puoi vedere un'implementazione completa sul mio repository: github.com/equiman/hardhatmac/blob/master/tools.sh
equiman

0

Il modo migliore per eseguire la shell su qualsiasi dispositivo particolare è utilizzare:

adb -s << emulator UDID >> shell

For Example:
adb -s emulator-5554 shell

Funziona al 100%

Per favore, dai un colpo


0

Ecco uno script di shell che ho creato per me stesso:

#! /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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.