2013-07-26 64 views
19

有沒有在所有連接的設備上運行adb命令的方法?使用「adb uninstall com.example.android」從所有連接的設備上卸載應用程序。在所有連接的設備上運行adb命令

我感興趣的命令主要是安裝和卸載。

我考慮寫一個bash腳本這一點,但我覺得應該有人已經做了吧:)

回答

17

創建一個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 
+0

很好用!謝謝!現在唯一缺少的東西就是並行執行:) – Heinrisch

+9

'adb -s $ device $ @&'將並行執行 –

+0

@Oli非常感謝...保存了我的時間(y) –

9

建立在@奧利的答案上,這也將讓命令(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應用它。

  1. 如果你只希望在設備上運行(或者只在仿真器),可以通過刪除你不想要的改變(device|emulator) grep的。如上所述,該命令將在全部連接的設備和仿真器上運行。
  2. -J%參數指定您希望xargs將實用程序中第一次出現的%替換爲管道左側的值(stdin)。
    注意這是爲BSD(達爾文/ Mac OS X)xargs。對於GNU/Linux xargs,選項是-I%
  3. -t將導致xargs在運行之前打印即將運行的命令。
  4. -n1裝置xargs的只應在命令的每個調用至多1參數中使用(相對於某些實用程序,其可以採取多個參數,如rm例如)。
  5. -P5允許最多5並行進程同時運行。如果您想要順序運行命令,只需刪除整個-P5參數。這也允許你有兩個變化的命令(例如adballadbseq) - 一個並行運行,另一個依次運行。

證明它是平行的,你可以運行,其中包括在其睡眠,例如一個shell命令:

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

你可以用它來運行任何你想要的adb命令(是的,即使adball logcat也能正常工作!但它可能看起來有點奇怪,因爲兩個日誌將並行傳輸到您的控制檯,所以您將無法區分給定日誌行來自哪個設備)。


這種方法在@ dtmilano的&方法的好處是,xargs將繼續阻止殼並行處理作爲只要至少一個仍在運行:這意味着你可以擺脫這兩個命令只需使用^C即可,就像您以前所做的一樣。使用dtmilano的方法,如果要運行adb+ logcat,那麼兩個logcat進程都會後臺進行,因此您必須使用pskill或自己手動終止logcat進程。使用xargs使它看起來和感覺就像普通的阻塞命令行一樣,如果你只有一個設備,那麼它就像adb一樣工作。

+0

您使用的是哪個版本的xargs?我沒有找到任何包含選項-J%的記錄版本。有其他選擇嗎?我想在msysgit(xargs GNU findutils版本4.4.2)的背景下在mingw/msys上使用xargs的adball。 –

+0

我認爲GNU xargs的命令應該是-I%而不是-J%。 –

+0

@CarlosSobrinho,謝謝你;經過測試,看起來你在GNU/Linux上是正確的。 '-I%'選項適用於BSD/Darwin/Mac OS X.我編輯了答案以澄清並給出GNU版本。 – Joe

1

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 

(免責聲明:這我已經寫了一半)

2

這是強大な腳本的改進版本。原始版本與某些設備不匹配。

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 
1

要在〜/ .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而不是無限)。

:)

相關問題