有沒有在所有連接的設備上運行adb命令的方法?使用「adb uninstall com.example.android」從所有連接的設備上卸載應用程序。在所有連接的設備上運行adb命令
我感興趣的命令主要是安裝和卸載。
我考慮寫一個bash腳本這一點,但我覺得應該有人已經做了吧:)
有沒有在所有連接的設備上運行adb命令的方法?使用「adb uninstall com.example.android」從所有連接的設備上卸載應用程序。在所有連接的設備上運行adb命令
我感興趣的命令主要是安裝和卸載。
我考慮寫一個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 [email protected] ..."
adb -s $device [email protected]
fi
done
與
使用adb+ //+ command
建立在@奧利的答案上,這也將讓命令(s)並行運行,使用xargs
。只需添加到您的.bashrc
文件:
function adball()
{
adb devices | egrep '\t(device|emulator)' | cut -f 1 | xargs -t -J% -n1 -P5 \
adb -s % "[email protected]"
}
,並打開一個新的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
) - 一個並行運行,另一個依次運行。證明它是平行的,你可以運行,其中包括在其睡眠,例如一個shell命令:
$ adball shell "getprop ro.serialno ; date ; sleep 1 ; date ; getprop ro.serialno"
你可以用它來運行任何你想要的adb
命令(是的,即使adball logcat
也能正常工作!但它可能看起來有點奇怪,因爲兩個日誌將並行傳輸到您的控制檯,所以您將無法區分給定日誌行來自哪個設備)。
這種方法在@ dtmilano的&
方法的好處是,xargs
將繼續阻止殼並行處理作爲只要至少一個仍在運行:這意味着你可以擺脫這兩個命令只需使用^C
即可,就像您以前所做的一樣。使用dtmilano的方法,如果要運行adb+ logcat
,那麼兩個logcat進程都會後臺進行,因此您必須使用ps
和kill
或自己手動終止logcat進程。使用xargs使它看起來和感覺就像普通的阻塞命令行一樣,如果你只有一個設備,那麼它就像adb
一樣工作。
您使用的是哪個版本的xargs?我沒有找到任何包含選項-J%的記錄版本。有其他選擇嗎?我想在msysgit(xargs GNU findutils版本4.4.2)的背景下在mingw/msys上使用xargs的adball。 –
我認爲GNU xargs的命令應該是-I%而不是-J%。 –
@CarlosSobrinho,謝謝你;經過測試,看起來你在GNU/Linux上是正確的。 '-I%'選項適用於BSD/Darwin/Mac OS X.我編輯了答案以澄清並給出GNU版本。 – Joe
adb wrapper支持爲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
(免責聲明:這我已經寫了一半)
這是強大な腳本的改進版本。原始版本與某些設備不匹配。
DEVICES=`$ADB devices | grep -v devices | grep device | cut -f 1`
for device in $DEVICES; do
echo "$device [email protected] ..."
adb -s $device [email protected]
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
提取的裝置ID /主機(第一列:print $1
)每行的第一個除外(NR>1
)至刪除「附加設備列表」標題行),然後gnu並行在任何非空行上運行adb -s <HOSTNAME> <whatever-is-passed-to-the-alias>
((-k
,爲了避免隨機順序/最快響應順序),並且爲了清晰起見,每行都用on <DEVICE>:\t
並列(-j0
,可能設置另一個數字來定義應該並行運行多少個adb而不是無限)。
:)
很好用!謝謝!現在唯一缺少的東西就是並行執行:) – Heinrisch
'adb -s $ device $ @&'將並行執行 –
@Oli非常感謝...保存了我的時間(y) –