Wie verwende ich die ADB-Shell, wenn mehrere Geräte verbunden sind? Fehlgeschlagen mit "Fehler: mehr als ein Gerät und Emulator"

491
$ 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
quelle

Antworten:

852

Verwenden Sie die -sOption VOR dem Befehl, um das Gerät anzugeben, zum Beispiel:

adb -s 7f1c864e shell

Siehe auch http://developer.android.com/tools/help/adb.html#directingcommands

Janot
quelle
30
Für einen Emulator verwenden Sie die IP und den Port als ID, z. B.:adb -s 192.168.56.101:5555 shell
Jason Hartley
2
Verwenden Sie für einen Emulator adb -e shelloder adb emu <command>. Sie werden scheitern , wenn es mehr als einen Emulator los und Sie werden wieder fallen müssen-s
Corey Ogburn
1
Beachten Sie, dass Sie die -sOption vorher verwenden müssen shell. Es ist eine sehr schlechte Benutzererfahrung, dass Sie dies nicht umgekehrt tun können ...
Taufe
275

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

Dieser Befehl hilft Ihnen in den meisten Fällen, wenn Sie zu faul sind, um die vollständige ID einzugeben.

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

-d- Richten Sie einen ADB-Befehl an das einzige angeschlossene USB- Gerät . Gibt einen Fehler zurück, wenn mehr als ein USB-Gerät angeschlossen ist.

-e- Richten Sie einen adb-Befehl an den einzigen laufenden Emulator . Gibt einen Fehler zurück, wenn mehr als ein Emulator ausgeführt wird.

Sazzad Hissain Khan
quelle
6
Sehr nützlich, wenn Sie nur ein USB-Gerät und einen Emulator haben, was meiner Meinung nach die meisten Menschen sind. Vielen Dank!
Joshua Pinter
8
Und nur eine kleine Mnemonik, um sich jedes Mal daran zu erinnern, -dist für "Gerät" und -efür "Emulator" . Und wenn Sie das bereits herausgefunden haben, klopfen Sie sich auf den Rücken. ;)
Joshua Pinter
32

Eine andere Alternative wäre, die Umgebungsvariable ANDROID_SERIAL auf die entsprechende Seriennummer zu setzen, vorausgesetzt, Sie verwenden Windows:

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

Dann können Sie adb.exe shellohne Probleme verwenden.

Monotux
quelle
1
Sollte sein set ANDROID_SERIAL=7f1c864e, dh. ohne Anführungszeichen.
Bjonnfesk
Für Bash sollte es sein export ANDROID_SERIAL=7f1c864e.
Nivekmai
29

Ich habe diese Frage gefunden, nachdem der Fehler "Mehr als ein Gerät" mit 2 Offline-Telefonen angezeigt wurde:

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

Wenn Sie nur ein Gerät angeschlossen haben, führen Sie die folgenden Befehle aus, um die Offline-Verbindungen zu entfernen:

adb kill-server
adb devices
Danny Beckett
quelle
adb kill-serverbehebt das Problem mit Offline-Emulatoren
Morten Holmgaard
adb kill-server half auch dabei, mehrere emulator-nnnn-geräte loszuwerden, die mein sdk heimsuchten (weil es als kopie aus Android Studio gezogen wurde)
Martin Zaske
6

Diese Übersicht erledigt den größten Teil der Arbeit für Sie, indem Sie ein Menü anzeigen, wenn mehrere Geräte angeschlossen sind:

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

Um eine Eingabe zu vermeiden, können Sie einfach einen Alias ​​erstellen, der die Geräteauswahl enthält, wie hier erläutert .

Diego Torres Milano
quelle
1
Sieht gut aus. Schade, dass es nicht mit Windows (einschließlich Cygwin) kompatibel ist.
Sébastien
4

Der Benutzer @janothat dies oben bereits erwähnt, aber ich habe einige Zeit gebraucht, um die beste Lösung zu filtern.

Es gibt zwei allgemeine Anwendungsfälle:

1) 2 Hardware sind angeschlossen, der erste ist der Emulator und der andere ist ein Gerät.
Lösung : adb -e shell....whatever-commandfür Emulator und adb -d shell....whatever-commandfür Gerät.

