Câu trả lời:
Sử dụng -s
tù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
adb -e shell
hoặ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
-s
tù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 ...
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.
-d
là dành cho "thiết bị" và -e
dà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. ;)
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 shell
mà không có bất kỳ vấn đề.
set ANDROID_SERIAL=7f1c864e
, tức là. không có dấu ngoặc kép.
export ANDROID_SERIAL=7f1c864e
.
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-server
khắc phục sự cố với trình giả lập ngoại tuyến
Đâ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 .
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-command
cho trình giả lập và adb -d shell....whatever-command
cho 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 devices
nà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
Để 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 -s
cờ:
-> 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 đó!
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 + // +
Đố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
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_profile
tệp:
export ANDROID_HOME="/usr/local/opt/android-sdk/"
export PATH="$ANDROID_HOME/platform-tools:$PATH"
export PATH="$ANDROID_HOME/tools:$PATH"
fxMenu
và fxValidatonNumberMenu
chỉ để 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
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
Đâ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
adb -s 192.168.56.101:5555 shell