เหตุการณ์อินพุต ADB Shell


222

อะไรคือความแตกต่างพื้นฐานระหว่างadb shell input keyeventและadb shell sendevent? ฉันควรใช้อันไหนในการป้อนตัวละคร? เป็นรหัสเดียวกันกับที่เราส่งให้ทั้งสองคำสั่งหรือไม่?

คำตอบ:


417

โดยadb shell input keyevent, ทั้งevent_codeหรือstringจะถูกส่งไปยังอุปกรณ์

usage: input [text|keyevent]
  input text <string>
  input keyevent <event_code>

ค่าที่เป็นไปได้สำหรับevent_code:

0 -->  "KEYCODE_UNKNOWN" 
1 -->  "KEYCODE_MENU" 
2 -->  "KEYCODE_SOFT_RIGHT" 
3 -->  "KEYCODE_HOME" 
4 -->  "KEYCODE_BACK" 
5 -->  "KEYCODE_CALL" 
6 -->  "KEYCODE_ENDCALL" 
7 -->  "KEYCODE_0" 
8 -->  "KEYCODE_1" 
9 -->  "KEYCODE_2" 
10 -->  "KEYCODE_3" 
11 -->  "KEYCODE_4" 
12 -->  "KEYCODE_5" 
13 -->  "KEYCODE_6" 
14 -->  "KEYCODE_7" 
15 -->  "KEYCODE_8" 
16 -->  "KEYCODE_9" 
17 -->  "KEYCODE_STAR" 
18 -->  "KEYCODE_POUND" 
19 -->  "KEYCODE_DPAD_UP" 
20 -->  "KEYCODE_DPAD_DOWN" 
21 -->  "KEYCODE_DPAD_LEFT" 
22 -->  "KEYCODE_DPAD_RIGHT" 
23 -->  "KEYCODE_DPAD_CENTER" 
24 -->  "KEYCODE_VOLUME_UP" 
25 -->  "KEYCODE_VOLUME_DOWN" 
26 -->  "KEYCODE_POWER" 
27 -->  "KEYCODE_CAMERA" 
28 -->  "KEYCODE_CLEAR" 
29 -->  "KEYCODE_A" 
30 -->  "KEYCODE_B" 
31 -->  "KEYCODE_C" 
32 -->  "KEYCODE_D" 
33 -->  "KEYCODE_E" 
34 -->  "KEYCODE_F" 
35 -->  "KEYCODE_G" 
36 -->  "KEYCODE_H" 
37 -->  "KEYCODE_I" 
38 -->  "KEYCODE_J" 
39 -->  "KEYCODE_K" 
40 -->  "KEYCODE_L" 
41 -->  "KEYCODE_M" 
42 -->  "KEYCODE_N" 
43 -->  "KEYCODE_O" 
44 -->  "KEYCODE_P" 
45 -->  "KEYCODE_Q" 
46 -->  "KEYCODE_R" 
47 -->  "KEYCODE_S" 
48 -->  "KEYCODE_T" 
49 -->  "KEYCODE_U" 
50 -->  "KEYCODE_V" 
51 -->  "KEYCODE_W" 
52 -->  "KEYCODE_X" 
53 -->  "KEYCODE_Y" 
54 -->  "KEYCODE_Z" 
55 -->  "KEYCODE_COMMA" 
56 -->  "KEYCODE_PERIOD" 
57 -->  "KEYCODE_ALT_LEFT" 
58 -->  "KEYCODE_ALT_RIGHT" 
59 -->  "KEYCODE_SHIFT_LEFT" 
60 -->  "KEYCODE_SHIFT_RIGHT" 
61 -->  "KEYCODE_TAB" 
62 -->  "KEYCODE_SPACE" 
63 -->  "KEYCODE_SYM" 
64 -->  "KEYCODE_EXPLORER" 
65 -->  "KEYCODE_ENVELOPE" 
66 -->  "KEYCODE_ENTER" 
67 -->  "KEYCODE_DEL" 
68 -->  "KEYCODE_GRAVE" 
69 -->  "KEYCODE_MINUS" 
70 -->  "KEYCODE_EQUALS" 
71 -->  "KEYCODE_LEFT_BRACKET" 
72 -->  "KEYCODE_RIGHT_BRACKET" 
73 -->  "KEYCODE_BACKSLASH" 
74 -->  "KEYCODE_SEMICOLON" 
75 -->  "KEYCODE_APOSTROPHE" 
76 -->  "KEYCODE_SLASH" 
77 -->  "KEYCODE_AT" 
78 -->  "KEYCODE_NUM" 
79 -->  "KEYCODE_HEADSETHOOK" 
80 -->  "KEYCODE_FOCUS" 
81 -->  "KEYCODE_PLUS" 
82 -->  "KEYCODE_MENU" 
83 -->  "KEYCODE_NOTIFICATION" 
84 -->  "KEYCODE_SEARCH" 
85 -->  "TAG_LAST_KEYCODE"

