通过ADB将文本从剪贴板复制到Android设备


你好 您是否想在附近的设备上复制一些文本? 我希望它像在模拟器上复制粘贴一样简单-用手打字很无聊,并不总是很方便。


那么热键呢:按下它,PC剪贴板中的文本开始在手机/平板电脑的屏幕上键入-听起来不错,对吗?


在本文中,我们将讨论使用adb作为文本复制工具以及如何方便地完成此操作。


如果您是一位经验丰富的adb用户,并且拥有自己的这种脚本-我建议您转到实现本身,并在评论中分享对此的想法。


什么和为什么


我们将制作一个小的脚本,使您可以在真实设备上快速键入剪贴板的内容:



这在以下情况下很有用:


  • 检查使用链接的工作或输入新的IP以再次在设备上配置代理:

http://example.com:8080/foo 192.168.1.100 

  • 检查特殊字符的输入或输入棘手的测试数据:

 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命令感兴趣,该命令允许输入,例如tapswipe


它还允许您传输文本-它将开始在输入字段中打印,该字段现已成为焦点:


 adb shell input text <text> 

如果输入空格,则需要将它们替换为%s ,并转义特殊字符。 否则,将无济于事。


值得考虑的是,adb仅适用于拉丁字母,数字和ASCII板中的特殊字符,并且输入受到一定限制:


  1. 不适用于±§等字符
  2. 不适用于换行(但是,例如,您可以使用adb shell input keyevent 66 (输入)命令或如此处所述,单独引起另一个adb的换行)
  3. 不适用于西里尔字母

输入此类字符有一个有趣的解决方法 ,也许可以将剪贴板固定在其上,然后再打印任何文本。 的确,该设备将需要使用键盘预先安装.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的解决方案,但对于其他系统,也有一种方法:


  • GNU / Linux
  • MacOS的
  • 窗户

Linux解决方案

一次, KODE的家伙( Dima SuzdalevDima Gaiduk )提出了一个出色的Linux解决方案,并与我分享了该解决方案。


它通过X11缓冲区工作(如果您有Wayland ,请阅读下文)-选择下注的文本,然后单击调用脚本的热键。


添加这样的热键很容易:


1) 放入xclip


2)添加脚本文件


 #!/bin/bash adb shell input text `xclip -o` 

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> ,但是


  1. 文本的来源是pbpaste即macOS剪贴板。
  2. sed处理剪贴板中的文本。
  3. 字符_<>&$;()\"转义:- & -> \&
  4. 空格被特殊字符替换: ` -> %s`
  5. 带有感叹号的话,一切都会很复杂-如果有人会向我解释这种替换!! 帮助团队不跌倒-这将很酷。

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或其他应用程序并执行其操作而不是脚本。


就这样


我希望本文对您有所帮助,并且可以帮助您简化工作中此类问题的解决方案。

Source: https://habr.com/ru/post/zh-CN412551/


All Articles