web-dev-qa-db-fra.com

Comment puis-je installer un apk sur plusieurs appareils connectés?

J'ai 7 périphériques branchés sur ma machine de développement.

Normalement, je fais adb install <path to apk> et je peux installer sur un seul périphérique.

Maintenant, j'aimerais installer mon apk sur chacun de mes 7 appareils connectés. Comment puis-je faire cela en une seule commande? Je voudrais peut-être exécuter un script.

46
Sheehan Alam

Vous pouvez utiliser adb devices pour obtenir une liste des périphériques connectés, puis exécutez adb -s DEVICE_SERIAL_NUM install... pour chaque périphérique répertorié.

Quelque chose comme (bash):

adb devices | tail -n +3 | cut -sf 1 -d " " | xargs -iX adb -s X install ...

Les commentaires suggèrent que cela pourrait fonctionner mieux pour les nouvelles versions:

adb devices | tail -n +2 | cut -sf 1 | xargs -iX adb -s X install ...

Pour Mac OSX (non testé sur Linux):

adb devices | tail -n +2 | cut -sf 1 | xargs -I {} adb -s {} install ...
73
kichik

Les autres réponses étaient très utiles, mais ne répondaient pas exactement à mes besoins. Je pensais publier ma solution (un script Shell) au cas où cela apporterait plus de clarté aux autres lecteurs. Il installe plusieurs apks et tous les mp4 

echo "Installatron"

for SERIAL in $(adb devices | tail -n +2 | cut -sf 1);
do 
  for APKLIST in $(ls *.apk);
  do
  echo "Installatroning $APKLIST on $SERIAL"
  adb -s $SERIAL install $APKLIST
  done

  for MP4LIST in $(ls *.mp4);
  do
  echo "Installatroning $MP4LIST to $SERIAL"
  adb -s $SERIAL Push $MP4LIST sdcard/
  done
done

echo "Installatron has left the building"

Merci pour toutes les autres réponses qui m'ont amené à ce point.

12
WorkingMatt

Voici une commande fonctionnelle d'une ligne adaptée à la réponse de kichik (merci!):

appareils adb | queue -n +2 | cut -sf 1 | xargs -iX adb -s X installer -r * .apk

Mais si vous utilisez Maven, c'est encore plus simple:

mVN Android: déployer

10
Tom

Solution généralisée de Dave Owens pour exécuter n'importe quelle commande sur tous les périphériques:

for SERIAL in $(adb devices | grep -v List | cut -f 1);
do echo adb -s $SERIAL $@;
done

Mettez-le dans un script comme "adb_all" et utilisez-le de la même manière que adb pour un seul périphérique.

Une autre bonne chose que j'ai trouvée est de créer des processus d'arrière-plan pour chaque commande et d'attendre qu'ils soient terminés:

for SERIAL in $(adb devices | grep -v List | cut -f 1);
do adb -s $SERIAL $@ &
done

for job in `jobs -p`
do wait $job
done

Ensuite, vous pouvez facilement créer un script pour installer l'application et démarrer l'activité.

./adb_all_fork install myApp.apk
./adb_all_fork Shell am start -a Android.intent.action.MAIN -n my.package.app/.MainActivity
6
iTake

Une autre option courte ... Je suis tombé sur cette page pour apprendre que le -s $SERIAL doit précéder la commande réelle adb! Merci stackoverflow!

for SERIAL in $(adb devices | grep -v List | cut -f 1);
do `adb -s $SERIAL install -r /path/to/product.apk`;
done
6
Dave Owens

J'ai aimé le script de workingMatt mais pensais que cela pourrait être amélioré un peu, voici ma version modifiée:

#!/bin/bash

install_to_device(){
local prettyName=$(adb -s $1 Shell getprop ro.product.model)
echo "Starting Installatroning on $prettyName"
for APKLIST in $(find . -name "*.apk" -not -name "*unaligned*");
  do
  echo "Installatroning $APKLIST on $prettyName"
  adb -s $1 install -r $APKLIST
  adb -s $1 Shell am start -n com.foo.barr/.FirstActivity;
  adb -s $1 Shell input keyevent KEYCODE_WAKEUP
  done
  echo "Finished Installatroning on $prettyName"
}

echo "Installatron"
gradlew assembleProdDebug

for SERIAL in $(adb devices | tail -n +2 | cut -sf 1);
do 
  install_to_device $SERIAL&
done

