Bagaimana cara menggunakan ADB Shell ketika Berbagai Perangkat terhubung? Gagal dengan "kesalahan: lebih dari satu perangkat dan emulator"

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

?

Jackie
sumber

Jawaban:

853

Gunakan -sopsi SEBELUM perintah untuk menentukan perangkat, misalnya:

adb -s 7f1c864e shell

Lihat juga http://developer.android.com/tools/help/adb.html#directingcommands

janot
sumber
30
Untuk emulator, Anda menggunakan IP dan port sebagai id, misalnya:adb -s 192.168.56.101:5555 shell
Jason Hartley
2
Untuk penggunaan emulator adb -e shellatau adb emu <command>. Mereka akan gagal jika ada lebih dari satu emulator pergi dan Anda harus kembali ke-s
Corey Ogburn
1
Catatan Anda harus menggunakan -sopsi ini sebelumnya shell. Ini adalah pengalaman pengguna yang sangat buruk sehingga Anda tidak dapat melakukan hal sebaliknya ...
baptx
275

adb -d shell(atau adb -e shell).

Perintah ini akan membantu Anda dalam sebagian besar kasus, jika Anda terlalu malas untuk mengetik ID lengkap.

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

-d- Arahkan perintah adb ke satu-satunya perangkat USB yang terpasang . Mengembalikan kesalahan ketika lebih dari satu perangkat USB terpasang.

-e- Arahkan perintah adb ke satu-satunya emulator yang sedang berjalan . Mengembalikan kesalahan ketika lebih dari satu emulator sedang berjalan.

Sazzad Hissain Khan
sumber
6
Sangat berguna jika Anda hanya memiliki satu perangkat USB dan satu emulator, yang saya bayangkan kebanyakan orang. Terima kasih!
Joshua Pinter
8
Dan hanya sedikit mnemonik untuk membantu mengingatnya setiap kali -duntuk "perangkat" dan -euntuk "emulator" . Dan jika Anda sudah menemukan jawabannya, beri tepukan pada diri Anda sendiri. ;)
Joshua Pinter
32

Alternatif lain adalah dengan menetapkan variabel lingkungan ANDROID_SERIAL ke serial yang relevan, di sini dengan asumsi Anda menggunakan Windows:

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

Kemudian Anda dapat menggunakannya adb.exe shelltanpa masalah.

monotux
sumber
1
Seharusnya set ANDROID_SERIAL=7f1c864e, yaitu. tanpa kutipan.
Bjonnfesk
Untuk bash, seharusnya begitu export ANDROID_SERIAL=7f1c864e.
nivekmai
29

Saya menemukan pertanyaan ini setelah melihat kesalahan 'lebih dari satu perangkat', dengan 2 telepon offline menunjukkan:

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

Jika Anda hanya memiliki satu perangkat yang terhubung, jalankan perintah berikut untuk menyingkirkan koneksi offline:

adb kill-server
adb devices
Danny Beckett
sumber
adb kill-servermemperbaiki masalah dengan emulator offline
Morten Holmgaard
adb kill-server juga membantu menyingkirkan beberapa perangkat emulator-nnnn yang menghantui SDK saya (karena itu diambil sebagai salinan dari Android Studio)
Martin Zaske
6

Intisari ini akan melakukan sebagian besar pekerjaan untuk Anda menampilkan menu ketika ada beberapa perangkat yang terhubung:

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

Untuk menghindari mengetik, Anda cukup membuat alias yang menyertakan pemilihan perangkat seperti yang dijelaskan di sini .

Diego Torres Milano
sumber
1
Terlihat bagus. Sayang sekali itu tidak kompatibel dengan Windows (termasuk Cygwin).
Sébastien
4

Pengguna @janottelah menyebutkan ini di atas, tetapi ini butuh waktu untuk menyaring solusi terbaik.

Ada dua kasus penggunaan luas:

