
你好 您是否想在附近的设备上复制一些文本? 我希望它像在模拟器上复制粘贴一样简单-用手打字很无聊,并不总是很方便。
那么热键呢:按下它,PC剪贴板中的文本开始在手机/平板电脑的屏幕上键入-听起来不错,对吗?
在本文中,我们将讨论使用adb作为文本复制工具以及如何方便地完成此操作。
如果您是一位经验丰富的adb用户,并且拥有自己的这种脚本-我建议您转到实现本身,并在评论中分享对此的想法。
什么和为什么
我们将制作一个小的脚本,使您可以在真实设备上快速键入剪贴板的内容:

这在以下情况下很有用:
- 检查使用链接的工作或输入新的IP以再次在设备上配置代理:
http:
v3rY$ecUrEP@s$w0rD
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:
BUexKeGHiERJ4YYbd2_Tk8XlDMVEurbKjWOWvrY
当然,最有可能您不必定期执行此操作。 但有时,我有时需要在设备上手动输入不太方便的内容。
最后,最常见的是测试数据或api设置,尽管该脚本没有节省5分钟,但它的工作要好得多。
怎么了
这可以使用ADB (Android调试桥)来完成。 可能是所有开发人员和大多数质量检查人员都熟悉它,至少是由于能够在Android Studio中或直接通过adb logcat
查看日志。 如果您以前没有使用过adb, 则可以在macOS 上看到示例安装。
我们对adb shell input
命令感兴趣,该命令允许输入,例如tap
或swipe
。
它还允许您传输文本-它将开始在输入字段中打印,该字段现已成为焦点:
adb shell input text <text>
如果输入空格,则需要将它们替换为%s
,并转义特殊字符。 否则,将无济于事。
值得考虑的是,adb仅适用于拉丁字母,数字和ASCII板中的特殊字符,并且输入受到一定限制:
- 不适用于
±§
等字符 - 不适用于换行(但是,例如,您可以使用
adb shell input keyevent 66
(输入)命令或如此处所述,单独引起另一个adb的换行) - 不适用于西里尔字母
输入此类字符有一个有趣的解决方法 ,也许可以将剪贴板固定在其上,然后再打印任何文本。 的确,该设备将需要使用键盘预先安装.apk。
重要说明:在上面和下面描述的形式中,adb命令表示已连接一台设备。 如果有多个,则可以执行以下操作:
1)在特定设备上调用命令。 -S -s
您可以使用adb devices
命令找出设备编号。 然后在调用命令时使用该号码:
$ adb devices List of devices attached 023db62er9dd7d2b device $ adb -s 023db62er9dd7d2b shell input text qwe
2)在通过usb连接的单个设备上调用命令-选项-d
:
adb -d shell input text qwe
3)在唯一活动的仿真器上调用命令-e
选项:
adb -e shell input text qwe
可以在这里找到更多详细信息。
如果您使用多个设备,并且这些情况与您有关,请相应地更正adb命令。
实作
我们将仔细研究macOS的解决方案,但对于其他系统,也有一种方法:
Linux解决方案
一次, KODE的家伙( Dima Suzdalev和Dima Gaiduk )提出了一个出色的Linux解决方案,并与我分享了该解决方案。
它通过X11缓冲区工作(如果您有Wayland ,请阅读下文)-选择下注的文本,然后单击调用脚本的热键。
添加这样的热键很容易:
1) 放入xclip
2)添加脚本文件
3)在键盘的“快捷方式”设置中写入脚本的路径
谢谢你们,也非常荣幸。
重要说明:上面的解决方案适用于X11(Xorg)。 对于Wayland,此解决方案不相关。 我仍然找不到从Wayland缓冲区中获取内容的方法,从我的搜索来看还没有这种可能性。 如果不正确,请更正。
如果您不知道自己所处的环境如何,请看这里。 您很可能拥有X11,并且一切正常。
macOS解决方案
对于macOS linux,该解决方案不合适,因此我尝试制作一个类似的脚本,以简化对adb shell input text <text>
的调用。
我必须马上说-与sed合作对我来说并不明显。 我试图组成一个团队,并稍微补充不同的替换规则,这将有助于正确逃脱特殊字符。
如果您知道如何改进此脚本,那将非常酷!
看起来像这样:
source ~/.bash_profile adb shell input text $(pbpaste | sed -e 's/[_<>|&$;()\"]/\\&/g' -e 's/ /\%s/g' -e 's/!+/!/g')
(如果adb在常规控制台中工作, source ~/.bash_profile
添加source ~/.bash_profile
,但是通过Automator(稍后会详细介绍),无法识别adb,为此,您首先需要拉到adb的路径-例如,以~/.bash_profile
编写。)
像常规的adb shell input text <text>
,但是
- 文本的来源是
pbpaste
即macOS剪贴板。 - sed处理剪贴板中的文本。
- 字符
_<>&$;()\"
转义:- &
-> \&
- 空格被特殊字符替换:
` ->
%s` - 带有感叹号的话,一切都会很复杂-如果有人会向我解释这种替换
!
上!
帮助团队不跌倒-这将很酷。
Windows解决方案
不幸的是( 或没有 )在Windows上,我没有尝试这样做。 我想到的最明显的选择是调整解决方案并安装Cygwin 。 这将使您手边有一个方便的linux终端,这当然很有用。
您将需要sed
软件包及其依赖项以及cygutils-extra
软件包(提供了获取剪贴板内容的命令getclip
替换pbpaste
)
结果将与macOS的解决方案非常相似:
adb shell input text $(getclip | sed -e 's/[_<>|&$;()\"]/\\&/g' -e 's/ /\%s/g' -e 's/!+/!/g')
Windows 10还具有开箱即用的Linux终端的功能 。 我没有尝试过此选项,但它看起来像Cygwin的解决方案。

剧本在行动
简化工作
您可以每次将脚本复制到控制台,或者用手adb shell input text <something>
,但这不是很方便。 进行别名或分配热键更加容易。
关于控制台的别名
这里的困难在于别名本身仍然需要转义所有$
和"
才能起作用。我还没有这样做,因为热键对我来说更方便。确实,我以前使用过这个- alias adp='adb shell input text'
其中有助于输入一个单词,如adp example
。如果有人用脚本为自己adp example
别名,请在此处写-附加。
关于将运行脚本的热键
如果我们谈论Linux解决方案-一切都取决于发行版,但这也不难。
Cygwin上的Windows解决方案是一种简单的方法。
最初,本文仅供内部使用,因此对macOS的方法进行了更详细的描述,您可以在下面看到它:
适用于macOS的方法:有许多方法可以执行此操作,但是默认情况下会安装Automator
您可以使用它快速创建热键。
首先,运行Automator
,选择文档类型Service
:

然后配置服务:
service receives
设置no input
- 在“
Actions
选项卡中,选择“ Run shell script
操作

现在,您可以为新服务分配一个热键:

就是这样,现在应该可以通过热键复制到设备上了。
的确,热键服务仅在应用程序菜单中有“ Services
选项卡的应用程序中有效:

适用于macOS的Zeplin应用程序中没有这样的选项卡,因此它在那里不起作用。 也许其他使用脚本的应用程序可以规避此限制;到目前为止,我已经通过Automator找到了一种方法。
还值得考虑的是,热键可以拦截相同的Google Chrome或其他应用程序并执行其操作而不是脚本。
就这样
我希望本文对您有所帮助,并且可以帮助您简化工作中此类问题的解决方案。