Hướng dẫnĐăng ngày: 9 phút đọc

Giả lập chạm, vuốt, gõ chữ và bấm phím bằng adb shell input

Dùng adb shell input tap, swipe, text và keyevent để điều khiển Android từ máy tính, kèm bảng keycode, mẹo tìm toạ độ và script tái hiện lỗi.

adb shell input cho phép bạn giả lập chạm, vuốt, gõ chữ và bấm phím trên thiết bị Android mà không cần chạm vào máy: input tap 540 1200 chạm vào một điểm, input swipe kéo giữa hai điểm, input text gõ vào ô đang được focus và input keyevent 4 bấm Back. Chúng là xương sống của các script tái hiện lỗi nhanh và tự động hoá demo. Bài này tổng hợp các dạng lệnh hoạt động ổn định, những keycode bạn thực sự dùng, và cách tìm toạ độ. Nếu bạn chủ yếu chỉ cần bấm qua lại, màn hình trực tiếp trong ADBKit làm được việc đó bằng chuột; các lệnh bên dưới dành cho mọi thứ còn lại.

Note: Mọi ví dụ giả định chỉ có một thiết bị đã bật gỡ lỗi USB. Nếu có nhiều máy, thêm -s <serial> sau adb. Lệnh được viết dạng adb shell ... cho dòng lệnh; trong shell tương tác hoặc ngăn Shell của ADBKit, bỏ tiền tố adb shell.

Chạm và vuốt bằng input tap và input swipe

input tap nhận toạ độ X và Y theo pixel màn hình, tính từ góc trên bên trái theo hướng màn hình hiện tại:

adb shell input tap 540 1200

input swipe nhận điểm bắt đầu, điểm kết thúc và thời lượng tuỳ chọn tính bằng mili giây. Vuốt ngắn để cuộn, vuốt dài để kéo chậm:

adb shell input swipe 540 1600 540 400 300

Không có lệnh riêng cho nhấn giữ, nhưng một cú vuốt bắt đầu và kết thúc tại cùng một điểm với thời lượng dài sẽ làm được việc đó:

adb shell input swipe 540 1200 540 1200 1000

Bạn cũng có thể chỉ định nguồn đầu vào, hữu ích với máy có bút: input touchscreen tap 540 1200. Các cử chỉ đa điểm như chụm để thu phóng không làm được bằng input; chúng cần framework UI test hoặc sendevent.

Tìm toạ độ cần chạm

Mấu chốt là biết chạm vào đâu. Bốn cách, từ dễ nhất đến chính xác nhất:

  1. Vị trí con trỏ. Trong Tuỳ chọn nhà phát triển, bật Vị trí con trỏ; một thanh trên đỉnh màn hình hiện X/Y của ngón tay theo thời gian thực. Bài Tuỳ chọn nhà phát triển Android cho kiểm thử giải thích tuỳ chọn này cùng lớp phủ Hiện thao tác chạm liên quan. Từ dòng lệnh: adb shell settings put system pointer_location 1.
  2. Pixel ảnh chụp màn hình. Chụp bằng adb exec-out screencap -p > s.png, mở trong trình chỉnh ảnh và đọc vị trí pixel của nút. Pixel ảnh chụp chính là pixel màn hình.
  3. getevent. adb shell getevent -l in ra sự kiện chạm thô khi bạn chạm màn hình. Giá trị ABS_MT_POSITION_X/Y thuộc dải riêng của tấm cảm ứng, có thể khác độ phân giải màn hình.
  4. Dump giao diện. adb shell uiautomator dump ghi một tệp XML chứa bounds của mọi view, là cách bền vững nhất để script nhắm vào một nút cụ thể.

Toạ độ phụ thuộc vào độ phân giải và hướng màn hình. Kiểm tra bằng adb shell wm size, và tính theo phần trăm chiều rộng, chiều cao nếu script phải chạy trên nhiều máy.

Gõ chữ bằng input text

input text gửi một chuỗi vào ô đang được focus. Điểm cần lưu ý là shell trên thiết bị phân tích chuỗi này, nên dấu cách và ký tự đặc biệt cần xử lý cẩn thận. Thay dấu cách bằng %s và bọc toàn bộ trong dấu nháy đơn:

adb shell input text 'hello%sworld'

Các ký tự có ý nghĩa với shell như &, |, <, >, (, ), ; và $ phải được thoát bằng dấu gạch chéo ngược ngay cả khi nằm trong dấu nháy, vì chuỗi được diễn giải hai lần. Điền biểu mẫu đăng nhập trông như sau:

adb shell input text 'tester@example.com'
adb shell input keyevent 61
adb shell input text 'Pa\$\$word1'
adb shell input keyevent 66

Keycode 61 là Tab và 66 là Enter. input text chỉ xử lý ổn định ký tự ASCII; chữ có dấu, dấu tiếng Việt, emoji và ký tự CJK thường bị bỏ qua hoặc lỗi. Với văn bản không phải ASCII, hãy dán từ clipboard, dùng ứng dụng bàn phím test như ADB Keyboard, hoặc dùng test hook của chính ứng dụng.

Bấm phím bằng input keyevent

input keyevent nhận mã keycode dạng số hoặc tên KEYCODE_. Cả hai dòng dưới đều bấm Home:

adb shell input keyevent 3
adb shell input keyevent KEYCODE_HOME

Thêm --longpress để nhấn giữ, ví dụ input keyevent --longpress 26 mở menu nguồn. Bạn cũng có thể gửi nhiều phím trong một lệnh: input keyevent 4 4 3 bấm Back hai lần rồi Home. Đây là các keycode mà tester dùng nhiều nhất:

