Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Вы можете использовать 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 ...

Ответ 2

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

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

Ответ 3

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

adb устройства | хвост -n +2 | cut -sf 1 | xargs -iX adb -s X install -r *.apk

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

mvn android: deploy

Ответ 4

Еще один короткий вариант... Я наткнулся на эту страницу, чтобы узнать, что -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

Ответ 5

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

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

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

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

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

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

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

Ответ 6

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

#!/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 из корня проекта
  • он устанавливается на каждое устройство одновременно
  • он исключает "невыровненные" версии apks (они просто устанавливались по выровненным версиям в любом случае
  • он отображает читаемые имена для телефонов, если их идентификаторы устройств

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

Ответ 7

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

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

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

Ответ 8

С этот script вы можете просто сделать:

adb+ install <path to apk>

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

Ответ 9

Если вы не хотите использовать устройства, которые не активировали 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

Ответ 10

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

Ответ 11

С Android Debug Bridge версии 1.0.29 попробуйте 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

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

Ответ 12

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

Ответ 13

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

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

#!/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:, вы также можете улучшить script, указав args вместо жестко заданных имен пути и активности.

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

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

Ответ 14

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


@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 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     ##
::: ##########################################################################

Ответ 15

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

Ответ 16

-Установить все 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