Выполнение команд adb на всех подключенных устройствах
Есть ли способ запуска команд adb на всех подключенных устройствах? Чтобы удалить приложение со всех подключенных устройств с помощью "adb uninstall com.example.android".
Команды, которые меня интересуют, в основном устанавливаются и удаляются.
Я думал о написании bash script для этого, но мне кажется, что кто-то должен был это сделать уже:)
Ответы
Ответ 1
Создайте bash (adb +)
adb devices | while read line
do
if [ ! "$line" = "" ] && [ `echo $line | awk '{print $2}'` = "device" ]
then
device=`echo $line | awk '{print $1}'`
echo "$device [email protected] ..."
adb -s $device [email protected]
fi
done
используйте его с
adb+ //+ command
Ответ 2
Основываясь на ответе @Oli, это также позволит командам запускаться параллельно, используя xargs
. Просто добавьте это в свой .bashrc
файл:
function adball()
{
adb devices | egrep '\t(device|emulator)' | cut -f 1 | xargs -t -J% -n1 -P5 \
adb -s % "[email protected]"
}
и примените его, открыв новый терминал оболочки, . ~/.bashrc
или source ~/.bashrc
.
- Если вы хотите работать только на устройствах (или только на эмуляторах), вы можете изменить
(device|emulator)
grep, удалив тот, который вы не хотите. Эта команда, как написано выше, будет работать на всех подключенных устройствах и эмуляторах.
- Аргумент
-J%
указывает, что вы хотите, чтобы xargs заменили первое вхождение %
в утилите значением из левой части канала (stdin).
ПРИМЕЧАНИЕ: это для BSD (Darwin/Mac OS X) xargs
. Для GNU/Linux xargs
параметр -I%
.
-
-t
заставит xargs распечатать команду, которую он собирается запустить, прежде чем запускать ее.
-
-n1
означает, что xargs должен использовать максимум 1
аргумент в каждом вызове команды (в отличие от некоторых утилит, которые могут принимать несколько аргументов, например, rm
).
-
-P5
позволяет одновременно выполнять параллельные процессы 5
. Если вы хотите вместо этого последовательно запускать команды, просто удалите весь аргумент -P5
. Это также позволяет вам иметь два варианта команды (adball
и adbseq
, например) - тот, который выполняется параллельно, а другой - последовательно.
Чтобы доказать, что он параллелен, вы можете запустить команду оболочки, которая включает в себя спящий режим, например:
$ adball shell "getprop ro.serialno ; date ; sleep 1 ; date ; getprop ro.serialno"
Вы можете использовать эту команду для выполнения любой команды adb
, которую вы хотите (да, даже adball logcat
будет работать!), но это может показаться немного странным, потому что оба журнала будут транслироваться на консоль параллельно, поэтому вы не будете быть в состоянии отличить, из какого устройства выходит данная строка журнала).
Преимущество такого подхода в отношении @dtmilano &
заключается в том, что xargs
будет продолжать блокировать оболочку, если по крайней мере один из параллельных процессов все еще работает: это означает, что вы можете выйти из обеих команд с помощью просто используя ^C
, точно так же, как вы привыкли делать. При использовании dtmilano-подхода, если вы должны запустить adb+ logcat
, то оба процесса logcat будут задуманы, поэтому вам придется вручную вручную уничтожить процесс logcat, используя ps
и kill
или pkill
. Использование xargs делает его похожим на обычную командную строку блокировки, и если у вас есть только одно устройство, то оно будет работать точно так же, как adb
.
Ответ 3
Это улучшенная версия скрипта от 強大 な. Оригинальная версия не соответствовала некоторым устройствам.
DEVICES='adb devices | grep -v devices | grep device | cut -f 1'
for device in $DEVICES; do
echo "$device [email protected] ..."
adb -s $device [email protected]
done
Ответ 4
adb wrapper поддерживает выбор нескольких целей для команд adb и параллельного выполнения.
Из README:
# Installation
./install.sh ~/apps/android-sdk-linux
# Execute adb commands on all connected devices.
adb set-target all
# Execute adb commands on given devices.
adb set-target emulator-5554 C59KGT14263422
# Use GNU parallel for parallel install.
adb set-parallel true
(Отказ от ответственности: я написал половину его)
Ответ 5
Чтобы добавить в ~/.bashrc или ~/.zshrc:
alias adb-all="adb devices | awk 'NR>1{print \$1}' | parallel -rkj0 --tagstring 'on {}: ' adb -s {}"
Примеры:
-
$ adb-all shell date
-
$ adb-all shell getprop net.hostname
-
$ adb-all sideload /path/to/rom.zip
-
$ adb-all install /path/filename.apk
-
$ adb-all push /usr/local/bin/frida-server-arm64 /data/local/tmp/frida-server
Объяснение: awk
извлекает идентификатор/хост устройства (первый столбец: print $1
) всех строк, кроме первого (NR>1
), чтобы удалить строку заголовка "Список подключенных устройств", затем gnu parallel запускает adb -s <HOSTNAME> <whatever-is-passed-to-the-alias>
на любую непустую строку (-r
) в указанном порядке (-k
, чтобы избежать порядка случайного порядка/быстрого ответа) и для каждой четкости добавляйте каждую строку с помощью on <DEVICE>:\t
, все параллельно (, можно установить другой номер, чтобы определить, сколько adb должно выполняться параллельно, а не неограниченно).
:)
Ответ 6
Это самый высокий результат в Google, поэтому для всех пользователей Windows, которые сюда приходят, позвольте мне добавить это решение пользователем zingh (слегка изменено для принятия произвольных команд, а не "только" install
Пакетный файл (adball.bat
):
FOR /F "skip=1" %%x IN ('adb devices') DO start adb -s %%x %*
Позвонить как:
adball uninstall com.mypackage
(%*
принимает все входные параметры, моя строка выше делает так, чтобы все команды передавались в adb как есть, чтобы вы могли вводить несколько слов, флаги и т.д.)