MãTênTác dụng
3HOMEVề màn hình chính
4BACKQuay lại
187APP_SWITCHỨng dụng gần đây
82MENUPhím menu cũ; đánh thức một số màn hình khoá
26POWERBật/tắt màn hình; nhấn giữ để mở menu nguồn
223SLEEPTắt màn hình
224WAKEUPBật màn hình
24 / 25VOLUME_UP / VOLUME_DOWNÂm lượng
164VOLUME_MUTETắt tiếng
85MEDIA_PLAY_PAUSEPhát hoặc tạm dừng media
66ENTERGửi hoặc xuống dòng
67DELXoá lùi (Backspace)
61TABChuyển sang ô kế tiếp
111ESCAPEĐóng hộp thoại ở một số ứng dụng
277 / 278 / 279CUT / COPY / PASTEThao tác clipboard trong ô đang focus
19 đến 22DPAD_UP/DOWN/LEFT/RIGHTDi chuyển focus, hữu ích trên TV và khi kiểm tra trợ năng

Các lệnh liên quan cho kiểm thử bằng script

Một vài lệnh ngoài input kết hợp rất tốt với những lệnh trên.

Đánh thức và mở khoá

Một lượt test mới thường bắt đầu ở màn hình khoá tối đen. Đánh thức máy, rồi vuốt lên để bỏ qua màn hình khoá không có mã PIN:

adb shell input keyevent KEYCODE_WAKEUP
adb shell input swipe 540 1800 540 600 200

Nếu có mã PIN, tiếp tục với input text 1234 và input keyevent 66. Một máy test riêng không đặt khoá sẽ đơn giản và an toàn hơn.

adb shell am start -a android.intent.action.VIEW -d "https://example.com/item/42"
adb shell am start -n com.example.app/.MainActivity
adb shell am force-stop com.example.app
adb shell cmd statusbar expand-notifications
adb shell cmd statusbar collapse

am start với VIEW là cách nhanh nhất để kiểm thử deep link và App Links; am force-stop giết ứng dụng để lần khởi chạy kế tiếp là khởi động nguội.

Kích thước và mật độ màn hình

Lỗi bố cục thường phụ thuộc vào kích thước màn hình. Giả lập màn hình nhỏ hơn hoặc dày điểm ảnh hơn mà không cần máy khác:

adb shell wm size 720x1280
adb shell wm density 320
adb shell wm size reset
adb shell wm density reset

Nhớ rằng toạ độ input tap sẽ thay đổi khi bạn ghi đè kích thước.

Viết script vòng lặp tái hiện lỗi

Xâu chuỗi các lệnh này trong một script shell biến lỗi chập chờn thành lỗi bạn có thể gặp cả trăm lần. Vòng lặp sau mở một màn hình qua deep link, cuộn, quay lại và lặp lại:

#!/bin/bash
for i in $(seq 1 50); do
  adb shell am start -a android.intent.action.VIEW -d "myapp://orders/42"
  sleep 2
  adb shell input swipe 540 1600 540 400 300
  sleep 1
  adb shell input keyevent 4
  sleep 1
done

Hãy dùng sleep thoải mái: input trả về trước khi giao diện phản ứng xong, và một cú chạm rơi đúng lúc đang chuyển cảnh là nguyên nhân phổ biến nhất khiến script chập chờn. Theo dõi adb logcat ở một terminal thứ hai để bắt crash.

Warning: Lệnh input là đầu vào thật. Một script chạm nhầm toạ độ trên điện thoại cá nhân có thể xoá tin nhắn hoặc gửi một khoản thanh toán. Hãy chạy vòng lặp tái hiện trên máy test, và kiểm tra wm size trước.

Làm bằng chuột trong ADBKit

ADBKit hiển thị màn hình thiết bị trực tiếp trong Chrome hoặc Edge qua WebUSB, và hầu hết các lệnh trên đều tương ứng với chuột hoặc một nút trên thanh công cụ:

LệnhTương đương trong ADBKit
input tap x yNhấp chuột vào màn hình phản chiếu
input swipeNhấp và kéo trên màn hình
input keyevent 4 / 3 / 187Nút Back, Home và App Switcher
input keyevent 24 / 25Nút Volume Up và Volume Down
wm size để đổi hướng màn hìnhNút xoay màn hình
  1. Mở ADBKit, kết nối điện thoại qua USB rồi bấm Connect device, sau đó chạm Allow trên máy.
  2. Bật chế độ xem màn hình trực tiếp; chọn 720p trong cài đặt chất lượng luồng nếu kết nối chậm.
  3. Nhấp để chạm và kéo để vuốt. Bật Hiện thao tác chạm trong Tuỳ chọn nhà phát triển nếu muốn các cú nhấp hiện rõ trong bản ghi Screen Record.
  4. Với input text, am start, wm size hoặc bất cứ thứ gì không có trên thanh công cụ, mở ngăn Shell và gõ lệnh không kèm tiền tố adb shell.

Gõ chữ trực tiếp bằng bàn phím vào màn hình phản chiếu chưa được hỗ trợ, nên hãy dùng ngăn Shell với input text cho việc đó. Tại một thời điểm chỉ một chương trình giữ được kết nối USB, nên hãy đóng các phiên adb hoặc scrcpy nếu ADBKit không kết nối được. Với phần còn lại của nhóm lệnh, xem bảng tóm tắt lệnh ADB và bài điều khiển Android từ trình duyệt.