android - para - comandos adb shell
Ejecutando comandos adb en todos los dispositivos conectados (5)
Crear 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
done
usalo con
adb+ //+ command
¿Hay alguna forma de ejecutar comandos adb en todos los dispositivos conectados? Para desinstalar una aplicación de todos los dispositivos conectados con "adb uninstall com.example.android".
Los comandos que me interesan son principalmente instalar y desinstalar.
Estaba pensando en escribir un guión de bash para esto, pero siento que alguien ya debería haberlo hecho :)
Esta es una versión mejorada del script de 強大 な. La versión original no coincidía con algunos dispositivos.
DEVICES=`adb devices | grep -v devices | grep device | cut -f 1`
for device in $DEVICES; do
echo "$device $@ ..."
adb -s $device $@
done
Para agregar en ~ / .bashrc o ~ / .zshrc:
alias adb-all="adb devices | awk ''NR>1{print /$1}'' | parallel -rkj0 --tagstring ''on {}: '' adb -s {}"
Ejemplos:
-
$ 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
Explicación: awk
extrae el id / host del dispositivo (primera columna: print $1
) de todas las líneas excepto la primera ( NR>1
) para eliminar la línea del encabezado "Lista de dispositivos adjuntos", luego gnu parallel ejecuta adb -s <HOSTNAME> <whatever-is-passed-to-the-alias>
en cualquier línea no-vacía ( -r
) en el orden especificado ( -k
, para evitar el orden aleatorio / orden de respuesta más rápida) y anteponer cada línea con on <DEVICE>:/t
para mayor claridad, todo en paralelo ( -j0
, es posible configurar otro número para definir cuántos adb deben ejecutarse en paralelo en lugar de ilimitados).
:)
Sobre la base de la respuesta de @ Oli, esto también permitirá que los comandos se ejecuten en paralelo, utilizando xargs
. Solo agrega esto a tu archivo .bashrc
:
function adball()
{
adb devices | egrep ''/t(device|emulator)'' | cut -f 1 | xargs -t -J% -n1 -P5 /
adb -s % "$@"
}
y aplíquelo abriendo un nuevo terminal shell,. . ~/.bashrc
, o source ~/.bashrc
.
- Si solo desea ejecutar en dispositivos (o solo en emuladores), puede cambiar el grep
(device|emulator)
eliminando el que no desea. Este comando, como se escribió anteriormente, se ejecutará en todos los dispositivos y emuladores conectados. - el argumento
-J%
especifica que desea que xargs reemplace la primera aparición de%
en la utilidad con el valor del lado izquierdo de la canalización (stdin).
NOTA : esto es para BSD (Darwin / Mac OS X)xargs
. Para GNU / Linuxxargs
, la opción es-I%
. -
-t
hará que xargs imprima el comando que está a punto de ejecutarse inmediatamente antes de ejecutarlo. -
-n1
significa que-n1
solo debe usar a lo sumo1
argumento en cada invocación del comando (a diferencia de algunas utilidades que pueden tomar múltiples argumentos, como por ejemplorm
). -
-P5
permite que se ejecuten simultáneamente hasta5
procesos paralelos. Si, en cambio, desea ejecutar los comandos secuencialmente, simplemente elimine todo el argumento-P5
. Esto también le permite tener dos variaciones del comando (adball
yadbseq
, por ejemplo), una que se ejecuta en paralelo y la otra de forma secuencial.
Para probar que es paralelo, puede ejecutar un comando de shell que incluya un sueño en él, por ejemplo:
$ adball shell "getprop ro.serialno ; date ; sleep 1 ; date ; getprop ro.serialno"
Puede usar esto para ejecutar cualquier comando adb
que desee (sí, ¡incluso adball logcat
funcionará! Pero puede parecer un poco extraño porque ambos registros se transmitirán a su consola en paralelo, por lo que no podrá distinguir qué dispositivo una línea de registro dada viene de).
El beneficio de este enfoque sobre el enfoque de @ dtmilano &
es que xargs
continuará bloqueando el shell siempre que al menos uno de los procesos paralelos aún se esté ejecutando: eso significa que puede salir de ambos comandos simplemente usando ^C
, al igual que estas acostumbrado a hacer Con el enfoque de dtmilano, si tuviera que ejecutar adb+ logcat
, ambos procesos de logcat se incluirían en segundo plano, por lo que tendría que eliminar manualmente el proceso de logcat con ps
y kill
o pkill
. El uso de xargs hace que se vea y se sienta como una línea de comando de bloqueo regular, y si solo tiene un dispositivo, entonces funcionará exactamente igual que adb
.
adb wrapper admite la selección de múltiples destinos para los comandos adb y la ejecución paralela.
Desde su 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
(Descargo de responsabilidad: he escrito la mitad de ella)