sendeventยูทิลิตี้ส่งสัมผัสหรือแป้นพิมพ์เหตุการณ์เช่นเดียวกับเหตุการณ์อื่น ๆ สำหรับการจำลองเหตุการณ์ฮาร์ดแวร์ อ้างถึงบทความนี้สำหรับรายละเอียด: Android, ระดับต่ำเปลือกคลิกบนหน้าจอ


1
สวัสดี @chwentong! คุณช่วยฉันด้วยการชี้ไปยังสถานที่ใด ๆ ที่อธิบาย“ วิธีป้อนข้อความ <string>” อย่างละเอียดมากขึ้นได้ไหม? ฉันไม่พบสิ่งใดเกี่ยวกับเรื่องนี้คล้ายกับdeveloper.android.com/reference/android/view/KeyEvent.html ขอบคุณ!
stansult

Hi! ฉันจะขอให้ฉันป้อนสตริงที่มีช่องว่างในคอนโซลบรรทัดคำสั่งของ windows ได้อย่างไร ฉันพยายามเข้า>adb shell input text "a b"แต่ไม่ทำงาน
Wei Yang

1
คุณได้ข้อมูลของคำสั่ง "อินพุต" ที่ไหน คุณลักษณะอื่นใดที่ถูกซ่อนไว้จากเอกสาร (ที่นี่: developer.android.com/tools/help/adb.html )
นักพัฒนา Android

4
@WeiYang ลองสิ่งนี้> ข้อความใส่คำสั่ง adb shell "a% sb"
Natan Lotério

3
โพสต์นี้มีประโยชน์มากเมื่อหน้าจอแท็บเล็ต Android ของฉันพังและจะไม่ตอบสนองต่อการสัมผัส ฉันสามารถ "พิมพ์" พินได้โดยใช้คีย์การ์ดอินพุตของ adb shell และค้นหาเส้นทางของฉัน ขอบคุณ!
j0aqu1n

194

ปรับปรุง:

การใช้adb shell input:

แทรกข้อความ:

adb shell input text "insert%syour%stext%shere"

(obs:% s หมายถึง SPACE)

..

รหัสเหตุการณ์:

adb shell input keyevent 82

(82 ---> MENU_BUTTON)

"สำหรับรหัสของคีย์เพิ่มเติมโปรดดูรายการด้านล่าง"

..

แตะตำแหน่ง X, Y:

adb shell input tap 500 1450

ในการค้นหาตำแหน่ง X, Y ที่แน่นอนที่คุณต้องการแตะไปที่:

การตั้งค่า> ตัวเลือกสำหรับนักพัฒนา> ตรวจสอบตัวเลือก POINTER SLOCATION

..

ปัด X1 Y1 X2 Y2 [ระยะเวลา (มิลลิวินาที)]:

adb shell input swipe 100 500 100 1450 100

