2013-07-26 16 views
19

Esiste un modo per eseguire comandi adb su tutti i dispositivi collegati? Per disinstallare un'app da tutti i dispositivi collegati con "adb uninstall com.example.android".Esecuzione di comandi adb su tutti i dispositivi collegati

I comandi a cui sono interessato sono principalmente l'installazione e la disinstallazione.

Stavo pensando di scrivere uno script bash per questo, ma mi sento come se qualcuno avrebbe dovuto farlo già :)

risposta

17

Creare 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 [email protected] ..." 
     adb -s $device [email protected] 
    fi 
done 

utilizzarlo con

adb+ //+ command 
+0

Funziona alla grande! Grazie! L'unica cosa che manca ora è farlo in parallelo :) – Heinrisch

+9

'adb -s $ dispositivo $ @ &' farà in parallelo –

+0

@Oli Grazie mille ... ho risparmiato il mio tempo (y) –

9

Sulla base della risposta di @ Oli, questo consentirà anche il comando (s) eseguito in parallelo, utilizzando xargs. Basta aggiungere questo al file .bashrc:

function adball() 
{ 
    adb devices | egrep '\t(device|emulator)' | cut -f 1 | xargs -t -J% -n1 -P5 \ 
      adb -s % "[email protected]" 
} 

e applicarlo con l'apertura di un nuovo terminal shell, . ~/.bashrc o source ~/.bashrc.

  1. Se si desidera solo per funzionare su dispositivi (o solo su emulatori), è possibile modificare il (device|emulator) grep togliendo quello che non vuoi. Questo comando, come scritto sopra, verrà eseguito su tutti i dispositivi e gli emulatori collegati a.
  2. l'argomento -J% specifica che si desidera che xargs sostituisca la prima occorrenza di % nell'utilità con il valore dal lato sinistro della pipa (stdin).
    NOTA: questo è per BSD (Darwin/Mac OS X) xargs. Per GNU/Linux xargs, l'opzione è -I%.
  3. -t causerà xargs per stampare il comando che sta per eseguire immediatamente prima di eseguirlo.
  4. -n1 significa xargs dovrebbero utilizzare al massimo 1 argomento a ogni chiamata del comando (al contrario di alcune utility che possono prendere più argomenti, come rm per esempio).
  5. -P5 consente di eseguire contemporaneamente processi paralleli fino a 5. Se si desidera invece eseguire i comandi in sequenza, rimuovere semplicemente l'intero argomento -P5. Ciò consente anche di avere due varianti del comando (adball e adbseq, ad esempio) - una che viene eseguita in parallelo, l'altra in sequenza.

Per dimostrare che è parallela, è possibile eseguire un comando shell che include un sonno in esso, per esempio:

$ adball shell "getprop ro.serialno ; date ; sleep 1 ; date ; getprop ro.serialno" 

È possibile utilizzare questo per eseguire qualsiasi adb comando che si desidera (sì, anche adball logcat funzionerà! ma potrebbe sembrare un po 'strano perché entrambi i registri saranno in streaming sulla tua console in parallelo, quindi non sarai in grado di distinguere da quale periferica proviene una determinata linea di log).


Il vantaggio di questo approccio rispetto @ di dtmilano & approccio è che xargs continuerà a bloccare l'involucro finché almeno uno dei processi paralleli è ancora in funzione: che significa che è possibile uscire entrambi i comandi da semplicemente usando ^C, proprio come sei abituato a fare. Con l'approccio di dtmilano, se doveste eseguire adb+ logcat, entrambi i processi di logcat sarebbero in background, e quindi dovrete uccidere manualmente il processo logcat usando ps e kill o pkill. L'uso di xargs lo rende simile a una normale riga di comando di blocco e, se si dispone di un solo dispositivo, funzionerà esattamente come adb.

+0

Quale versione di xargs usi? Non trovo alcuna versione documentata che includa l'opzione -J%.C'è un'opzione alternativa? Mi piacerebbe usare adball con xargs su mingw/msys nel contesto di msysgit (versione GNU findutils xargs 4.4.2). –

+0

Penso che il comando dovrebbe essere -I% e non -J% per GNU xargs. –

+0

@CarlosSobrinho, grazie per quello; testato e sembra che tu sia corretto su GNU/Linux. L'opzione '-I%' è per BSD/Darwin/Mac OS X. Ho modificato la risposta per chiarire e dare la versione GNU. – Joe

1

adb wrapper supporta la selezione di più destinazioni per i comandi adb e l'esecuzione parallela.

Dalla sua README:

# Installation 
./install.sh ~/apps/android-sdk-linux 
# Execute adb commands on all connected devices. 
adb set-target all 
# Execute adb commands on given devices. 
adb set-target emulator-5554 C59KGT14263422 
# Use GNU parallel for parallel install. 
adb set-parallel true 

(Esonero di responsabilità: la metà ho scritto di esso)

2

Questa è una versione migliorata dello script da 強大 な. La versione originale non corrispondeva ad alcuni dispositivi.

DEVICES=`$ADB devices | grep -v devices | grep device | cut -f 1` 
for device in $DEVICES; do 
    echo "$device [email protected] ..." 
    adb -s $device [email protected] 
done 
1

Per aggiungere in ~/.bashrc o ~/.zshrc:

alias adb-all="adb devices | awk 'NR>1{print \$1}' | parallel -rkj0 --tagstring 'on {}: ' adb -s {}"

Esempi:

  • $ adb-all shell date
  • $ adb-all shell getprop net.hostname
  • $ adb-all sideload /path/to/rom.zip
  • $ adb-all install /path/filename.apk
  • $ adb-all push /usr/local/bin/frida-server-arm64 /data/local/tmp/frida-server

Spiegazione: awk estrae il dispositivo id/host (prima colonna: print $1) di ogni linee tranne la prima (NR>1) a rimuovere la riga di intestazione "Elenco dei dispositivi collegati", quindi gnu parallela esegue adb -s <HOSTNAME> <whatever-is-passed-to-the-alias> su qualsiasi riga non vuota (-r) nell'ordine specificato (-k, per evitare ordini casuali/ordine di risposta più rapido) e anteporre ciascuna riga con on <DEVICE>:\t per chiarezza, tutto in parallelo (-j0, possibile impostare un altro numero per definire il numero di adb da eseguire in parallelo anziché illimitato).

:)

Problemi correlati