Làm cách nào để sử dụng ADB Shell khi nhiều thiết bị được kết nối? Lỗi với lỗi: nhiều hơn một thiết bị và trình giả lập


491
$ adb --help

...

-s SERIAL  use device with given serial (overrides $ANDROID_SERIAL)

...

$ adb devices
List of devices attached 
emulator-5554 device
7f1c864e  device

...

$ adb shell -s 7f1c864e
error: more than one device and emulator

?

Câu trả lời:


852

Sử dụng -stùy chọn TRƯỚC lệnh để chỉ định thiết bị, ví dụ:

adb -s 7f1c864e shell

Xem thêm http://developer.android.com/tools/help/adb.html#directingcommands


30
Đối với trình giả lập, bạn sử dụng IP và cổng làm id, ví dụ:adb -s 192.168.56.101:5555 shell
Jason Hartley

2
Đối với một trình giả lập sử dụng adb -e shellhoặc adb emu <command>. Họ sẽ thất bại nếu có nhiều hơn một trình giả lập và bạn sẽ phải quay lại-s
Corey Ogburn

1
Lưu ý bạn phải sử dụng -stùy chọn trước shell. Đó là một trải nghiệm người dùng rất tệ mà bạn không thể làm điều này theo cách khác ...
baptx

275

adb -d shell(hoặc adb -e shell).

Lệnh này sẽ giúp bạn trong hầu hết các trường hợp, nếu bạn quá lười để nhập ID đầy đủ.

Từ http://developer.android.com/tools/help/adb.html#commandsummary :

-d- Hướng lệnh adb đến thiết bị USB được đính kèm duy nhất . Trả về lỗi khi có nhiều thiết bị USB được gắn vào.

-e- Hướng lệnh adb đến trình giả lập duy nhất đang chạy . Trả về lỗi khi có nhiều trình giả lập đang chạy.


6
Rất hữu ích nếu bạn chỉ có một thiết bị USB và một trình giả lập, mà tôi tưởng tượng là hầu hết mọi người. Cảm ơn!
Joshua Pinter

8
Và chỉ cần một chút ghi nhớ để giúp nhớ nó mỗi lần -dlà dành cho "thiết bị"-edành cho "trình giả lập" . Và nếu bạn đã tìm ra điều này, hãy cho mình một cái vỗ nhẹ vào lưng. ;)
Joshua Pinter

32

Một cách khác là đặt biến môi trường ANDROID_SERIAL thành sê-ri có liên quan, ở đây giả sử bạn đang sử dụng Windows:

set ANDROID_SERIAL="7f1c864e"
echo %ANDROID_SERIAL%
"7f1c864e"

Sau đó, bạn có thể sử dụng adb.exe shellmà không có bất kỳ vấn đề.


1
Nên set ANDROID_SERIAL=7f1c864e, tức là. không có dấu ngoặc kép.
Bjonnfesk

Đối với bash, nó nên được export ANDROID_SERIAL=7f1c864e.
nivekmai

29

Tôi đã tìm thấy câu hỏi này sau khi thấy lỗi 'nhiều hơn một thiết bị', với 2 điện thoại ngoại tuyến hiển thị:

C:\Program Files (x86)\Android\android-sdk\android-tools>adb devices
List of devices attached
SH436WM01785    offline
SH436WM01785    offline
SH436WM01785    sideload

Nếu bạn chỉ có một thiết bị được kết nối, hãy chạy các lệnh sau để thoát khỏi các kết nối ngoại tuyến:

adb kill-server
adb devices

adb kill-serverkhắc phục sự cố với trình giả lập ngoại tuyến
Morten Holmgaard

adb kill-server cũng giúp để thoát khỏi một số thiết bị giả lập-nnnn đó đã ám ảnh sdk của tôi (vì nó được kéo như một bản sao từ Android Studio)
Martin Zaske

6

Đây ý chính sẽ làm hầu hết các công việc cho bạn thấy một menu khi có nhiều thiết bị kết nối:

$ adb $(android-select-device) shell
1) 02783201431feeee device 3) emulator-5554
2) 3832380FA5F30000 device 4) emulator-5556
Select the device to use, <Q> to quit:

Để tránh gõ, bạn chỉ cần tạo một bí danh bao gồm lựa chọn thiết bị như được giải thích ở đây .


1
Có vẻ tốt đẹp. Quá tệ, nó không tương thích với Windows (bao gồm cả Cygwin).
Sébastien

4

Người dùng @janotđã đề cập đến vấn đề này ở trên, nhưng điều này khiến tôi mất một thời gian để lọc giải pháp tốt nhất.

Có hai trường hợp sử dụng Broad:

1) 2 phần cứng được kết nối, đầu tiên là trình giả lập và khác là Thiết bị.
Giải pháp : adb -e shell....whatever-commandcho trình giả lập và adb -d shell....whatever-commandcho thiết bị.

2) n số thiết bị được kết nối (tất cả các giả lập hoặc điện thoại / Viên nén) qua USB / ADB-WiFi:

Giải pháp : Bước 1) chạy adb devicesnày sẽ cho bạn danh sách các thiết bị hiện đang kết nối (qua USB hoặc ADBoverWiFI)
Bước 2) bây giờ chạy adb -s <device-id/IP-address> shell....whatever-command bất kể có bao nhiều thiết bị bạn có.

