Выполнение команд 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 как есть, чтобы вы могли вводить несколько слов, флаги и т.д.)