30

有没有办法在所有连接的设备上运行 adb 命令?使用“adb uninstall com.example.android”从所有连接的设备上卸载应用程序。

我感兴趣的命令主要是安装和卸载。

我正在考虑为此编写一个 bash 脚本,但我觉得应该已经有人这样做了:)

4

6 回答 6

30

创建一个 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 $@ ..."
        adb -s $device $@
    fi
done

与它一起使用

adb+ //+ command
于 2013-07-26T13:27:34.457 回答
12

基于@Oli 的回答,这也将让命令并行运行,使用xargs. 只需将其添加到您的.bashrc文件中:

function adball()
{
    adb devices | egrep '\t(device|emulator)' | cut -f 1 | xargs -t -J% -n1 -P5 \
          adb -s % "$@"
}

并通过打开一个新的 shell 终端、. ~/.bashrc或来应用它source ~/.bashrc

  1. 如果您只想在设备上(或仅在模拟器上)运行,您可以(device|emulator)通过删除您不想要的来更改 grep。上面写的这个命令将在所有连接的设备和模拟器上运行。
  2. -J%参数指定您希望 xargs 用%管道左侧的值 (stdin) 替换实用程序中第一次出现的 。
    注意这是针对 BSD (Darwin / Mac OS X)xargs的。对于 GNU/Linux xargs,选项是-I%.
  3. -t将导致 xargs 在运行它之前立即打印它即将运行的命令。
  4. -n1意味着 xargs 最多只能在1命令的每次调用中使用参数(与某些可以采用多个参数的实用程序相反rm,例如)。
  5. -P5允许最多5并行进程同时运行。如果您想按顺序运行命令,只需删除整个-P5参数。这还允许您拥有命令的两种变体(例如adballadbseq)——一种并行运行,另一种顺序运行。

为了证明它是并行的,你可以运行一个包含 sleep 的 shell 命令,例如:

$ adball shell "getprop ro.serialno ; date ; sleep 1 ; date ; getprop ro.serialno"

您可以使用它来运行adb您想要的任何命令(是的,甚至adball logcat可以工作!但它可能看起来有点奇怪,因为两个日志将并行流式传输到您的控制台,因此您将无法区分给定日志是哪个设备线来自)。


这种方法相对于@dtmilano 的&方法的好处是,xargs只要至少有一个并行进程仍在运行,它将继续阻塞 shell:这意味着您可以通过简单地使用来中断这两个命令^C,就像您使用去做。使用 dtmilano 的方法,如果您要运行adb+ logcat,那么两个 logcat 进程都将在后台运行,因此您必须自己使用psand killor手动终止 logcat 进程pkill。使用 xargs 使它看起来和感觉就像一个常规的阻塞命令行,如果你只有一个设备,那么它的工作方式与adb.

于 2014-05-20T14:46:56.900 回答
5

这是来自强大な的脚本的改进版本。原始版本与某些设备不匹配。

DEVICES=`adb devices | grep -v devices | grep device | cut -f 1`
for device in $DEVICES; do
    echo "$device $@ ..."
    adb -s $device $@
done
于 2017-03-29T12:35:20.387 回答
4

要添加 ~/.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第一行(指定(,以避免随机顺序/最快响应顺序)并为清楚起见在每一行前面加上所有并行(,可以设置另一个数字来定义应该并行运行多少 adb 而不是无限)。NR>1adb -s <HOSTNAME> <whatever-is-passed-to-the-alias>-r-kon <DEVICE>:\t-j0

:)

于 2017-11-20T13:03:38.790 回答
2

adb 包装器支持为 adb 命令和并行执行选择多个目标。

从它的自述文件中:

# 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

(免责声明:我已经写了一半)

于 2015-04-05T11:25:28.760 回答
1

这是谷歌上的最高结果,所以对于来到这里的所有 Windows 用户,让我通过 User zingh添加这个解决方案(稍微修改以接受任意命令,而不是“仅”install

批处理文件(adball.bat):

FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x %*

调用为:

adball uninstall com.mypackage

%*接受所有输入参数,我上面的行使所有命令按原样传递给 adb,以便您可以键入多个单词、标志等)

于 2019-10-09T15:42:44.323 回答