有没有办法在所有连接的设备上运行adb命令?要使用“adb uninstall com.example.android”从所有连接的设备卸载应用程序。
我感兴趣的命令主要是安装和卸载。
我正在考虑为此编写一个bash脚本,但我觉得有人应该已经完成了它:)
答案 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终端. ~/.bashrc
或source ~/.bashrc
来应用它。
(device|emulator)
grep。上面写的此命令将在所有连接的设备和模拟器上运行。-J%
参数指定您希望xargs将实用程序中第一次出现的%
替换为管道左侧的值(stdin)。 xargs
。对于GNU / Linux xargs
,选项为-I%
。-t
将导致xargs在运行之前立即打印它将要运行的命令。-n1
表示xargs在每次调用命令时最多只能使用1
个参数(而不是可以采用多个参数的一些实用程序,例如{{1}例如)。rm
允许最多-P5
个并行进程同时运行。如果您希望按顺序运行命令,只需删除整个5
参数。这也允许您有两个命令变体(例如-P5
和adball
) - 一个并行运行,另一个顺序运行。要证明它是并行的,您可以运行包含睡眠的shell命令,例如:
adbseq
您可以使用它来运行您想要的任何$ adball shell "getprop ro.serialno ; date ; sleep 1 ; date ; getprop ro.serialno"
命令(是的,即使adb
也可以!但是它可能看起来有点奇怪,因为两个日志都将并行流式传输到您的控制台,所以您将无法区分给定日志行来自哪个设备。
这种方法优于@ dtmilano的adball logcat
方法,只要至少有一个并行进程仍在运行,&
将继续阻止shell:这意味着你可以突破只需使用xargs
即可完成两个命令,就像您以前一样。使用dtmilano的方法,如果您要运行^C
,那么两个logcat进程都将被后台化,因此您必须使用adb+ logcat
和ps
或{{}自己手动终止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,以便您可以键入多个单词,标志等。)