在所有连接的设备上运行adb命令

时间:2013-07-26 13:23:03

标签: android adb

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

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

我正在考虑为此编写一个bash脚本,但我觉得有人应该已经完成​​了它:)

6 个答案:

答案 0 :(得分:23)

创建一个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

答案 1 :(得分:10)

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

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

并通过打开新的shell终端. ~/.bashrcsource ~/.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个参数(而不是可以采用多个参数的一些实用程序,例如{{1}例如)。
  5. rm允许最多-P5个并行进程同时运行。如果您希望按顺序运行命令,只需删除整个5参数。这也允许您有两个命令变体(例如-P5adball) - 一个并行运行,另一个顺序运行。
  6. 要证明它是并行的,您可以运行包含睡眠的shell命令,例如:

    adbseq

    您可以使用它来运行您想要的任何$ adball shell "getprop ro.serialno ; date ; sleep 1 ; date ; getprop ro.serialno" 命令(是的,即使adb也可以!但是它可能看起来有点奇怪,因为两个日志都将并行流式传输到您的控制台,所以您将无法区分给定日志行来自哪个设备。


    这种方法优于@ dtmilano的adball logcat方法,只要至少有一个并行进程仍在运行,&将继续阻止shell:这意味着你可以突破只需使用xargs即可完成两个命令,就像您以前一样。使用dtmilano的方法,如果您要运行^C,那么两个logcat进程都将被后台化,因此您必须使用adb+ logcatps或{{}自己手动终止logcat进程。 1}}。使用xargs使其外观和感觉就像常规阻塞命令行一样,如果您只有一个设备,那么它将与kill完全相同。

答案 2 :(得分:3)

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

DEVICES=`adb devices | grep -v devices | grep device | cut -f 1`
for device in $DEVICES; do
    echo "$device $@ ..."
    adb -s $device $@
done

答案 3 :(得分:2)

添加〜/ .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)之外的每一行的设备ID /主机(第一列:NR>1)以删除&#34;所附设备清单&#34;标题行),然后gnu并行运行adb -s <HOSTNAME> <whatever-is-passed-to-the-alias>在任何非空行(-r)上按指定的顺序(-k,以避免随机顺序/最快的响应顺序)并在前面添加每一行为了清晰起见,on <DEVICE>:\t全部并行(-j0,可以设置另一个数字来定义应该并行运行多少adb而不是无限制。

:)

答案 4 :(得分:1)

adb wrapper支持为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

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

答案 5 :(得分:0)

这是Google上最高的结果,因此对于所有来此访问Windows的Windows用户,让​​我由用户this solution添加zingh(稍作修改即可接受任意命令,而不是“仅” {{1} }

批处理文件(install):

adball.bat

呼叫为:

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

({adball uninstall com.mypackage 接受所有输入参数,上面的代码行使得所有命令都照原样传递给adb,以便您可以键入多个单词,标志等。)