ในตัวอย่างนี้ X1 = 100, Y1 = 500, X2 = 100, Y2 = 1450, ระยะเวลา = 100ms

..

LongPress XY:

adb shell input swipe 100 500 100 500 250

เราใช้คำสั่งเดียวกันสำหรับการกวาดนิ้วเพื่อเลียนแบบการกดแบบยาว

ในตัวอย่างนี้ X = 100, Y = 500, Duration = 250ms

..

รายการที่อัปเดตรหัสเหตุการณ์:

0 -->  "KEYCODE_0" 
1 -->  "KEYCODE_SOFT_LEFT" 
2 -->  "KEYCODE_SOFT_RIGHT" 
3 -->  "KEYCODE_HOME" 
4 -->  "KEYCODE_BACK" 
5 -->  "KEYCODE_CALL" 
6 -->  "KEYCODE_ENDCALL" 
7 -->  "KEYCODE_0" 
8 -->  "KEYCODE_1" 
9 -->  "KEYCODE_2" 
10 -->  "KEYCODE_3" 
11 -->  "KEYCODE_4" 
12 -->  "KEYCODE_5" 
13 -->  "KEYCODE_6" 
14 -->  "KEYCODE_7" 
15 -->  "KEYCODE_8" 
16 -->  "KEYCODE_9" 
17 -->  "KEYCODE_STAR" 
18 -->  "KEYCODE_POUND" 
19 -->  "KEYCODE_DPAD_UP" 
20 -->  "KEYCODE_DPAD_DOWN" 
21 -->  "KEYCODE_DPAD_LEFT" 
22 -->  "KEYCODE_DPAD_RIGHT" 
23 -->  "KEYCODE_DPAD_CENTER" 
24 -->  "KEYCODE_VOLUME_UP" 
25 -->  "KEYCODE_VOLUME_DOWN" 
26 -->  "KEYCODE_POWER" 
27 -->  "KEYCODE_CAMERA" 
28 -->  "KEYCODE_CLEAR" 
29 -->  "KEYCODE_A" 
30 -->  "KEYCODE_B" 
31 -->  "KEYCODE_C" 
32 -->  "KEYCODE_D" 
33 -->  "KEYCODE_E" 
34 -->  "KEYCODE_F" 
35 -->  "KEYCODE_G" 
36 -->  "KEYCODE_H" 
37 -->  "KEYCODE_I" 
38 -->  "KEYCODE_J" 
39 -->  "KEYCODE_K" 
40 -->  "KEYCODE_L" 
41 -->  "KEYCODE_M" 
42 -->  "KEYCODE_N" 
43 -->  "KEYCODE_O" 
44 -->  "KEYCODE_P" 
45 -->  "KEYCODE_Q" 
46 -->  "KEYCODE_R" 
47 -->  "KEYCODE_S" 
48 -->  "KEYCODE_T" 
49 -->  "KEYCODE_U" 
50 -->  "KEYCODE_V" 
51 -->  "KEYCODE_W" 
52 -->  "KEYCODE_X" 
53 -->  "KEYCODE_Y" 
54 -->  "KEYCODE_Z" 
55 -->  "KEYCODE_COMMA" 
56 -->  "KEYCODE_PERIOD" 
57 -->  "KEYCODE_ALT_LEFT" 
58 -->  "KEYCODE_ALT_RIGHT" 
59 -->  "KEYCODE_SHIFT_LEFT" 
60 -->  "KEYCODE_SHIFT_RIGHT" 
61 -->  "KEYCODE_TAB" 
62 -->  "KEYCODE_SPACE" 
63 -->  "KEYCODE_SYM" 
64 -->  "KEYCODE_EXPLORER" 
65 -->  "KEYCODE_ENVELOPE" 
66 -->  "KEYCODE_ENTER" 
67 -->  "KEYCODE_DEL" 
68 -->  "KEYCODE_GRAVE" 
69 -->  "KEYCODE_MINUS" 
70 -->  "KEYCODE_EQUALS" 
71 -->  "KEYCODE_LEFT_BRACKET" 
72 -->  "KEYCODE_RIGHT_BRACKET" 
73 -->  "KEYCODE_BACKSLASH" 
74 -->  "KEYCODE_SEMICOLON" 
75 -->  "KEYCODE_APOSTROPHE" 
76 -->  "KEYCODE_SLASH" 
77 -->  "KEYCODE_AT" 
78 -->  "KEYCODE_NUM" 
79 -->  "KEYCODE_HEADSETHOOK" 
80 -->  "KEYCODE_FOCUS" 
81 -->  "KEYCODE_PLUS" 
82 -->  "KEYCODE_MENU" 
83 -->  "KEYCODE_NOTIFICATION" 
84 -->  "KEYCODE_SEARCH" 
85 -->  "KEYCODE_MEDIA_PLAY_PAUSE"
86 -->  "KEYCODE_MEDIA_STOP"
87 -->  "KEYCODE_MEDIA_NEXT"
88 -->  "KEYCODE_MEDIA_PREVIOUS"
89 -->  "KEYCODE_MEDIA_REWIND"
90 -->  "KEYCODE_MEDIA_FAST_FORWARD"
91 -->  "KEYCODE_MUTE"
92 -->  "KEYCODE_PAGE_UP"
93 -->  "KEYCODE_PAGE_DOWN"
94 -->  "KEYCODE_PICTSYMBOLS"
...
122 -->  "KEYCODE_MOVE_HOME"
123 -->  "KEYCODE_MOVE_END"

