Comment utiliser ADB Shell lorsque plusieurs périphériques sont connectés? Échoue avec «erreur: plusieurs appareils et émulateurs»

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
la source

Réponses:

853

Utilisez l' -soption AVANT la commande pour spécifier le périphérique, par exemple:

adb -s 7f1c864e shell

Voir également http://developer.android.com/tools/help/adb.html#directingcommands

janot
la source
30
Pour un émulateur, vous utilisez l'IP et le port comme identifiant, par exemple:adb -s 192.168.56.101:5555 shell
Jason Hartley
2
Pour un émulateur, utilisez adb -e shellou adb emu <command>. Ils échoueront s'il y a plus d'un émulateur en cours et vous devrez vous replier sur-s
Corey Ogburn
1
Notez que vous devez utiliser l' -soption avant shell. C'est une très mauvaise expérience utilisateur que vous ne pouvez pas faire l'inverse ...
baptx
275

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

Cette commande vous aidera dans la plupart des cas, si vous êtes trop paresseux pour taper l'ID complet.

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

-d- Dirigez une commande adb vers le seul périphérique USB connecté . Renvoie une erreur lorsque plusieurs périphériques USB sont connectés.

-e- Dirigez une commande adb vers le seul émulateur en cours d'exécution . Renvoie une erreur lorsque plusieurs émulateurs sont en cours d'exécution.

Sazzad Hissain Khan
la source
6
Très utile si vous n'avez qu'un seul périphérique USB et un seul émulateur, ce que j'imagine est la plupart des gens. Merci!
Joshua Pinter
8
Et juste un petit mnémonique pour aider à s'en souvenir à chaque fois, -dc'est pour "appareil" et -epour "émulateur" . Et si vous l'avez déjà compris, donnez-vous une tape dans le dos. ;)
Joshua Pinter
32

Une autre alternative serait de définir la variable d'environnement ANDROID_SERIAL sur la série appropriée, en supposant ici que vous utilisez Windows:

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

Ensuite, vous pouvez utiliser adb.exe shellsans aucun problème.

monotux
la source
1
Devrait être set ANDROID_SERIAL=7f1c864e, à savoir. sans citations.
Bjonnfesk
Pour bash, ça devrait l'être export ANDROID_SERIAL=7f1c864e.
nivekmai
29

J'ai trouvé cette question après avoir vu l'erreur «plus d'un appareil», avec 2 téléphones hors ligne montrant:

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

Si vous n'avez qu'un seul appareil connecté, exécutez les commandes suivantes pour supprimer les connexions hors ligne:

adb kill-server
adb devices
Danny Beckett
la source
adb kill-serverrésout le problème avec les émulateurs hors ligne
Morten Holmgaard
adb kill-server a également aidé à se débarrasser de plusieurs appareils émulateur-nnnn qui hantaient mon sdk (car il a été retiré en tant que copie d'Android Studio)
Martin Zaske
6

Cet essentiel fera la plupart du travail pour vous en affichant un menu lorsque plusieurs appareils sont connectés:

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

Pour éviter de taper, vous pouvez simplement créer un alias qui incluait la sélection de périphérique comme expliqué ici .

Diego Torres Milano
la source
1
À l'air cool. Dommage qu'il soit incompatible avec Windows (dont Cygwin).
Sébastien
4

L'utilisateur l' @janota déjà mentionné ci-dessus, mais cela m'a pris un certain temps pour filtrer la meilleure solution.

Il existe deux cas d'utilisation généraux:

1) 2 matériels sont connectés, le premier est l'émulateur et l'autre est un périphérique.
Solution : adb -e shell....whatever-commandpour émulateur et adb -d shell....whatever-commandpour appareil.

2) n nombre d'appareils sont connectés (tous les émulateurs ou téléphones / tablettes) via USB / ADB-WiFi:

Solution : Étape 1) exécutez adb devicesCela vous donnera la liste des appareils actuellement connectés (via USB ou ADBoverWiFI) Étape 2)
exécutez maintenant, adb -s <device-id/IP-address> shell....whatever-command peu importe comment de nombreux appareils dont vous disposez.

Exemple
pour effacer les données d'application sur un appareil connecté sur wifi ADB j'exécuterais:
adb -s 172.16.34.89:5555 shell pm clear com.package-id

pour effacer les données d'application connectées sur mon appareil connecté USB, j'exécuterais:
adb -s 5210d21be2a5643d shell pm clear com.package-id

sud007
la source
4

Pour installer un apk sur l'un de vos émulateurs:

Obtenez d'abord la liste des appareils:

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

Installez ensuite l'apk sur votre émulateur avec le -sdrapeau:

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

J'espère que cela aide quelqu'un!

pélican
la source
3

Exécution de commandes adb sur tous les appareils connectés

Créer 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

l'utiliser avec

Commande adb + // +

Shivaraj Patil
la source
Je pense que vous devez créer un fichier .bat pour Windows et l'exécuter. Je ne suis pas sûr de ne pas l'avoir testé avec Windows.
Shivaraj Patil
Voici une ligne pour exécuter une commande sur chaque appareil connecté (dans ce cas, installez un apk): adb devices | awk 'FNR> 1 {print $ 1}' | pendant la lecture de la ligne; faire adb -s $ line installer the-app.apk; fait
Pedro Lopes
3

Pour Windows, voici un exemple rapide 1 de comment installer un fichier ... sur plusieurs appareils

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

Si vous prévoyez de l'inclure dans un fichier de commandes, remplacez% x par %% x, comme ci-dessous

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

Créez un Bash (tools.sh) pour sélectionner une série à partir de périphériques (ou émulateur):

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

Ensuite, dans une autre option peut utiliser adb -s (l'option globale -s utilise un périphérique avec un numéro de série donné qui remplace $ ANDROID_SERIAL):

adb -s ${device} <command>

J'ai testé ce code sur le terminal MacOS, mais je pense qu'il peut être utilisé sur les fenêtres de Git Bash Terminal.

N'oubliez pas également de configurer les variables d'environnement et les chemins du SDK Android dans le .bash_profilefichier:

export ANDROID_HOME="/usr/local/opt/android-sdk/"
export PATH="$ANDROID_HOME/platform-tools:$PATH"
export PATH="$ANDROID_HOME/tools:$PATH"
equiman
la source
Utilisation d'Ubuntu 16.04: / home / user / bin / select_device: ligne 35: fxValidationNumberMenu: commande introuvable / home / user / bin / select_device: ligne 41: fxMenu: commande introuvable
gerbit
@gerbit fxMenuet fxValidatonNumberMenusont juste pour référence. Je l'avais commenté pour éviter les codes d'erreur. Vous pouvez voir une implémentation complète sur mon référentiel: github.com/equiman/hardhatmac/blob/master/tools.sh
equiman
0

La meilleure façon d'exécuter le shell sur un appareil particulier est d'utiliser:

adb -s << emulator UDID >> shell

For Example:
adb -s emulator-5554 shell

Fonctionne à 100%

S'il vous plaît donnez-lui un coup

Shivam Bharadwaj
la source
0

Voici un script shell que je me suis fait:

#! /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
François Dermu
la source