2011-12-22 16 views
41

Tengo 7 dispositivos conectados a mi máquina de desarrollo.¿Cómo puedo instalar adb en múltiples dispositivos conectados?

Normalmente hago adb install <path to apk> y puedo instalarlo en un solo dispositivo.

Ahora me gustaría instalar mi apk en todos mis 7 dispositivos conectados. ¿Cómo puedo hacer esto en un solo comando? Me gustaría ejecutar un guión, tal vez.

+0

uninstallapp.rb https://gist.github.com/XinyueZ/2d61133b6acbde19f3c5 installapk.rb https://gist.github.com/XinyueZ/2128a11e174141908728 – TeeTracker

Respuesta

65

Puede usar adb devices para obtener una lista de dispositivos conectados y luego ejecutar adb -s DEVICE_SERIAL_NUM install... para cada dispositivo enumerado.

Algo así como (bash):

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

comentarios sugieren que esto podría funcionar mejor si hay nuevas versiones:

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

Para Mac OS X (no probado en Linux):

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

Gracias! Lamentablemente, no pude ejecutar el script. No soy un experto en shell scripting. Me sale el error: 'xargs: opción ilegal - i uso: xargs [-0opt] [-E eofstr] [-I replstr [-R reemplazos]] [-J replstr] [-L número] [-n número [-x]] [-P maxprocs] [-s tamaño] [utilidad [argumento ...]] ' –

+2

Intente reemplazar' -iX' con '-IX' – kichik

+1

No hay errores, pero no sucede nada después de ejecutar eso línea –

0

Con Android Debug Bridge versión 1.0.29, intente esto bash script:

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 

No estoy seguro de si funciona con versiones anteriores.

2

El comando siguiente debería funcionar:

$ 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 devuelve la lista de dispositivos. Use la cola -n +2 para comenzar desde la 2da línea y la cabeza -n -1 para eliminar la última línea en blanco al final. La canalización a través del corte con el delimitador de pestañas predeterminado nos proporciona la primera columna, que son las publicaciones seriadas.

xargs se utiliza para ejecutar el comando adb para cada serie. Elimine la opción -r si no está reinstalando.

+1

Esto solo funcionó después de eliminar el comando -1 del encabezado y reemplazarlo por 1. También esto solo está instalado en el primer dispositivo, no en todos. Si no reemplazo -1 con 1 en el comando principal, obtengo un dispositivo ./adb | cola -n +2 | head -n -1 head: recuento de líneas ilegales - -1 – Siddharth

+0

** head: recuento de líneas ilegales - -1 ** –

9

Aquí hay un comando de una línea funcional medida de la respuesta de Kichik (gracias!):

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

Pero si sucede utilizar Maven es aún más simple:

mvn android:deploy

+0

¿Cómo configuro esto para Android? –

+0

No funciona para mí. Salida: xargs: adb: terminado por la señal 13 –

6

Otra opción corta .. ¡Tropecé en esta página para saber que el -s $SERIAL tiene que venir antes del comando real de adb! Gracias stackoverflow!

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

Las otras respuestas fueron muy útiles, pero no hicieron exactamente lo que necesitaba. Pensé en publicar mi solución (un guión de shell) en caso de que proporcione más claridad para otros lectores. Se instala varios archivos APK y cualquier 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" 

Gracias por todas las otras respuestas que me llegó a este punto.

2

Con this script sólo se puede hacer:

adb+ install <path to apk> 

Limpio, sencillo.

+0

Perfecto, si solo podemos usarlo con dispositivos Genymotion, que se conectan a través de tcpip ... no hay forma de referirse a ellos con -s –

+0

@Jose_GD ¿por qué no? Ver mi respuesta, lo uso con éxito – Drew

+0

@Drew lo siento, tienes razón. Más tarde supe que -s ip_address es posible. –

5

solución generalizada de Dave Owens para ejecutar cualquier comando en todos los dispositivos:

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

decirlo de alguna secuencia de comandos como "adb_all" y el uso mismo modo que para el ADB solo dispositivo.

Otra buena cosa que he encontrado es que desembolsar los procesos de fondo para cada comando, y esperar a su finalización:

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 

entonces usted puede crear fácilmente un script para instalar la aplicación y comenzar la actividad

./adb_all_fork install myApp.apk 
./adb_all_fork shell am start -a android.intent.action.MAIN -n my.package.app/.MainActivity 
+0

Me gusta mucho esta idea. Funciona muy bien en mi carpeta '~/bin'. –

