Bagaimana cara menggunakan ADB untuk mengirim acara sentuh ke perangkat menggunakan perintah sendevent?

91

Saya mencoba mengirim peristiwa sentuh ke perangkat menggunakan AndroidDebugBridge, sehingga saya dapat melakukan beberapa otomatisasi dasar untuk pengujian UI. Saya telah mengikuti diskusi di LINK . Saya dapat menggunakan sendevent untuk mensimulasikan sentuhan pada emulator, tetapi tidak dapat melakukan hal yang sama pada perangkat.

Seperti pada tautan di atas, emulator tampaknya mengirimkan 6 peristiwa untuk setiap sentuhan (xcoord, ycoord, 2 untuk pers, 2 untuk rilis) dan mudah untuk menggunakan informasi ini untuk mengirim peristiwa, tetapi acara untuk layar sentuh untuk perangkat tampaknya menghasilkan terlalu banyak acara.

Apakah seseorang berhasil mengirim sentuhan dari ADB ke perangkat? Bisakah Anda berbagi solusinya.

Harkish
sumber
Di perangkat, apakah Anda memeriksa apakah Anda meneruskan acara ke "perangkat masukan" yang tepat? yaitu. perangkat input yang terdaftar sebagai driver sentuh?
TheCodeArtist

Jawaban:

138

Android hadir dengan inputalat baris perintah yang dapat mensimulasikan kejadian masukan lain-lain. Untuk mensimulasikan penyadapan, itu:

input tap x y

Anda dapat menggunakan shell adb (> 2.3.5) untuk menjalankan perintah dari jarak jauh:

adb shell input tap x y
pengguna643154
sumber
2
Ini bekerja dengan sempurna di Nox App menggunakan nox_adb.exe terima kasih!
Smeterlink
2
Untuk Pengujian double tap saya menulis loop klik seperti ini i = 0; sementara [$ (($ i)) -le 2]; apakah saya = $ (($ i + 1)); masukan tap 500800; selesai; Tapi itu mengklik tempat itu setiap satu detik. dapatkah saya melakukannya lebih cepat menggunakan terminal?
Vignesh KM
67

Untuk melakukan tindakan tertentu (misalnya untuk membuka browser web), Anda harus terlebih dahulu mengetahui di mana harus mengetuk. Untuk melakukan itu, Anda dapat menjalankan:

adb shell getevent -l

Setelah Anda menekan perangkat, di lokasi yang Anda inginkan, Anda akan melihat output ini:

<...>
/dev/input/event3: EV_KEY       BTN_TOUCH            DOWN
/dev/input/event3: EV_ABS       ABS_MT_POSITION_X    000002f5
/dev/input/event3: EV_ABS       ABS_MT_POSITION_Y    0000069e

adb memberitahu Anda bahwa sebuah tombol telah ditekan (tombol ke bawah) pada posisi 2f5, 69e dalam hex yaitu 757 dan 1694 dalam desimal.

Jika sekarang Anda ingin membuat acara yang sama, Anda dapat menggunakan perintah ketukan masukan pada posisi yang sama:

adb shell input tap 757 1694

Info lebih lanjut dapat ditemukan di:

https://source.android.com/devices/input/touch-devices.html http://source.android.com/devices/input/getevent.html

Tomas
sumber
12
Untuk menemukan koordinat sentuh, saya akan merekomendasikan menggunakan Opsi Pengembang -> Tampilkan Lokasi Sentuh. Juga, ini memberikan nilai dalam desimal.
Praveen
3
Jika Anda tidak ingin harus mengkonversi hex ke desimal, Anda dapat membiarkan shell Anda melakukannya: adb shell input tap $((16#2f5)) $((16#69e)). Selain itu, hanya untuk sekadar bertele-tele, 0x2F5 dan 0x69E masing-masing adalah 757 dan 1694 ... Apa yang Anda gunakan untuk mengonversi antar basis?
ghoti
Terima kasih @ghoti tidak yakin saya pasti menyalinnya dari poin lain atau sesuatu seperti itu ...
Tomas
Membangun di atas ini saya membuat perintah adb shell getevent -l | grep ABS_MT_POSITION --line-buffered | awk '{a = substr($0,54,8); sub(/^0+/, "", a); b = sprintf("0x%s",a); printf("%d\n",strtonum(b))}'yang mendapatkan posisi tap sebagai integer
kyczawon
12

2.3.5 tidak memiliki input tap, hanya input keyeventdan input text Anda dapat menggunakan monkeyrunner untuk itu: (ini adalah salinan jawabannya di https://stackoverflow.com/a/18959385/1587329 ):

Anda mungkin ingin menggunakan monkeyrunner seperti ini:

$ monkeyrunner
>>> from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
>>> device = MonkeyRunner.waitForConnection()
>>> device.touch(200, 400, MonkeyDevice.DOWN_AND_UP)

Anda juga dapat melakukan drag, memulai aktivitas, dll. Lihat api MonkeyDevice .

serv-inc
sumber
5

Membangun di atas jawaban Tomas, ini adalah pendekatan terbaik untuk menemukan posisi tap lokasi sebagai bilangan bulat yang saya temukan:

adb shell getevent -l | grep ABS_MT_POSITION --line-buffered | awk '{a = substr($0,54,8); sub(/^0+/, "", a); b = sprintf("0x%s",a); printf("%d\n",strtonum(b))}'

Gunakan adb shell getevent -luntuk mendapatkan daftar acara, penggunaan grep untukABS_MT_POSITION (mendapatkan garis dengan peristiwa sentuh dalam hex) dan terakhir menggunakan awk untuk mendapatkan nilai hex yang relevan, lepaskan nol dan ubah hex menjadi integer. Ini terus menerus mencetak koordinat x dan y di terminal hanya ketika Anda menekan pada perangkat.

Anda kemudian dapat menggunakan perintah adb shell ini untuk mengirim perintah:

adb shell input tap x y
kyczawon.dll
sumber
4

Pertimbangkan untuk menggunakan uiautomator Android , dengan adb shell uiautomator [...] atau langsung menggunakan .jar yang disertakan dengan SDK.

Elist
sumber
BTW, ada beberapa alat di pasaran yang dapat membuat pengujian Otomasi Android menjadi lebih mudah untuk Anda.
Elist