Ma version fait la même chose sauf:

  • il trouve les apks de la racine du projet
  • il s'installe simultanément sur tous les appareils
  • il exclut les versions "non alignées" des apks (celles-ci étaient juste installées par les versions alignées de toute façon
  • il affiche les noms lisibles pour les téléphones à la place si leurs identifiants de périphérique

Il y a plusieurs façons de l'améliorer, mais j'en suis assez content.

3
Ankhwatcher

La commande suivante devrait fonctionner:

$ adb devices | tail -n +2 | head -n -1 | cut -f 1 | xargs -I X adb -s X install -r path/to/your/package.apk

adb devices renvoie la liste des périphériques. Utilisez tail -n +2 pour commencer à partir de la 2ème ligne et head -n -1 pour supprimer la dernière ligne vierge à la fin. Le passage par coupe avec le délimiteur de tabulation par défaut nous donne la première colonne qui sont les publications en série.

xargs est utilisé pour exécuter la commande adb pour chaque série. Supprimez l'option -r si vous ne réinstallez pas.

2
jay

Avec ce script vous pouvez simplement faire:

adb+ install <path to apk>

Propre, simple.

2

Si vous ne voulez pas utiliser les périphériques qui n'ont pas activé adb; utilisez ceci

Mac/Linux

adb devices | grep device | grep -v devices | awk '{print$1}' | xargs -I {} adb -s {} install path/to/yourApp.apk 

adb devices | grep device | grep -v devices | cut -sf 1 | xargs -I {} adb -s {} install path/to/yourApp.apk
2
fireashes

Utilisez cet utilitaire de ligne de commande: adb-foreach

1
TinyTimZamboni

La clé est de lancer adb dans un processus séparé (&). 

J'ai développé le script suivant pour lancer simultanément l'installation sur tous les périphériques connectés et lancer l'application installée sur chacun d'entre eux:

#!/bin/sh

function install_job { 

    adb -s ${x[0]} install -r PATH_TO_YOUR_APK
    adb -s ${x[0]} Shell am start -n "com.example.MainActivity" -a Android.intent.action.MAIN -c Android.intent.category.LAUNCHER

}


#iterate over devices IP-addresses or serial numbers and start a job 

while read LINE
do
    eval x=($LINE)
    install_job ${x[0]} > /dev/null 2>&1 &
done <<< "`adb devices |  cut -sf 1`"

echo "WATING FOR INSTALLATION PROCESSES TO COMPLETE"
wait

echo "DONE INSTALLING"

Note 1: les commandes STDOUT et STDERR sont supprimées. Vous ne verrez aucun résultat de l'opération "adb install". Cela peut être amélioré, je suppose, si vous devez vraiment

Remarque 2: vous pouvez également améliorer le script en fournissant des arguments au lieu de noms de chemin et d'activité codés en dur.

De cette façon vous:

  1. Ne pas avoir à effectuer manuellement l'installation sur chaque périphérique
  2. Il n'est pas nécessaire d'attendre la fin d'une installation pour en exécuter une autre (les tâches adb sont lancées en parallèle)
0
Drew

Solution PowerShell

function global:adba() {
    $deviceIds = iex "adb devices" | select -skip 1 |  %{$_.Split([char]0x9)[0].Trim() } | where {$_ -ne "" }
    foreach ($deviceId in $deviceIds) {
        Echo ("--Executing on device " + $deviceId + ":---")
        iex ("adb -s $deviceId " + $args)
    }
}

Mettez ceci dans votre fichier de profil (notepad $PROFILE), redémarrez votre Shell et vous pouvez appeler des installations avec:

adba install yourApp.apk
0
Nilzor

Cette commande fonctionne parfaitement adb devices | awk 'NR>1{print $1}' | xargs -n1 -I% adb -s % install foo.apk

0

bien c'est simple, vous pouvez créer un fichier installapk.bat qui peut faire le travail pour plusieurs apk sur plusieurs appareils connectés

FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r Facebook.apk
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r Instagram.apk
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r Messenger.apk
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r Outlook.apk
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r Viber.apk
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r WhatsApp.apk
0
Mohamed Amine Ayachi

Puisque je ne peux pas commenter la réponse de @Tom, cela a fonctionné pour moi sous OSX 10.13.

adb devices | tail -n +2 | cut -sf 1 | xargs -IX adb -s X install -r path/to/apk.apk

(Changer le petit je en un grand je)

0
tehscott

Avec Android Debug Bridge version 1.0.29, essayez ce script bash :

APK=$1

if [ ! -f `which adb` ]; then
    echo 'You need to install the Android SDK before running this script.';
    exit;
fi

if [ ! $APK ]; then
    echo 'Please provide an .apk file to install.'
else
    for d in `adb devices | ack -o '^\S+\t'`; do
        adb -s $d install $APK;
    done
fi

Pas sûr que cela fonctionne avec les versions précédentes.

0
thisgeek

Origine d'ici: Faire de la publication précédente un installateur APK de masse qui n'utilise pas ADB Install-Multi Syntax


 @ echo off 

: boucle 
 :: -------------------------- a l'argument? 
 if ["% ~ 1"] == [""] (
 écho effectué .
 goto end 
) 
 :: -------------------------- argument existe? 
 sinon,% ~ s1 (
 erreur echo "% ~ 1" n'existe pas dans le système de fichiers .
) sinon (
 echo "% ~ 1" existe 
 s'il existe% ~ s1\NUL (
 Echo "% ~ 1" est un répertoire 
) Sinon (
 Echo "% ~ 1" est un fichier! - le temps d'installer: 
 Appeler adb install% ~ s1 
 ) 
) 
 :: --------------------------
 décalage
 goto loop 


: end 

 pause 

 ::: ###################### ################################################# ### 
 ::: ## ## 
 ::: ## 0. run: adb devices - pour démarrer le démon et répertorier votre périphérique ## 
 ::: ## ## 
 ::: ## 1. Faites glisser n’importe quelle quantité de fichiers (APK) sur ces fichiers batch, ## 
 ::: ## ## 
 ::: ## - il les installera un par un. ## 
 ::: ## - il vérifie simplement si le fichier existe. ## 
 ::: ## - il ne vérifie pas s'il s'agit d'un paquet APK valide ## 
 ::: ## - il ne vérifie pas si le paquet déjà installé ## 
 ::. : ## - en cas d'erreur, vous pouvez toujours appuyer sur les touches [CTRL] + [C] ## 
 ::: ## pour arrêter le script et continuer à partir de la suivante, ## 
 ::: ##           une autre fois. ## 
 ::: ## - le fichier est copié sous le nom de DOS 8.3 et #nom. #. : ## eux, il suffit de les glisser-déposer sur ce lot. ## 
 ::: ## ## 
 ::: ## Elad Karako 1/1/2016 ## 
 ::: ## http://icompile.eladkarako.com ## 
 ::: ############################################# #############################. 

0
user257319