30

接続されているすべてのデバイスで adb コマンドを実行する方法はありますか? 「adb uninstall com.example.android」を使用して、接続されているすべてのデバイスからアプリをアンインストールします。

私が興味を持っているコマンドは、主にインストールとアンインストールです。

私はこれのために bash スクリプトを書くことを考えていましたが、誰かがすでにそれを行うべきだったように感じます :)

4

6 に答える 6

30

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
于 2013-07-26T13:27:34.457 に答える
12

@Oliの回答に基づいて構築すると、これにより、コマンドを並行して実行できるようになりxargsます. .bashrcこれをファイルに追加するだけです:

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

新しいシェル ターミナル、、、. ~/.bashrcまたはを開いて適用しますsource ~/.bashrc

  1. デバイスでのみ (またはエミュレーターでのみ) 実行したい場合は、(device|emulator)不要なものを削除して grep を変更できます。上記のコマンドは、接続されているすべてのデバイスとエミュレーターで実行されます。
  2. この-J%引数は、xargs が%ユーティリティで最初に出現する をパイプの左側 (stdin) からの値に置き換えることを指定します。
    :これは BSD (Darwin / Mac OS X) 用xargsです。GNU/Linuxxargsの場合、オプションは-I%です。
  3. -txargs は、実行しようとしているコマンドを実行する直前に出力します。
  4. -n1xargs は、コマンドの各呼び出しで最大でも引数のみを使用する必要があることを意味します (たとえば、複数の引数を取ることができる1一部のユーティリティとは対照的です)。rm
  5. -P5最大で5並列プロセスを同時に実行できます。コマンドを順番に実行したい場合は、単に-P5引数全体を削除してください。adballこれにより、コマンドの 2 つのバリエーション (となど)を使用することもできますadbseq。1 つは並行して実行され、もう 1 つは順次実行されます。

並列であることを証明するには、スリープを含むシェルコマンドを実行できます。次に例を示します。

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

これを使用して、任意のadbコマンドを実行できます (はい、adball logcat動作します! ただし、両方のログがコンソールに並行してストリーミングされるため、少し奇妙に見えるかもしれません。そのため、特定のログがどのデバイスであるかを区別することはできません)。行はから来ています)。


@dtmilano の&アプローチに対するこのアプローチの利点xargsは、並列プロセスの少なくとも 1 つがまだ実行されている限り、シェルをブロックし続けることです。つまり、使用されているの^Cと同じように、を使用するだけで両方のコマンドから抜け出すことができます。すること。dtmilano のアプローチでは、 を実行すると、両方の logcat プロセスがバックグラウンド化されるため、およびまたはadb+ logcatを使用して手動で logcat プロセスを強制終了する必要があります。xargs を使用すると、通常のブロッキング コマンド ラインと同じようなルック アンド フィールになります。デバイスが 1 つしかない場合は、.pskillpkilladb

于 2014-05-20T14:46:56.900 に答える
4

~/.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のデバイス ID/ホスト (最初の列: ) を抽出して、「接続されているデバイスのリスト」ヘッダー行を削除します)、次に gnu 並列が空でない行 ( ) で順番に実行されます( 、ランダムな順序/最速の応答順序を避けるため) を指定し、明確にするために各行の前にすべてを並列に追加します ( 、別の数値を設定して、無制限ではなく並行して実行する必要がある adb の数を定義できます)。print $1NR>1adb -s <HOSTNAME> <whatever-is-passed-to-the-alias>-r-kon <DEVICE>:\t-j0

:)

于 2017-11-20T13:03:38.790 に答える
2

adb ラッパーは、adb コマンドと並列実行の複数のターゲットの選択をサポートしています。

そのREADMEから:

# 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

(免責事項:私はそれの半分を書きました)

于 2015-04-05T11:25:28.760 に答える