wake-up-neo.net

Wie kann ich eine APK auf mehreren verbundenen Geräten installieren?

Ich habe 7 Geräte an meinen Entwicklungscomputer angeschlossen.

Normalerweise mache ich adb install <path to apk> und kann nur ein einziges Gerät installieren.

Nun möchte ich meine apk auf allen 7 verbundenen Geräten installieren. Wie mache ich das in einem einzigen Befehl? Ich möchte vielleicht ein Skript ausführen.

46
Sheehan Alam

Sie können adb devices verwenden, um eine Liste der verbundenen Geräte abzurufen, und anschließend adb -s DEVICE_SERIAL_NUM install... für jedes aufgelistete Gerät ausführen.

So etwas wie (bash):

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

Kommentare deuten darauf hin, dass dies für neuere Versionen möglicherweise besser funktioniert:

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

Für Mac OSX (nicht unter Linux getestet):

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

Die anderen Antworten waren sehr nützlich, haben aber nicht ganz das gemacht, was ich brauchte. Ich dachte, ich würde meine Lösung (ein Shell-Skript) veröffentlichen, falls sie anderen Lesern mehr Klarheit verschafft. Es installiert mehrere apks und alle mp4s 

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"

Vielen Dank für all die anderen Antworten, die mich an diesen Punkt gebracht haben.

12
WorkingMatt

Hier ist ein funktionaler einzeiliger Befehl, der auf die Antwort von kichik zugeschnitten ist (Danke!):

aDB-Geräte | Schwanz -n +2 | cut -sf 1 | xargs -iX adb -s X install -r * .apk

Wenn Sie jedoch Maven verwenden, ist es noch einfacher:

mvn Android: Bereitstellen

10
Tom

Generalisierte Lösung von Dave Owens zur Ausführung aller Befehle auf allen Geräten:

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

Fügen Sie es in ein Skript wie "adb_all" ein und verwenden Sie es wie adb für ein einzelnes Gerät.

Eine weitere gute Sache, die ich gefunden habe, ist, Hintergrundprozesse für jeden Befehl zu formen und auf ihren Abschluss zu warten:

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

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

Dann können Sie einfach ein Skript erstellen, um die App zu installieren und die Aktivität zu starten

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

Eine weitere kurze Option ... Ich stolperte auf dieser Seite, um zu erfahren, dass der -s $SERIAL vor dem eigentlichen Adb-Befehl stehen muss! Danke, 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

Ich mochte workingMatt's Skript , dachte aber, es könnte etwas verbessert werden, hier ist meine modifizierte Version:

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

Meine Version macht dasselbe, außer:

  • es findet die apks von der Wurzel des Projekts
  • es wird gleichzeitig auf jedem Gerät installiert
  • es schließt die "nicht ausgerichteten" Versionen der apks aus (diese wurden gerade von den ausgerichteten Versionen installiert)
  • stattdessen werden die lesbaren Namen der Telefone angezeigt, wenn ihre Geräte-IDs angegeben sind

Es gibt einige Möglichkeiten, wie es noch verbessert werden könnte, aber ich bin ziemlich zufrieden damit.

3
Ankhwatcher

Der folgende Befehl sollte funktionieren:

$ 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 gibt die Liste der Geräte zurück. Beginnen Sie mit der Endung -n +2 von der 2. Zeile und vom Kopf -n -1, um die letzte Leerzeile am Ende zu entfernen. Beim Durchschneiden mit dem Standard-Tab-Trennzeichen wird die erste Spalte mit den Serien angezeigt.

xargs wird verwendet, um den adb-Befehl für jede Seriennummer auszuführen. Entfernen Sie die Option -r, wenn Sie nicht erneut installieren.

2
jay

Mit diesem Skript können Sie einfach Folgendes tun:

adb+ install <path to apk>

Sauber, einfach.

2

Wenn Sie keine Geräte verwenden möchten, für die adb nicht aktiviert ist; benutze das

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

Verwenden Sie dieses Befehlszeilenprogramm: adb-foreach

1
TinyTimZamboni

Der Schlüssel ist, adb in einem separaten Prozess (&) zu starten. 

Ich habe das folgende Skript entwickelt, um die Installation auf allen angeschlossenen Geräten gleichzeitig zu starten und die installierte Anwendung auf jedem von ihnen zu starten:

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

