2013-07-26 40 views
19

Có cách nào để chạy các lệnh adb trên tất cả các thiết bị được kết nối không? Để gỡ cài đặt ứng dụng khỏi tất cả các thiết bị được kết nối với "adb uninstall com.example.android".Chạy các lệnh adb trên tất cả các thiết bị được kết nối

Các lệnh mà tôi quan tâm chủ yếu là cài đặt và gỡ cài đặt.

Tôi đã suy nghĩ về cách viết một kịch bản bash cho điều này, nhưng tôi cảm thấy như ai đó nên đã làm nó đã :)

Trả lời

17

Tạo một 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 

sử dụng nó với

adb+ //+ command 
+0

Hoạt động tuyệt vời! Cảm ơn! Điều duy nhất còn thiếu bây giờ là làm điều đó song song :) – Heinrisch

+9

'adb -s $ device $ @ &' sẽ làm song song –

+0

@Oli Cảm ơn rất nhiều ... đã tiết kiệm thời gian của tôi (y) –

9

Xây dựng câu trả lời của @ Oli, điều này cũng sẽ cho phép (các) lệnh chạy song song, sử dụng xargs. Chỉ cần thêm video này vào tập tin .bashrc của bạn:

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

và áp dụng nó bằng cách mở một terminal vỏ mới, . ~/.bashrc, hoặc source ~/.bashrc.

  1. Nếu bạn chỉ muốn chạy trên thiết bị (hoặc chỉ trên trình mô phỏng), bạn có thể thay đổi (device|emulator) grep bằng cách xóa một trong những bạn không muốn. Lệnh này như được viết ở trên sẽ chạy trên tất cả các thiết bị và trình mô phỏng đi kèm.
  2. đối số -J% chỉ định rằng bạn muốn xargs thay thế sự xuất hiện đầu tiên của % trong tiện ích với giá trị từ phía bên trái của đường ống (stdin).
    LƯU Ý: điều này là dành cho BSD (Darwin/Mac OS X) xargs. Đối với GNU/Linux xargs, tùy chọn là -I%.
  3. -t sẽ khiến xargs in lệnh mà lệnh sắp chạy ngay trước khi chạy.
  4. -n1 nghĩa xargs chỉ nên sử dụng tối đa 1 lập luận trong mỗi lời gọi của lệnh (như trái ngược với một số tiện ích mà có thể mất nhiều đối số, như rm ví dụ).
  5. -P5 cho phép tối đa 5 quy trình song song để chạy đồng thời. Thay vào đó, nếu bạn muốn chạy các lệnh một cách tuần tự, chỉ cần xóa toàn bộ đối số -P5. Điều này cũng cho phép bạn có hai biến thể của lệnh (ví dụ: adballadbseq) - một biến chạy song song, lệnh khác theo tuần tự.

Để chứng minh rằng nó là song song, bạn có thể chạy một lệnh shell trong đó bao gồm một giấc ngủ ở trong đó, ví dụ:

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

Bạn có thể sử dụng để chạy bất kỳ lệnh adb bạn muốn (có, thậm chí adball logcat sẽ hoạt động! nhưng có vẻ hơi lạ vì cả hai bản ghi sẽ được truyền trực tiếp tới bảng điều khiển của bạn song song, vì vậy bạn sẽ không thể phân biệt thiết bị nào có dòng nhật ký cụ thể đến).


Lợi ích của phương pháp này so với phương pháp & @ dtmilano là rằng xargs sẽ tiếp tục chặn vỏ miễn là ít nhất một trong các quá trình song song vẫn chạy: có nghĩa là bạn có thể thoát ra khỏi tất cả các lệnh của chỉ cần sử dụng ^C, giống như bạn đã từng làm. Với phương pháp tiếp cận của dtmilano, nếu bạn chạy adb+ logcat, thì cả hai quy trình logcat sẽ được tạo nền và do đó bạn sẽ phải tự tay giết quy trình logcat bằng cách sử dụng pskill hoặc pkill. Sử dụng xarg làm cho nó trông và cảm thấy giống như một dòng lệnh chặn thường xuyên, và nếu bạn chỉ có một thiết bị, thì nó sẽ hoạt động chính xác như adb.

+0

Bạn sử dụng phiên bản xarg nào? Tôi không tìm thấy bất kỳ phiên bản được tài liệu nào bao gồm tùy chọn -J%.Có lựa chọn thay thế nào không? Tôi muốn sử dụng adball với xargs trên mingw/msys trong ngữ cảnh của msysgit (xargs GNU findutils phiên bản 4.4.2). –

+0

Tôi nghĩ rằng lệnh phải là -I% và không -J% cho GNU xargs. –

+0

@CarlosSobrinho, cảm ơn vì điều đó; thử nghiệm và có vẻ như bạn đã đúng trên GNU/Linux. Tùy chọn '-I%' là dành cho BSD/Darwin/Mac OS X. Tôi đã chỉnh sửa câu trả lời để làm rõ và cung cấp phiên bản GNU. – Joe

1

adb wrapper hỗ trợ chọn nhiều mục tiêu cho lệnh adb và thực thi song song.

Từ README của nó:

# 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 

(Disclaimer: Tôi đã viết một nửa của nó)

2

Đây là một phiên bản cải tiến của kịch bản từ 強大 な. Phiên bản gốc không khớp với một số thiết bị.

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

Để thêm trong ~/.bashrc hoặc ~/zshrc:

alias adb-all="adb devices | awk 'NR>1{print \$1}' | parallel -rkj0 --tagstring 'on {}: ' adb -s {}"

Ví dụ:

  • $ 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

Giải thích: awk chiết xuất thiết bị id/máy chủ (cột đầu tiên: print $1) của tất cả các dòng ngoại trừ thứ nhất (NR>1) để loại bỏ dòng tiêu đề "Danh sách thiết bị được đính kèm"), sau đó chạy song song gnu adb -s <HOSTNAME> <whatever-is-passed-to-the-alias> trên bất kỳ dòng nào không trống ()) theo thứ tự được chỉ định (-k, để tránh thứ tự ngẫu nhiên/phản hồi nhanh nhất) và thêm mỗi dòng với on <DEVICE>:\t để rõ ràng, tất cả song song (-j0, có thể đặt số khác để xác định số lượng adb sẽ được chạy song song thay vì vô hạn).

:)

Các vấn đề liên quan