14、文本输入与剪贴板:adb shell input text(输入文本)、adb shell am broadcast(操作剪贴板)、实战:自动化填写表单
各位好,欢迎来到第十四章。
前面我们聊了那么多ADB命令,大部分都是在「看」——看日志、看设备信息、看进程。今天咱们来点实际的:让手机自己打字。
你想想看,如果你能通过一条命令,让手机自动在输入框里填上内容,甚至复制粘贴,那自动化测试、批量填表单、甚至帮女朋友抢购,是不是就变得简单多了?
嗯,这一章我们就来搞定这件事。
14.1 文本输入:adb shell input text
先来最基础的——input text。这个命令的作用很简单:模拟键盘输入。说白了,就是你在电脑上敲一行字,它帮你打到手机当前聚焦的输入框里。
14.1.1 基本用法
用法非常直接:
adb shell input text "Hello World"
执行之后,如果手机当前光标在某个输入框里,就会自动填入 Hello World。
但这里有个坑——空格和特殊字符。我刚开始用的时候,直接写了个带空格的字符串,结果发现只输出了前半段。为什么呢?因为shell会把空格当成参数分隔符。
解决办法有两个:
- 用双引号把整个字符串包起来:
"Hello World" - 或者用
%s转义空格:Hello%sworld
&、|、$、! 也需要转义。比如输入 a&b,要写成 adb shell input text "a\&b"。我曾经在测试密码框时被这个坑过,调试了半天才发现是shell把 & 解释成了后台运行符号。
14.1.2 输入Unicode字符
中文怎么办?input text 原生不支持中文。你直接写 adb shell input text "你好",大概率会报错或者显示乱码。
我个人习惯的做法是:用剪贴板配合粘贴。后面会讲到。
不过如果你非要硬来,可以试试用 adb shell input keyevent 模拟按键,但那个效率太低了,不推荐。
14.2 操作剪贴板:adb shell am broadcast
好,重点来了。既然 input text 搞不定中文,那我们就换个思路——先把内容放到剪贴板,再粘贴。
Android系统里,剪贴板是通过 ClipboardManager 来管理的。我们可以用 am broadcast 发送一个广播,让系统帮我们把文本塞进剪贴板。
14.2.1 设置剪贴板内容
命令长这样:
adb shell am broadcast -a android.intent.action.CLIPBOARD_CHANGED --es "android.intent.extra.TEXT" "你要复制的内容"
等等,这个命令其实有点「取巧」。它并不是直接设置剪贴板,而是模拟一次剪贴板变化事件。真正靠谱的做法,是用 content 命令或者写一个小工具。
不过别急,我给大家一个更实用的方案——用 input keyevent 模拟长按 + 粘贴。
adb shell am broadcast -a clipper.set --es text "内容"。但注意,这个需要设备有 clipper 工具(部分定制ROM自带)。没有的话,可以用下面这个通用方案。
14.2.2 通用剪贴板操作方案
我个人最常用的方法是:用 settings 命令配合 input 实现。具体来说:
- 先用
input keyevent KEYCODE_MOVE_END把光标移到末尾 - 再用
input keyevent KEYCODE_PASTE粘贴
但前提是——剪贴板里得有内容。所以我们需要先「塞」内容进去。
这里我分享一个我在项目中用过的脚本思路:
# 1. 用 input text 输入一段临时内容(比如一个特殊标记)
adb shell input text "###TEMP###"
# 2. 模拟全选 + 复制
adb shell input keyevent KEYCODE_MOVE_HOME
adb shell input keyevent --longpress KEYCODE_SHIFT_LEFT
adb shell input keyevent KEYCODE_MOVE_END
adb shell input keyevent KEYCODE_COPY
# 3. 现在剪贴板里有 "###TEMP###" 了
# 4. 再用 am broadcast 替换?不行,这个方案太绕了。
# 更直接的方法:用 adb 执行一个简单的 Java 代码
adb shell "echo 'android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(CLIPBOARD_SERVICE); clipboard.setText(\"你的内容\");' | dalvikvm -cp /system/framework/framework.jar"
嗯,上面这个有点复杂。实际工作中,我建议直接用 ADB 配合第三方工具,比如 adb shell input text 加 %s 转义,或者用 adb exec-out 配合 clipboard 工具。
input text 输入英文/数字,再用 input keyevent 模拟粘贴。中文内容提前用其他方式(比如PC端复制)放到剪贴板里。
14.3 实战:自动化填写表单
理论说完了,咱们来点真格的。假设你有一个App,里面有个注册页面,需要填用户名、手机号、邮箱。手动填太慢了,我们用ADB一键搞定。
14.3.1 准备工作
首先,你得知道每个输入框的坐标。可以用 adb shell getevent 或者 adb shell uiautomator dump 来获取。
我个人习惯用 uiautomator:
adb shell uiautomator dump /sdcard/ui.xml
adb pull /sdcard/ui.xml
cat ui.xml | grep -o 'bounds="\[[0-9,]*\]"'
拿到坐标后,用 input tap 点击输入框,然后输入内容。
14.3.2 完整脚本
下面是一个完整的bash脚本示例:
#!/bin/bash
# 自动化填写注册表单
# 点击用户名输入框(假设坐标是 100, 200)
adb shell input tap 100 200
sleep 0.5
adb shell input text "test_user_001"
# 点击手机号输入框(假设坐标是 100, 350)
adb shell input tap 100 350
sleep 0.5
adb shell input text "13800138000"
# 点击邮箱输入框(假设坐标是 100, 500)
adb shell input tap 100 500
sleep 0.5
adb shell input text "test@example.com"
# 点击提交按钮(假设坐标是 200, 700)
adb shell input tap 200 700
echo "表单已自动填写并提交"
你看,就这么几行,一个注册流程就自动化了。
input text 之前加一个 sleep 0.3,因为有些App的输入框有动画或者验证逻辑,太快了会丢字符。我曾经在测试一个金融App时,因为输入太快,导致验证码输入框只收到了前三位,排查了半天才发现是速度问题。
14.3.3 处理中文输入
如果表单里有中文怎么办?比如姓名栏要填「张三」。
我的方案是:先用PC端复制好中文,然后用ADB模拟粘贴。
具体做法:
- 在电脑上复制「张三」到系统剪贴板
- 用
adb shell input tap点击输入框 - 用
adb shell input keyevent KEYCODE_PASTE粘贴
但这里有个前提——电脑剪贴板和手机剪贴板是独立的。所以你需要先把内容传到手机剪贴板里。
我常用的一个技巧:
# 在电脑上把内容写到文件
echo -n "张三" > /tmp/name.txt
# 用 adb push 到手机
adb push /tmp/name.txt /sdcard/name.txt
# 用 adb shell 读取文件内容并设置到剪贴板(需要 root 或特定权限)
adb shell "cat /sdcard/name.txt | xargs -I {} am broadcast -a clipper.set --es text {}"
嗯,这个方案依赖 clipper。如果没有,那就用最笨但最稳的方法——用 input text 配合 Unicode 转义。虽然麻烦,但至少能跑。
14.4 知识体系总览
为了让你更直观地理解这一章的内容,我画了一张流程图:
14.5 避坑指南
最后,分享几个我踩过的坑:
- 输入框没聚焦就输入:
input text必须在输入框有光标时才能生效。记得先input tap点击一下。 - 输入速度太快丢字符:有些App的输入框有防抖逻辑,建议每个字符间隔50ms以上。可以用
sleep或者循环加延迟。 - 剪贴板权限问题:Android 10+ 对剪贴板的访问限制更严了。普通App无法读取剪贴板内容,但写入还是可以的。如果你遇到权限问题,试试用
adb shell settings put global enable_clipboard_service 1开启服务。 - 特殊字符导致shell报错:比如输入
$符号,shell会把它当成变量引用。记得用单引号或者反斜杠转义。
好了,这一章的内容就到这里。文本输入和剪贴板操作,是ADB自动化里非常实用的两个技能。掌握了它们,你就能让手机「自己填表」、「自己复制粘贴」,效率提升不止一个档次。
下一章我们继续深入,聊聊更高级的自动化操作。各位先消化一下今天的内容,有问题随时交流。
公众号:蓝海资料掘金营,微信deep3321