รายการคำสั่งทั้งหมดสามารถดูได้ที่: http://developer.android.com/reference/android/view/KeyEvent.html


1
เห็นได้ชัดว่ารายการนี้มีความยาวมากกว่าสำหรับ Android เวอร์ชั่นใหม่กว่าเช่น 4.2.2 เราสามารถค้นหาได้ในandroid.view.KeyEvent.javaซึ่งมีจำนวนมากถึง 219
not2qubit

ขอบคุณสำหรับคำสั่ง swipe ฉันค้นหาสิ่งนั้นมาก
David

ในตัวเลือกนักพัฒนาเปิดใช้งาน "ตำแหน่งของตัวชี้" เพื่อกำหนดพิกัดที่ถูกต้องเมื่อป้อนเหตุการณ์การสัมผัส
Dick Lucas

สำหรับข้อมูลเพิ่มเติม ปัดบนโทรศัพท์ของฉันเท่านั้นหากเวลามีขนาดใหญ่กว่า 120 !! adb shell input swipe 200 800 200 400 200
Jose Rodrigues

74

นอกจากนี้หากคุณต้องการส่งช่องว่างในตัวด้วยคำสั่งอินพุตให้ใช้% s

adb shell input text 'this%sis%san%sexample'   

จะให้ผลผลิต

this is an example 

กำลังป้อนข้อมูล

%ตัวเองไม่จำเป็นต้องหลบหนี - มีเพียง%sคู่พิเศษเท่านั้นที่ได้รับการดูแลเป็นพิเศษ นี่นำไปสู่คำถามที่ชัดเจนเกี่ยวกับวิธีป้อนสตริงตัวอักษร%s... ซึ่งคุณต้องทำด้วยสองคำสั่งแยกกัน


วิธีใดในการปิดการแก้ไขอัตโนมัติที่นี่ มิฉะนั้นการทำงานที่ดี :)
แพทริค Boos

นี่เป็นสคริปต์ทุบตีง่ายๆที่จะช่วยหลบหนีดังนั้นคุณสามารถพูดได้atext "Hey, I'm here"และใช้งานได้
Dan Dascalescu

12

ถ้าคุณพยายามหาวิธีส่งคำพูดสองครั้งไปยังอุปกรณ์ให้ลองทำดังนี้

ข้อความอินพุตเชลล์ adb '\ "'

