13、模拟用户输入:adb shell input 三剑客

各位好,我是老张。今天聊点实在的——怎么用 ADB 模拟人的操作。

你想想看,做自动化测试也好,远程调试也罢,总不能每次都拿手指头戳屏幕吧?
adb shell input 这套命令,说白了就是让你用代码代替手指。

我个人习惯把这套命令分成三块:按键、点击、滑动
掌握了它们,大部分 UI 交互你都能用脚本搞定。

adb shell input 知识体系 input 命令 keyevent 模拟物理按键 tap 模拟手指点击 swipe 模拟滑动/拖拽 核心逻辑:坐标 + 事件类型 → 模拟用户交互 所有命令均基于 Android 的输入子系统

13.1 模拟按键:keyevent

先说说 keyevent。这玩意儿能模拟几乎所有物理按键——电源键、音量键、返回键、Home 键等等。

基本用法很简单:

adb shell input keyevent <keycode>

keycode 是一个数字,对应不同的按键。我整理了一份常用表:

功能keycode说明
返回键4KEYCODE_BACK
Home 键3KEYCODE_HOME
菜单键82KEYCODE_MENU
电源键26KEYCODE_POWER
音量加24KEYCODE_VOLUME_UP
音量减25KEYCODE_VOLUME_DOWN
回车键66KEYCODE_ENTER
删除键67KEYCODE_DEL
空格键62KEYCODE_SPACE
💡 我的小技巧: 记不住 keycode 没关系。直接用 adb shell input keyevent KEYCODE_BACK 这种字符串形式也行。
不过我个人习惯用数字——脚本里写数字更干净,而且跨版本兼容性更好。

举个例子,你想让设备回到桌面:

adb shell input keyevent 3

就这么一行,相当于按了 Home 键。我在做自动化测试时,经常用它来重置界面状态。

⚠️ 注意: 有些定制 ROM 可能修改了 keycode 映射。如果你发现按了没反应,先查一下目标设备的 keylayout 文件。
我曾经在一台国产平板上踩过坑——它的返回键 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
🔑 关键点: tap 命令是瞬时点击,没有长按效果。如果需要长按,请用后面的 swipe 命令。

嗯,这里要注意——不同设备的屏幕分辨率不一样。你在一台 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 毫秒。

💡 我的经验: 滑动速度很重要。如果你写的时间太短(比如 50ms),系统可能识别为点击而不是滑动。
反过来,时间太长(比如 2000ms)又像慢动作。我个人习惯控制在 150~400ms 之间。

还有一个骚操作——用 swipe 实现长按。你想想看,长按不就是“点下去不动”吗?

adb shell input swipe 540 960 540 960 1500

起点和终点设成同一个点,时间设长一点。这样就能模拟长按 1.5 秒的效果。我在测试长按删除应用时经常这么干。

⚠️ 避坑指南: 我曾经在某个 Android 11 设备上发现 swipe 长按不管用。后来查了源码才知道——某些系统版本对“零距离滑动”做了特殊处理,认为这是无效操作。
解决办法:把终点偏移 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 自动化你有。


公众号:蓝海资料掘金营,微信deep3321