Automatische App-Installation per ADB — Batch-Deployment auf 75 Geräte
Einzeln Apps auf 75 Geräten installieren? Kannst du knicken. Nach den ersten 20 manuellen Installationen hab ich mir ein Skript geschrieben, das ich heute kaum noch anfasse — es läuft einfach. Hier zeige ich dir, wie du Apps im Batch auf dutzende Geräte gleichzeitig bringst.
Das Grundprinzip: ADB install über TCP
Alle meine Geräte sind per ADB-TCP verbunden, also funktioniert eine Installation so:
adb -s 10.0.10.11:5555 install meine-app.apk
Für 75 Geräte wird das schnell unübersichtlich. Also: Liste der IPs + for-loop + parallel.
Mein Batch-Install-Skript
#!/bin/bash
# batch-install.sh — Installiert eine APK auf allen Farm-Geräten
APK="$1"
DEVICES_FILE="/opt/phone-farm/devices.txt"
FAILED_LOG="/opt/phone-farm/failed-installs.log"
if [ ! -f "$APK" ]; then
echo "Fehler: APK-Datei '$APK' nicht gefunden."
exit 1
fi
PACKAGE=$(aapt dump badging "$APK" | grep package: | cut -d"'" -f2)
echo "→ Installiere $PACKAGE auf allen Geräten..."
> "$FAILED_LOG" # Log leeren
install_on_device() {
local IP="$1"
echo -n " $IP ... "
if adb -s "$IP:5555" install -r "$APK" &>/dev/null; then
echo "OK"
else
echo "FAILED"
echo "$IP" >> "$FAILED_LOG"
fi
}
# Parallele Installation, maximal 10 gleichzeitig
cat "$DEVICES_FILE" | xargs -P 10 -I {} bash -c 'install_on_device "$@"' _ {}
FAILED=$(wc -l < "$FAILED_LOG")
echo "Fertig. Erfolgreich: $(($(wc -l < "$DEVICES_FILE") - FAILED)), Fehlgeschlagen: $FAILED"
Wichtig: -r flag bei install — das ersetzt eine existierende Installation, ohne dass du sie vorher deinstallieren musst. Ohne -r würde das Skript bei bereits installierten Apps abbrechen.
xargs -P 10 limitiert auf 10 parallele ADB-Verbindungen. Mehr als 15 gleichzeitige ADB-Sessions überlasten selbst den OPNsense-Router. Ich hab's mit -P 50 probiert — nach 10 Sekunden war die Hälfte der Verbindungen abgebrochen. -P 10 ist der Sweetspot auf meinem Setup.
App-Deinstallation im Batch
Genauso wichtig wie installieren: Apps sauber und vollständig entfernen:
#!/bin/bash
# batch-uninstall.sh
PACKAGE="$1"
DEVICES_FILE="/opt/phone-farm/devices.txt"
while read IP; do
echo -n "$IP ... "
# Erst für aktuellen User deinstallieren
adb -s "$IP:5555" uninstall "$PACKAGE" 2>/dev/null
# Dann als System-App versuchen (Root)
adb -s "$IP:5555" shell su -c "pm uninstall $PACKAGE" 2>/dev/null
echo "done"
done < "$DEVICES_FILE"
Split-APKs (APKM, XAPK, APKS)
Moderne Apps kommen oft als Split-APKs. ADB kann die seit Platform Tools 30 nativ installieren:
# APKS-Datei (Bundle-Format)
adb install-multiple app.APKS
# Oder einzelne Split-APKs:
adb install-multiple base.apk split_config.armeabi_v7a.apk
Play Store Alternativen für die Farm
Den Google Play Store auf 75 Geräten zu nutzen ist Wahnsinn — jede App-Installation triggert Play Protect, Updates laufen asynchron, und Google sieht 75 Installationen von der gleichen IP als verdächtig. Meine Alternativen:
Aurora Store
Open-Source Play-Store-Client, der anonyme Accounts nutzt. Installation per F-Droid oder APK. Vorteil: Kein Google-Account nötig, keine Device-Fingerprints. Nachteil: Manchmal Rate-limited von Google. Trotzdem meine erste Wahl.
APKMirror / APKPure
Für Apps, die ich oft installiere, lade ich die APK einmal runter und verteile sie per Batch-Skript. Spart Bandbreite und ist zuverlässiger als der Play Store.
Eigener APK-Server
Für interne Apps hab ich einen simplen HTTP-Server, von dem die Geräte per wget + pm install ziehen:
adb shell wget -O /data/local/tmp/app.apk http://10.0.1.1:8080/app.apk
adb shell pm install /data/local/tmp/app.apk
Fehlerbehandlung: Was tun bei "INSTALL_FAILED"?
Die häufigsten ADB-Install-Fehler und ihre Lösungen:
- INSTALL_FAILED_INSUFFICIENT_STORAGE: Speicher voll.
adb shell pm clear com.package.nameoder alte Downloads löschen:adb shell rm -rf /sdcard/Download/* - INSTALL_FAILED_UPDATE_INCOMPATIBLE: Signatur-Konflikt. Erst deinstallieren:
adb uninstall com.package.name - INSTALL_FAILED_VERSION_DOWNGRADE: Neuere Version installiert.
-r -dFlag:adb install -r -d app.apk - INSTALL_FAILED_OLDER_SDK: App braucht neueres Android. Custom ROM mit höherem API-Level flashen.
- INSTALL_PARSE_FAILED_NO_CERTIFICATES: APK nicht signiert. Neu signieren mit apksigner oder eine signierte Version besorgen.
Monitoring: Wie du verifizierst, dass die Installation erfolgreich war
# Check ob ein Package installiert ist:
adb -s $IP:5555 shell pm list packages | grep com.package.name
# Version checken:
adb -s $IP:5555 shell dumpsys package com.package.name | grep versionName
Fazit: Automatische App-Installation per ADB ist einer der größten Zeitgewinne in der Phone Farm. Mein Batch-Skript installiert eine App in 3 Minuten auf 75 Geräten — manuell würde das 2 Stunden dauern.