Как я могу adb установить apk на несколько подключенных устройств?
У меня есть 7 устройств, подключенных к моей машине разработки.
Обычно я выполняю adb install <path to apk>
и могу установить только одно устройство.
Теперь я хотел бы установить apk на всех моих 7 подключенных устройствах. Как я могу сделать это в одной команде? Я бы хотел запустить script, возможно.
Ответы
Ответ 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