0

solución 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) 
    } 
} 

poner esto en su archivo de perfil (notepad $PROFILE), reinicie su cáscara y se puede invocar instalaciones con:

adba install yourApp.apk 
0

La clave es poner en marcha adb en un proceso separado (&).

me ocurrió con la siguiente secuencia de comandos para la instalación simultánea de fuego apagado en todos los dispositivos conectados de la mina y finalmente lanzar instalada la aplicación en cada uno de ellos:

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

Nota 1: la salida estándar y STDERR están suprimidos. No verá ningún resultado de operación de "instalación de adb". Esto puede mejorarse, supongo, si realmente tiene que

Nota 2: También podría mejorar la secuencia de comandos proporcionando args en lugar de ruta de acceso codificada y nombres de actividad.

De esa manera:

  1. No tiene que realizar manualmente instalar en cada dispositivo
  2. no tiene que esperar a que una instalación para terminar el fin de ejecutar otro (ADB tareas se ponen en marcha en paralelo)
3

me ha gustado workingMatt's script pero pensé que se podría mejorar un poco, aquí está mi versión modificada:

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

Mi versión hace lo mismo excepto:

  • se encuentran los archivos apk de la raíz del proyecto
  • se instala en todos los dispositivos de forma simultánea
  • que excluye las versiones "no alineados" de los archivos apk (estos sólo se están instalando sobre las versiones de todos modos alineados
  • que muestra los nombres legibles para los teléfonos en su lugar si sus identificadores de dispositivo

T Aquí hay algunas maneras en que aún se puede mejorar, pero estoy bastante contento con eso.

+1

Basado en este script, hice una versión para la creación de la aplicación Unity http://www.benoitfreslon.com/fr/2017/08/unity-install-and-run-an-apk-on-all-connected-devices-with -a-bash-script-on-os-x / –

0

originó a partir de aquí: Make The Previous Post A Mass APK Installer That Does Not Uses ADB Install-Multi Syntax


 
@echo off 

:loop 
     ::-------------------------- has argument ? 
     if ["%~1"]==[""] (
     echo done. 
     goto end 
    ) 
     ::-------------------------- argument exist ? 
     if not exist %~s1 (
     echo error "%~1" does not exist in file-system. 
    ) else (
     echo "%~1" exist 
     if exist %~s1\NUL (
      echo "%~1" is a directory 
     ) else (
      echo "%~1" is a file! - time to install: 
      call adb install %~s1 
     ) 
    ) 
     ::-------------------------- 
     shift 
     goto loop 


:end 

pause 

::: ########################################################################## 
::: ##                  ## 
::: ## 0. run: adb devices - to start the deamon and list your device ## 
::: ##                  ## 
::: ## 1. drag&drop ANY amount of files (APK) over this batch files,  ## 
::: ##                  ## 
::: ##  - it will install them one by one.        ## 
::: ##  - it just checks if file exists.        ## 
::: ##  - it does not checks if it is a valid APK package    ## 
::: ##  - it does not checks if package-already-installed    ## 
::: ##  - if there is an error you can always press [CTRL]+[C]   ## 
::: ##   to stop the script, and continue from the next one,  ## 
::: ##   some other time.           ## 
::: ##  - the file is copied as DOS's 8.3 naming to you    ## 
::: ##   don't need to worry about wrapping file names or renaming ## 
::: ##   them, just drag&drop them over this batch.     ## 
::: ##                  ## 
::: ##         Elad Karako 1/1/2016    ## 
::: ##         http://icompile.eladkarako.com  ## 
::: ########################################################################## 

2

Si no desea utilizar los dispositivos que no han habilitado ADB; utilizar este

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 
0

Este comando funciona perfecto adb devices | awk 'NR>1{print $1}' | xargs -n1 -I% adb -s % install foo.apk

-2

-Obtener toda la apk almacenado en la carpeta .apk

-Instalar y reemplazar aplicación en dispositivos

getBuild() { 
    for entry in .apk/* 
    do 
     echo "$entry" 
    done 
    return "$entry" 
} 

newBuild="$(getBuild)" 

adb devices | while read line 
do 
    if [! "$line" = ""] && ['echo $line | awk "{print $2}"' = "device"] 
    then 
     device='echo $line | awk "{print $1}"' 
     echo "adb -s $device install -r $newbuild" 
     adb -s $device install -r $newbuild 
    fi 
done 
Cuestiones relacionadas