Ví dụ
để xóa dữ liệu ứng dụng trên thiết bị được kết nối trên wifi ADB tôi sẽ thực hiện:
adb -s 172.16.34.89:5555 shell pm clear com.package-id

để xóa dữ liệu ứng dụng được kết nối trên thiết bị kết nối usb của tôi, tôi sẽ thực hiện:
adb -s 5210d21be2a5643d shell pm clear com.package-id


4

Để cài đặt apk trên một trong các trình giả lập của bạn:

Đầu tiên lấy danh sách các thiết bị:

-> adb devices
List of devices attached
25sdfsfb3801745eg        device
emulator-0954   device

Sau đó cài đặt apk trên trình giả lập của bạn với -scờ:

-> adb -s "25sdfsfb3801745eg" install "C:\Users\joel.joel\Downloads\release.apk"
Performing Streamed Install
Success

Hy vọng điều này sẽ giúp được ai đó!


3

Chạy các lệnh adb trên tất cả các thiết bị được kết nối

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 $@ ..."
    adb -s $device $@
fi

thực hiện sử dụng nó với

lệnh adb + // +


Tôi nghĩ bạn nên tạo một tệp .bat cho windows và thực thi. Tôi không chắc chắn tôi đã không thử nghiệm điều này với các cửa sổ.
Shivaraj Patil

Dưới đây là một lớp lót để chạy lệnh trên mọi thiết bị được kết nối (trong trường hợp này, cài đặt apk): thiết bị adb | awk 'FNR> 1 {in $ 1}' | trong khi đọc dòng; làm adb -s $ dòng cài đặt the-app.apk; xong
Pedro Lopes

3

Đối với Windows, đây là ví dụ nhanh về cách cài đặt tệp..trên nhiều thiết bị

FOR /F "skip=1"  %x IN ('adb devices') DO start adb -s %x install -r myandroidapp.apk

Nếu bạn dự định bao gồm điều này trong một tệp bó, hãy thay thế% x bằng %% x, như bên dưới

FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r myandroidapp.apk

1

Tạo một Bash (tools.sh) để chọn một chuỗi từ các thiết bị (hoặc trình giả lập):

clear;
echo "====================================================================================================";
echo " ADB DEVICES";
echo "====================================================================================================";
echo "";

adb_devices=( $(adb devices | grep -v devices | grep device | cut -f 1)#$(adb devices | grep -v devices | grep device | cut -f 2) );

if [ $((${#adb_devices[@]})) -eq "1" ] && [ "${adb_devices[0]}" == "#" ]
then
    echo "No device found";
    echo ""; 
    echo "====================================================================================================";
    device=""
    // Call Main Menu function fxMenu;
else
    read -p "$(
        f=0
        for dev in "${adb_devices[@]}"; do
            nm="$(echo ${dev} | cut -f1 -d#)";
            tp="$(echo ${dev} | cut -f2 -d#)";
            echo " $((++f)). ${nm} [${tp}]";
        done

        echo "";
        echo " 0. Quit"
        echo "";

        echo "====================================================================================================";
        echo "";
        echo ' Please select a device: '
    )" selection

    error="You think it's over just because I am dead. It's not over. The games have just begun.";
    // Call Validation Numbers fxValidationNumberMenu ${#adb_devices[@]} ${selection} "${error}" 
    case "${selection}" in
        0)
            // Call Main Menu function fxMenu;
        *)  
            device="$(echo ${adb_devices[$((selection-1))]} | cut -f1 -d#)";
            // Call Main Menu function fxMenu;
    esac
fi

Sau đó, trong một tùy chọn khác có thể sử dụng adb -s(tùy chọn toàn cầu -s sử dụng thiết bị có số sê-ri đã cho ghi đè $ ANDROID_SERIAL):

adb -s ${device} <command>

Tôi đã thử nghiệm mã này trên thiết bị đầu cuối MacOS, nhưng tôi nghĩ nó có thể được sử dụng trên các cửa sổ trên Git Bash Terminal.

Cũng nhớ cấu hình các biến môi trường và đường dẫn SDK Android trên .bash_profiletệp:

export ANDROID_HOME="/usr/local/opt/android-sdk/"
export PATH="$ANDROID_HOME/platform-tools:$PATH"
export PATH="$ANDROID_HOME/tools:$PATH"

Sử dụng Ubuntu 16.04: / home / user / bin / select_device: dòng 35: fxValidationNumberMothy: lệnh không tìm thấy / home / user / bin / select_device: dòng 41: fxMothy: lệnh không tìm thấy
gerbit

@gerbit fxMenufxValidatonNumberMenuchỉ để tham khảo. Tôi đã nhận xét nó để tránh mã lỗi. Bạn có thể thấy một triển khai hoàn chỉnh trên kho lưu trữ của tôi: github.com/equiman/hardhatmac/blob/master/tools.sh
Equiman

0

Cách tốt nhất để chạy shell trên bất kỳ thiết bị cụ thể nào là sử dụng:

adb -s << emulator UDID >> shell

For Example:
adb -s emulator-5554 shell

Hoạt động 100%

Xin vui lòng cho nó một cú nhảy lên


0

Đây là một kịch bản shell tôi tự làm cho mình:

#! /bin/sh

for device in `adb devices | awk '{print $1}'`; do
  if [ ! "$device" = "" ] && [ ! "$device" = "List" ]
  then
    echo " "
    echo "adb -s $device $@"
    echo "------------------------------------------------------"
    adb -s $device $@
  fi
done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.