2) n Anzahl der Geräte (alle Emulatoren oder Telefone / Tablets) über USB / ADB-WiFi verbunden:

Lösung : Schritt 1) ​​Ausführen adb devicesDies gibt Ihnen eine Liste der aktuell angeschlossenen Geräte (über USB oder ADBoverWiFI).
Schritt 2) Jetzt ausgeführt, adb -s <device-id/IP-address> shell....whatever-command egal wie viele Geräte, die Sie haben.

Beispiel
zum Löschen von App-Daten auf einem Gerät, das über WLAN-ADB verbunden ist Ich würde Folgendes ausführen:
adb -s 172.16.34.89:5555 shell pm clear com.package-id

Um App-Daten zu löschen, die auf meinem USB-Gerät verbunden sind, würde ich Folgendes ausführen:
adb -s 5210d21be2a5643d shell pm clear com.package-id

sud007
quelle
4

So installieren Sie eine apk auf einem Ihrer Emulatoren:

Holen Sie sich zuerst die Liste der Geräte:

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

Dann installiere die apk auf deinem Emulator mit dem -sFlag:

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

Hoffe das hilft jemandem!

Pelikan
quelle
3

Ausführen von ADB-Befehlen auf allen angeschlossenen Geräten

Erstellen Sie eine 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

fertig benutze es mit

Befehl adb + // +

Shivaraj Patil
quelle
Ich denke, Sie sollten eine .bat-Datei für Windows erstellen und ausführen. Ich bin nicht sicher, ob ich dies nicht mit Windows getestet habe.
Shivaraj Patil
Hier ist ein Einzeiler, um einen Befehl auf jedem angeschlossenen Gerät auszuführen (in diesem Fall installieren Sie eine apk): adb Geräte | awk 'FNR> 1 {print $ 1}' | während Zeile lesen; installiere adb -s $ line the-app.apk; fertig
Pedro Lopes
3

Für Windows finden Sie hier ein kurzes Beispiel für die Installation einer Datei auf mehreren Geräten

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

Wenn Sie dies in eine Batchdatei aufnehmen möchten, ersetzen Sie% x wie unten beschrieben durch %% x

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

Erstellen Sie einen Bash (tools.sh), um eine Seriennummer von Geräten (oder Emulatoren) auszuwählen:

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

Dann kann in einer anderen Option verwendet werden adb -s(globale Option - verwendet Gerät mit der angegebenen Seriennummer, die $ ANDROID_SERIAL überschreibt):

adb -s ${device} <command>

Ich habe diesen Code auf dem MacOS-Terminal getestet, aber ich denke, er kann unter Windows im Git Bash Terminal verwendet werden.

Denken Sie auch daran, Umgebungsvariablen und Android SDK-Pfade in der .bash_profileDatei zu konfigurieren :

export ANDROID_HOME="/usr/local/opt/android-sdk/"
export PATH="$ANDROID_HOME/platform-tools:$PATH"
export PATH="$ANDROID_HOME/tools:$PATH"
Equiman
quelle
Verwenden von Ubuntu 16.04: / home / user / bin / select_device: Zeile 35: fxValidationNumberMenu: Befehl nicht gefunden / home / user / bin / select_device: Zeile 41: fxMenu: Befehl nicht gefunden
gerbit
@gerbit fxMenuund fxValidatonNumberMenudienen nur als Referenz. Ich hatte es kommentiert, um Fehlercodes zu vermeiden. Sie können eine vollständige Implementierung in meinem Repository sehen: github.com/equiman/hardhatmac/blob/master/tools.sh
equiman
0

Der beste Weg, um Shell auf einem bestimmten Gerät auszuführen, ist die Verwendung von:

adb -s << emulator UDID >> shell

For Example:
adb -s emulator-5554 shell

Funktioniert zu 100%

Bitte geben Sie es ein Schlag auf

Shivam Bharadwaj
quelle
0

Hier ist ein Shell-Skript, das ich für mich selbst erstellt habe:

#! /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
quelle