有没有办法在所有连接的设备上运行 adb 命令?使用“adb uninstall com.example.android”从所有连接的设备上卸载应用程序。
我感兴趣的命令主要是安装和卸载。
我正在考虑为此编写一个 bash 脚本,但我觉得应该已经有人这样做了:)
创建一个 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
基于@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
命令的每次调用中使用参数(与某些可以采用多个参数的实用程序相反rm
,例如)。-P5
允许最多5
并行进程同时运行。如果您想按顺序运行命令,只需删除整个-P5
参数。这还允许您拥有命令的两种变体(例如adball
和adbseq
)——一种并行运行,另一种顺序运行。为了证明它是并行的,你可以运行一个包含 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 进程都将在后台运行,因此您必须自己使用ps
and kill
or手动终止 logcat 进程pkill
。使用 xargs 使它看起来和感觉就像一个常规的阻塞命令行,如果你只有一个设备,那么它的工作方式与adb
.
这是来自强大な的脚本的改进版本。原始版本与某些设备不匹配。
DEVICES=`adb devices | grep -v devices | grep device | cut -f 1`
for device in $DEVICES; do
echo "$device $@ ..."
adb -s $device $@
done
要添加 ~/.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>1
adb -s <HOSTNAME> <whatever-is-passed-to-the-alias>
-r
-k
on <DEVICE>:\t
-j0
:)
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
(免责声明:我已经写了一半)