Hinweis 1: STDOUT und STDERR werden unterdrückt. Es werden keine "adb install" -Operationsergebnisse angezeigt. Ich denke, das kann verbessert werden, wenn Sie wirklich müssen

Hinweis 2: Sie können das Skript auch verbessern, indem Sie Argumente anstelle von fest codierten Pfad- und Aktivitätsnamen angeben.

Auf diese Weise:

  1. Sie müssen die Installation nicht auf jedem Gerät manuell durchführen
  2. Sie müssen nicht warten, bis eine Installation abgeschlossen ist, um eine weitere auszuführen (adb-Aufgaben werden parallel gestartet).
0
Drew

PowerShell-Lösung

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)
    }
}

Fügen Sie dies in Ihre Profildatei (notepad $PROFILE) ein, starten Sie Ihre Shell neu und Sie können Installationen mit folgendem Befehl aufrufen:

adba install yourApp.apk
0
Nilzor

Dieser Befehl funktioniert einwandfrei adb devices | awk 'NR>1{print $1}' | xargs -n1 -I% adb -s % install foo.apk

nun, es ist einfach, Sie können eine installapk.bat -Datei erstellen, die den Job für mehrere apk auf mehreren verbundenen Geräten ausführen kann. Öffnen Sie installapk.bat mit notepad ++ und kopieren Sie diesen Code

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

Da ich die Antwort von @Tom nicht kommentieren kann, hat dies bei OSX 10.13 für mich funktioniert

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

(Ändere das kleine Ich in ein großes Ich)

0
tehscott

Versuchen Sie mit der Android Debug Bridge Version 1.0.29 dieses bash-Skript :

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

Nicht sicher, ob es mit früheren Versionen funktioniert.

0
thisgeek

Entstanden von hier: Machen Sie den vorherigen Beitrag zu einem Massen-APK-Installationsprogramm, das ADB Install-Multi-Syntax nicht verwendet


 @ echo aus 

: Schleife 
 :: -------------------------- hat ein Argument? 
 if ["% ~ 1"] == [""] (
 echo done .
 goto end 
) 
 :: -------------------------- Argument existiert? 
 wenn nicht vorhanden% ~ s1 (
 echo-Fehler "% ~ 1" ist nicht im Dateisystem .
 vorhanden.) else (
 echo "% ~ 1" ist vorhanden 
 wenn vorhanden% ~ s1\NUL (
 Echo "% ~ 1" ist ein Verzeichnis 
) Else (
 Echo "% ~ 1" ist eine Datei! - Installationszeit: 
 Call adb install% ~ s1 
 ) 
) 
 :: --------------------------
 Verschiebung
 goto loop 


: ende 

 pause 

 ::: ##################### ################################################ ### 
 ::: ## ## 
 ::: ## 0. run: adb devices - um den Deamon zu starten und Ihr Gerät aufzulisten ## 
 ::: ## ## 
 ::: ## 1. Ziehen Sie eine beliebige Anzahl von Dateien (APK) über diese Batchdateien. ## 
 ::: ## ## 
 ::: ## - es werden die Dateien einzeln installiert. ## 
 ::: ## - es wird nur geprüft, ob eine Datei existiert. ## 
 ::: ## - Es wird nicht geprüft, ob es sich um ein gültiges APK-Paket handelt. ## 
 ::: ## - Es wird nicht geprüft, ob das Paket bereits installiert ist. ## 
 ::. : ## - Wenn ein Fehler auftritt, können Sie jederzeit [STRG] + [C] ## 
 ::: ## drücken, um das Skript zu stoppen, und mit dem nächsten fortfahren, ## 
 ::: ##           ein andermal. ## 
 ::: ## - Die Datei wird als 8.3-Dateiname von DOS zu Ihnen kopiert. ## 
 ::: ## Sie brauchen sich keine Sorgen zu machen, dass Dateinamen umbrochen oder ## 
 :: umbenannt werden. : ## per Drag & Drop über diesen Stapel. ## 
 ::: ## ## 
 ::: ## Elad Karako 1/1/2016 ## 
 ::: ## http://icompile.eladkarako.com ## 
 ::: ########################################### ########################### 

0
user257319