[英]Running adb commands on all connected devices
有没有办法在所有连接的设备上运行 adb 命令? 使用“adb uninstall com.example.android”从所有连接的设备上卸载应用程序。
我感兴趣的命令主要是安装和卸载。
我正在考虑为此编写一个 bash 脚本,但我觉得应该已经有人这样做了:)
创建一个 bash 文件并将其命名为例如adb+
:
#!/bin/bash
adb devices | while read -r 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
. ~/.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
和kill
或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
要添加 ~/.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>
以指定的顺序( -k
,以避免随机顺序/最快响应顺序)在任何非空行( -r
)上,并在每一行前面加上on <DEVICE>:\t
为清楚起见,全部并行( -j0
,可以设置另一个数字来定义应该并行运行多少个 adb 而不是无限)。
:)
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
(免责声明:我已经写了一半)
这是谷歌上的最高结果,所以对于来到这里的所有 Windows 用户,让我通过 User zingh添加这个解决方案(稍微修改以接受任意命令,而不是“仅” install
批处理文件( adball.bat
):
FOR /F "skip=1" %%x IN ('adb devices') DO start adb -s %%x %*
调用为:
adball uninstall com.mypackage
( %*
接受所有输入参数,我上面的行使所有命令按原样传递给 adb,以便您可以键入多个单词、标志等)
注意:如果您安装了Powershell
-plugin,您甚至可以直接从 Android Studio“全部运行”弹出窗口中使用它。 您可以将adball
添加到路径中,然后双击ctrl
并运行
powershell adball uninstall com.mypackage
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.