1) 2 perangkat keras terhubung, pertama adalah emulator dan lainnya adalah Perangkat.
Solusi : adb -e shell....whatever-commanduntuk emulator dan adb -d shell....whatever-commanduntuk perangkat.

2) n jumlah perangkat yang terhubung (semua emulator atau Ponsel / Tablet) melalui USB / ADB-WiFi:

Solusi : Langkah1) jalankan adb devicesINI akan memberi Anda daftar perangkat yang saat ini terhubung (melalui USB atau ADBoverWiFI) Langkah2
) sekarang berjalan adb -s <device-id/IP-address> shell....whatever-command tidak peduli seberapa banyak perangkat yang Anda miliki.

Contoh
untuk menghapus data aplikasi pada perangkat yang terhubung pada wifi ADB yang akan saya jalankan:
adb -s 172.16.34.89:5555 shell pm clear com.package-id

untuk menghapus data aplikasi yang terhubung pada perangkat yang terhubung dengan usb, saya akan menjalankan:
adb -s 5210d21be2a5643d shell pm clear com.package-id

sud007
sumber
4

Untuk menginstal apk di salah satu emulator Anda:

Pertama-tama dapatkan daftar perangkat:

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

Kemudian instal apk pada emulator Anda dengan -sbendera:

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

Semoga ini bisa membantu seseorang!

pelikan
sumber
3

Menjalankan perintah adb di semua perangkat yang terhubung

Buat 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

selesai menggunakannya dengan

adb + // + command

Shivaraj Patil
sumber
Saya pikir Anda harus membuat file .bat untuk windows dan menjalankannya. Saya tidak yakin saya belum menguji ini dengan windows.
Shivaraj Patil
Berikut ini adalah satu baris untuk menjalankan perintah pada setiap perangkat yang terhubung (dalam hal ini, instal apk): perangkat adb | awk 'FNR> 1 {print $ 1}' | saat membaca baris; lakukan adb -s $ line instal-app.apk; selesai
Pedro Lopes
3

Untuk Windows, berikut ini adalah contoh cepat 1 liner tentang cara menginstal file..pada banyak perangkat

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

Jika Anda berencana untuk memasukkan ini dalam file batch, ganti% x dengan %% x, seperti di bawah ini

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

Buat Bash (tools.sh) untuk memilih serial dari perangkat (atau emulator):

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

Kemudian di opsi lain dapat menggunakan adb -s(opsi global -s gunakan perangkat dengan nomor seri yang diberikan yang menimpa $ ANDROID_SERIAL):

adb -s ${device} <command>

Saya menguji kode ini pada terminal MacOS, tetapi saya pikir ini dapat digunakan pada windows di Terminal Git Bash.

Juga ingat konfigurasikan variabel lingkungan dan jalur Android SDK pada .bash_profilefile:

export ANDROID_HOME="/usr/local/opt/android-sdk/"
export PATH="$ANDROID_HOME/platform-tools:$PATH"
export PATH="$ANDROID_HOME/tools:$PATH"
Equiman
sumber
Menggunakan Ubuntu 16.04: / home / user / bin / select_device: line 35: fxValidationNumberMenu: perintah tidak ditemukan / home / user / bin / select_device: baris 41: fxMenu: perintah tidak ditemukan
gerbit
@ gerbit fxMenudan fxValidatonNumberMenuhanya untuk referensi. Saya berkomentar untuk menghindari kode kesalahan. Anda dapat melihat implementasi lengkap di repositori saya: github.com/equiman/hardhatmac/blob/master/tools.sh
equiman
0

Cara terbaik untuk menjalankan shell pada perangkat tertentu adalah dengan menggunakan:

adb -s << emulator UDID >> shell

For Example:
adb -s emulator-5554 shell

Bekerja 100%

Tolong berikan itu berdebar

Shivam Bharadwaj
sumber
0

Inilah skrip shell yang saya buat untuk diri saya sendiri:

#! /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
Francois Dermu
sumber