接続されているすべてのデバイスで 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 % "$@"
}
新しいシェル ターミナル、、、. ~/.bashrc
またはを開いて適用しますsource ~/.bashrc
。
(device|emulator)
不要なものを削除して grep を変更できます。上記のコマンドは、接続されているすべてのデバイスとエミュレーターで実行されます。-J%
引数は、xargs が%
ユーティリティで最初に出現する をパイプの左側 (stdin) からの値に置き換えることを指定します。xargs
です。GNU/Linuxxargs
の場合、オプションは-I%
です。-t
xargs は、実行しようとしているコマンドを実行する直前に出力します。-n1
xargs は、コマンドの各呼び出しで最大でも引数のみを使用する必要があることを意味します (たとえば、複数の引数を取ることができる1
一部のユーティリティとは対照的です)。rm
-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 つしかない場合は、.ps
kill
pkill
adb
~/.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 $1
NR>1
adb -s <HOSTNAME> <whatever-is-passed-to-the-alias>
-r
-k
on <DEVICE>:\t
-j0
:)
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
(免責事項:私はそれの半分を書きました)