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

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

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

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

Solutions Collecting From Web of "在所有连接的设备上运行adb命令"

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

在@奥利的答案的基础上,这也将使命令(s)并行运行,使用xargs 。 只需将其添加到.bashrc文件中:

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

并通过打开一个新的shellterminal应用它. ~/.bashrc . ~/.bashrcsource ~/.bashrc

  1. 如果您只想在设备上运行(或仅在仿真器上运行),则可以通过删除不需要的(device|emulator)来更改(device|emulator) grep。 如上所述,该命令将在所有连接的设备和仿真器上运行。
  2. -J%参数指定您希望xargs将实用程序中第一次出现的%replace为pipe道左侧的值(stdin)。
    注意这是BSD(Darwin / Mac OS X) xargs 对于GNU / Linux xargs ,选项是-I%
  3. -t会导致xargs在运行之前打印即将运行的命令。
  4. -n1表示xargs在每个命令调用中最多只能使用1参数(而不是一些可以接受多个参数的实用程序,比如rm )。
  5. -P5允许最多5并行进程同时运行。 如果你想要顺序运行这些命令,只需删除整个-P5参数即可。 这也可以让你有两个变化的命令(例如adballadbseq ) – 一个并行运行,另一个依次运行。

为了certificate它是并行的,你可以运行一个包含睡眠的shell命令,例如:

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

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


这种方法比@ dtmilano的方法的好处在于,只要至less有一个并行进程仍在运行, xargs就会继续阻塞shell:这意味着只需使用^C即可跳出这两个命令,就像你习惯做。 用dtmilano的方法,如果你要运行adb+ logcat ,那么两个logcat进程都会后台运行,所以你必须使用pskill或者pkill手动杀死logcat进程。 使用xargs使它看起来和感觉就像普通的阻塞命令行一样,如果你只有一个设备,那么它就像adb一样工作。

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

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

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

从其自述文件:

 # 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 

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

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

🙂