it-roy-ru.com

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

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

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

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

46
Sheehan Alam

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

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

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

12
WorkingMatt

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

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

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

mvn Android: развернуть

10
Tom

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

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

Поместите это в какой-нибудь скрипт типа 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

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

./adb_all_fork install myApp.apk
./adb_all_fork Shell am start -a Android.intent.action.MAIN -n my.package.app/.MainActivity
6
iTake

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

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

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

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

3
Ankhwatcher

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

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

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

2
jay

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

adb+ install <path to apk>

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

2
Christopher Perry

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

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

1
TinyTimZamboni

Ключ заключается в запуске 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: вы также можете улучшить сценарий, указав аргументы вместо жестко заданных путей и имен действий.

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

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

Решение 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), перезапустите Shell, и вы можете запустить установку с:

adba install yourApp.apk
0
Nilzor

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

0
Sivakumar Chellamuthu

это просто, вы можете создать файл installapk.bat, который может выполнять работу для нескольких apk для нескольких подключенных устройств, открыть installapk.bat с помощью notepad ++ и скопировать и вставить этот код

FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r Facebook.apk
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r Instagram.apk
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r Messenger.apk
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r Outlook.apk
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r Viber.apk
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r WhatsApp.apk
0
Mohamed Amine Ayachi

Поскольку я не могу комментировать ответ @Tom, у меня это сработало в OSX 10.13

adb devices | tail -n +2 | cut -sf 1 | xargs -IX adb -s X install -r path/to/apk.apk

(Измени маленькое я на большое Я)

0
tehscott

В 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

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

0
thisgeek

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


 @ echo off 

: loop 
 :: -------------------------- есть аргумент? 
 if ["% ~ 1"] == [""] (
 echo done .
 goto end 
) 
 :: -------------------------- Аргумент существует? 
 если не существует% ~ s1 (
 ошибка эха "% ~ 1" не существует в файловой системе .
), иначе (
 эхо "% ~ 1" существует 
 если существует% ~ s1\NUL (
 Echo "% ~ 1" - это каталог 
) Иначе (
 Echo "% ~ 1" - это файл! - время установки: 
 Call adb install% ~ s1 
 ) 
) 
 :: --------------------------
 сдвиг
 Перейти к циклу 


: конец 

 пауза 

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

0
user257319