ฉันไม่แน่ใจว่าทำไมไม่มีรหัสเหตุการณ์สำหรับคำพูด แต่วิธีแก้ปัญหานี้ทำงาน นอกจากนี้หากคุณกำลังใช้ MonkeyDevice (หรือ ChimpChat) คุณควรทดสอบ caracter แต่ละตัวก่อนที่จะเรียกใช้ monkeyDevice.type มิฉะนั้นคุณจะไม่ได้อะไรเลยเมื่อพยายามส่ง "


1
ฉันสร้างสคริปต์ทุบตีง่ายๆเพื่อดูแลการหลบหนีทั้งหมดดังนั้นคุณสามารถพูดได้atext "Hey, I'm here"และใช้งานได้
Dan Dascalescu

9

ความแตกต่างอื่น ๆ หนึ่ง:

  • " adb shell input " กำลังเรียกใช้ input.jar เพื่อประมวลผลและส่ง keycode จาก Java layer ของ android framework
  • " adb sendevent " เป็นรหัส c (ส่วนหนึ่งของยูทิลิตี้กล่องเครื่องมือ) ที่ส่งรหัสเข้าโดยตรงไปยัง / dev / input .... ของระบบย่อยอินพุต Linux

ดูรายละเอียดเพิ่มเติมของรหัสติดตามลงใน AOSP Framework ได้ที่นี่:

http://www.srcmap.org/sd_share/4/aba57bc6/AOSP_adb_shell_input_Code_Trace.html#RefId=7c8f5285


ดังนั้นสรุป sendevent เป็นวิธีที่เร็วกว่าการป้อนข้อมูล adb!
JerryGoyal

7

ฉันเขียนสคริปต์ Powershell แบบง่าย ๆ สำหรับผู้ใช้ windows ในการแมปคีย์เพื่อป้อนกิจกรรมเชลล์ adb และควบคุมอุปกรณ์ Android จากระยะไกลผ่าน LAN ฉันไม่ทราบว่ามีใครพบว่ามันมีประโยชน์หรือไม่ แต่ฉันจะแบ่งปันต่อไป

$ip = 192.168.1.8
cd D:\Android\android-sdk-windows\platform-tools\; .\adb.exe disconnect $ip; .\adb.exe connect $ip
$adbKeyNum = @{LeftWindows = "1"; F1 = "3"; Enter = "66"; UpArrow = "19"; DownArrow = "20"; LeftArrow = "21"; RightArrow = "22"; Add = "24";
        Subtract = "25"; Backspace = "4"; P = "26"}

while(1 -eq 1){
    $keyPress = [Console]::ReadKey($true).Key
    if ([string]$keyPress -eq "F10"){
        .\adb.exe disconnect $ip
        exit
    }
    elseif ([string]$keyPress -eq "F6"){
        $string = Read-Host -Prompt 'Input the string: '
        .\adb.exe shell input text $string
    }
    elseif ($adbKeyNum.ContainsKey([string]$keyPress)){
        echo $adbKeyNum.Get_Item([string]$keyPress)
        .\adb.exe shell input keyevent $adbKeyNum.Get_Item([string]$keyPress)
    }
}

4

หากคุณต้องการส่งข้อความไปยังอุปกรณ์เฉพาะเมื่อเชื่อมต่ออุปกรณ์หลายเครื่อง ขั้นแรกให้ค้นหาอุปกรณ์ที่เชื่อมต่อโดยใช้อุปกรณ์ adb

adb devices
List of devices attached
3004e25a57192200        device
31002d9e592b7300        device

จากนั้นรับรหัสอุปกรณ์เฉพาะของคุณและลองทำสิ่งต่อไปนี้

adb -s 31002d9e592b7300 shell input text 'your text'

ควรเป็นข้อความ% ของคุณ
royatirek

2

ในการส่งการโทรซ้ำไปยังแอป React-Native ที่ทำงานในอุปกรณ์ Android: adb shell input keyboard text "rr"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.