繁体   English   中英

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

[英]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 . ~/.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参数(与某些可以采用多个参数的实用程序相反,例如rm )。
  5. -P5允许最多5并行进程同时运行。 如果您想按顺序运行命令,只需删除整个-P5参数。 这还允许您使用命令的两种变体(例如adballadbseq )——一种并行运行,另一种顺序运行。

为了证明它是并行的,你可以运行一个包含 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 进程都将在后台运行,因此您必须自己使用pskillpkill手动终止 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM