Как я могу adb установить apk на несколько подключенных устройств?

У меня есть 7 устройств, подключенных к моей машине разработки.

Обычно я делаю adb install <path to apk> и могу установить только одно устройство.

Теперь я хотел бы установить apk на всех моих 7 подключенных устройствах. Как я могу сделать это в одной команде? Возможно, я хотел бы запустить скрипт.

Solutions Collecting From Web of "Как я могу adb установить apk на несколько подключенных устройств?"

Вы можете использовать adb devices для получения списка подключенных устройств, а затем запустить adb -s DEVICE_SERIAL_NUM install... для каждого перечисленного устройства.

Что-то вроде (bash):

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

Комментарии предполагают, что это может работать лучше для более новых версий:

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

Для Mac OSX (не тестируется в Linux):

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

Другие ответы были очень полезными, но не совсем сделали то, что мне было нужно. Я думал, что опубликую свое решение (сценарий оболочки), если он предоставит больше ясности другим читателям. Он устанавливает несколько apks и любые 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" 

Спасибо за все остальные ответы, которые привели меня к этому вопросу.

Вот функциональная однострочная команда, адаптированная к ответу kichik (спасибо!):

Устройства adb | Хвост -n +2 | Cut -sf 1 | Xargs -iX adb -s X install -r * .apk

Но если вы используете Maven, это еще проще:

Mvn android: развернуть

Еще один короткий вариант … Я наткнулся на эту страницу, чтобы узнать, что -s $SERIAL должен прийти до фактической команды adb! Спасибо, stackoverflow!

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

Обобщенное решение от Dave Owens для выполнения любой команды на всех устройствах:

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

Поместите его в какой-то скрипт, например adb_all, и используйте тот же способ, что и adb для одного устройства.

Еще одна хорошая вещь, которую я обнаружил, – это развернуть фоновые процессы для каждой команды и дождаться их завершения:

 for SERIAL in $(adb devices | grep -v List | cut -f 1); do adb -s $SERIAL $@ & done for job in `jobs -p` do wait $job done 

Затем вы можете легко создать скрипт для установки приложения и начать работу

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

Следующая команда должна работать:

 $ adb devices | tail -n +2 | head -n -1 | cut -f 1 | xargs -IX adb -s X install -r path/to/your/package.apk 

Adb-устройства возвращают список устройств. Используйте tail -n +2, чтобы начать со второй строки и head -n-1, чтобы удалить последнюю пустую строку в конце. Трубопровод через разрез с разделителем табуляции по умолчанию дает нам первый столбец, который является сериальным.

Xargs используется для запуска команды adb для каждого серийного номера. Удалите параметр -r, если вы не переустанавливаете.

С помощью этого скрипта вы можете просто сделать:

 adb+ install <path to apk> 

Чистый, простой.

Мне понравился скрипт workMatt, но я подумал, что его можно немного улучшить, вот моя модифицированная версия:

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

Моя версия делает то же самое, кроме:

  • Он находит апки из корня проекта
  • Он устанавливается на каждое устройство одновременно
  • Он исключает «невыровненные» версии apks (они просто устанавливались по выровненным версиям в любом случае
  • Он отображает читаемые имена для телефонов, если их идентификаторы устройств

Есть несколько способов улучшить его, но я вполне доволен этим.

Если вы не хотите использовать устройства, которые не активировали adb; использовать это

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 

Используйте эту утилиту командной строки: adb-foreach

С Android Debug Bridge версии 1.0.29 попробуйте этот скрипт bash :

 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 

Не уверен, что он работает с более ранними версиями.

Решение 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) } } 

Поместите это в свой файл профиля ( notepad $PROFILE ), перезапустите свою оболочку, и вы можете вызвать установки с помощью:

 adba install yourApp.apk 

Ключом является запуск adb в отдельном процессе (&).

Я придумал следующий сценарий для одновременной увольнения на всех подключенных устройствах и, наконец, запустил установленное приложение для каждого из них:

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

Примечание 1: STDOUT и STDERR подавляются. Вы не увидите результата операции «adb install». Это может быть улучшено, я думаю, если вам действительно нужно

Примечание 2: вы также можете улучшить сценарий, указав вместо аргументов hardcoded path и activity имена args.

Таким образом, вы:

  1. Не нужно вручную выполнять установку на каждом устройстве
  2. Не нужно ждать завершения одной установки, чтобы выполнить другую (задачи adb запускаются параллельно)

Происходит отсюда: Сделать предыдущую запись. Массовый установщик APK, который не использует ADB Install-Multi Syntax


 @echo off

 : петля
       :: -------------------------- есть аргумент?
       Если ["% ~ 1"] == [""] (
         Эхо сделано.
         Goto end
       )
       :: -------------------------- аргумент существует?
       Если не существует% ~ s1 (
         Ошибка эхо-ошибки «% ~ 1» не существует в файловой системе.
       ) Else (
         Эхо "% ~ 1" существует
         Если существуют% ~ s1 \ NUL (
           Echo "% ~ 1" - это каталог
         ) Else (
           Echo "% ~ 1" - это файл!  - время установки:
           Call adb install% ~ s1
         )
       )
       :: --------------------------
       сдвиг
       Goto loop


 :конец

 Пауза

 ::: ############################################################################################## ###########################
 ::: ## ##
 ::: ## 0. run: adb devices - запустить deamon и перечислить ваше устройство ##
 ::: ## ##
 ::: ## 1. перетащить и удалить любое количество файлов (APK) над этими пакетными файлами, ##
 ::: ## ##
 ::: ## - он будет устанавливать их один за другим.  ##
 ::: ## - он просто проверяет, существует ли файл.  ##
 ::: ## - он не проверяет, является ли он действительным пакетом APK ##
 ::: ## - он не проверяет, установлен ли пакет уже установлен ##
 ::: ## - если есть ошибка, вы всегда можете нажать [CTRL] + [C] ##
 ::: ##, чтобы остановить скрипт и продолжить со следующего, ##
 ::: ## в другое время.  ##
 ::: ## - файл копируется как имя DOS 8.3 для вас ##
 ::: ## не нужно беспокоиться об именах файлов обертывания или переименовании ##
 ::: ##, просто перетащите их по этой партии.  ##
 ::: ## ##
 ::: ## Elad Karako 1/1/2016 ##
 ::: ## http://icompile.eladkarako.com ##
 ::: ############################################################################################## ###########################

Эта команда работает с совершенными adb devices | awk 'NR>1{print $1}' | xargs -n1 -I% adb -s % install foo.apk adb devices | awk 'NR>1{print $1}' | xargs -n1 -I% adb -s % install foo.apk

-Установить все apk хранящиеся в папке .apk

-Установить и заменить приложение на устройствах

 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