13、模拟用户输入:adb shell input 三剑客
各位好,我是老张。今天聊点实在的——怎么用 ADB 模拟人的操作。
你想想看,做自动化测试也好,远程调试也罢,总不能每次都拿手指头戳屏幕吧?
adb shell input 这套命令,说白了就是让你用代码代替手指。
我个人习惯把这套命令分成三块:按键、点击、滑动。
掌握了它们,大部分 UI 交互你都能用脚本搞定。
13.1 模拟按键:keyevent
先说说 keyevent。这玩意儿能模拟几乎所有物理按键——电源键、音量键、返回键、Home 键等等。
基本用法很简单:
adb shell input keyevent <keycode>
keycode 是一个数字,对应不同的按键。我整理了一份常用表:
| 功能 | keycode | 说明 |
|---|---|---|
| 返回键 | 4 | KEYCODE_BACK |
| Home 键 | 3 | KEYCODE_HOME |
| 菜单键 | 82 | KEYCODE_MENU |
| 电源键 | 26 | KEYCODE_POWER |
| 音量加 | 24 | KEYCODE_VOLUME_UP |
| 音量减 | 25 | KEYCODE_VOLUME_DOWN |
| 回车键 | 66 | KEYCODE_ENTER |
| 删除键 | 67 | KEYCODE_DEL |
| 空格键 | 62 | KEYCODE_SPACE |
adb shell input keyevent KEYCODE_BACK 这种字符串形式也行。不过我个人习惯用数字——脚本里写数字更干净,而且跨版本兼容性更好。
举个例子,你想让设备回到桌面:
adb shell input keyevent 3
就这么一行,相当于按了 Home 键。我在做自动化测试时,经常用它来重置界面状态。
我曾经在一台国产平板上踩过坑——它的返回键 keycode 居然是 254,折腾了我半天。
13.2 模拟点击:tap
tap 命令更直观——模拟手指在屏幕上点一下。
adb shell input tap x y
x 和 y 是屏幕坐标,单位是像素。左上角是 (0,0),右下角是 (屏幕宽, 屏幕高)。
怎么知道坐标?我一般用这几种方法:
- 开发者选项 → 指针位置:打开后屏幕顶部会实时显示触摸坐标
- adb shell getevent:抓取原始输入事件,解析坐标
- 截图 + 看图工具:截屏后用 PS 或画图工具看像素位置
举个实际例子。假设你想点击屏幕中央的“确定”按钮,坐标大概是 (540, 960):
adb shell input tap 540 960
嗯,这里要注意——不同设备的屏幕分辨率不一样。你在一台 1080p 手机上写的坐标,换到 2K 屏上就偏了。
我建议在脚本里先获取屏幕分辨率:
adb shell wm size
然后根据比例计算坐标。说白了就是做一层适配,别写死数值。
13.3 模拟滑动:swipe
swipe 是 tap 的升级版——模拟手指从 A 点滑到 B 点。
adb shell input swipe x1 y1 x2 y2 [duration_ms]
x1 y1:起点坐标x2 y2:终点坐标duration_ms:滑动耗时(毫秒),可选参数。不写的话默认是 300ms 左右
最常见的用法就是滑动解锁、翻页、下拉刷新。
比如从屏幕底部向上滑(返回桌面手势):
adb shell input swipe 540 1800 540 600 200
这个命令模拟了从底部快速上滑的动作,耗时 200 毫秒。
反过来,时间太长(比如 2000ms)又像慢动作。我个人习惯控制在 150~400ms 之间。
还有一个骚操作——用 swipe 实现长按。你想想看,长按不就是“点下去不动”吗?
adb shell input swipe 540 960 540 960 1500
起点和终点设成同一个点,时间设长一点。这样就能模拟长按 1.5 秒的效果。我在测试长按删除应用时经常这么干。
解决办法:把终点偏移 1 个像素,比如 (541, 960)。系统就认了。
13.4 组合实战:一个完整的自动化场景
光说理论没意思。我拿一个真实场景串一下——自动打开设置并点击“关于手机”。
@echo off
REM 1. 回到桌面
adb shell input keyevent 3
REM 2. 等待 1 秒
ping -n 2 127.0.0.1 > nul
REM 3. 打开应用抽屉(假设底部上滑)
adb shell input swipe 540 1800 540 800 300
REM 4. 点击“设置”图标(坐标假设为 200 300)
adb shell input tap 200 300
REM 5. 等待设置加载
ping -n 3 127.0.0.1 > nul
REM 6. 滑动到列表底部
adb shell input swipe 540 1500 540 300 500
REM 7. 点击“关于手机”
adb shell input tap 300 1200
echo 完成!
你看,整个流程没有用手碰一下屏幕。全是 keyevent、tap、swipe 的组合。
实际项目中,我会把坐标和 keycode 定义成变量,方便适配不同分辨率。脚本写多了你会发现——模拟输入的核心就三个字:稳、准、快。
好了,这一章的内容就这些。记住:keyevent 管按键,tap 管点击,swipe 管滑动。三剑客在手,UI 自动化你有。