Android投屏研究会之minitouch

 

Git URL:

 

git://www.github.com/openstf/minitouch.git

Git Clone代码到本地:

git clone http://www.github.com/openstf/minitouch

Subversion代码到本地:

$ svn co --depth empty http://www.github.com/openstf/minitouch
Checked out revision 1.
$ cd repo
$ svn up trunk

minitouchMinitouch提供了套接字接口,用于触发Android设备上的多点触控事件和手势。 如果在至少 SDK 25和更低版本上启动,但任何版本都应该能工作,那么它在不使用 root的情况下工作,如果。 唯一的例外是( Android Wear ) 20,它需要 root。 我们测试的最低SDK级别是 10 ( 例如。 Android 2.3.3 )。

这种方法与HTML5的多点触摸事件非常配合,而且与Android的工具不同,它允许你访问整个屏幕,并使用。

建筑

建筑物需要 NDK,而且至少可以与NDK版本 10 ( 2014 ) 一起工作。 注意NDK不再支持任何 below androidsdk级别 14,这意味着二进制文件可能或者可能无法在旧设备上工作( 比如 )。 Android 2.3 )

我们包括 libevdev 作为一个Git模块,所以首先要确定你已经获取了它。


git submodule init


git submodule update


那么这只是一个调用 ndk-build的问题。


ndk-build



你现在应该可以在 ./libs 中使用二进制文件了。

运行

你将需要先构建一个。 然后,可以使用 include run.sh 脚本在设备上运行正确的二进制文件。 如果连接了多个设备,请在运行脚本之前设置 ANDROID_SERIAL

要手动运行,必须首先确定你的设备支持哪些 ABI:

ABI=$(adb shell getprop ro.product.cpu.abi | tr -d 'r')

注意,作为 Android shell 总是以CRLF结尾,你必须删除像 上面 这样的CR,否则其他命令将不能正常工作。

注意如果已经连接多个设备,设置会使事情变得更加简单,因为每次都不需要指定 -s <serial>选项。

现在,将适当的二进制文件推送到设备:

adb push libs/$ABI/minitouch/data/local/tmp/

注意,对于 SDK <,你必须使用没有 PIE支持的minitouch-nopie 可执行文件。 检查 run.sh 以获得脚本示例。

此时,检查使用情况可能会很有用:

adb shell/data/local/tmp/minitouch -h

当前,这应该是沿着以下行的内容:


Usage:/data/local/tmp/minitouch [-h] [-d <device>] [-n <name>] [-v] [-i] [-f <file>]


 -d <device>: Use the given touch device. Otherwise autodetect.


 -n <name>: Change the name of of the abtract unix domain socket. (minitouch)


 -v: Verbose output.


 -i: Uses STDIN and doesn't start socket.


 -f <file>: Runs a file with a list of commands, doesn't start socket.


 -h: Show help.


因此,我们可以简单地运行二进制文件,而不用任何选项,它会尝试检测合适的设备并开始侦听抽象的unix域套接字。 或者,可以使用 -i 选项和输入命令直接启动 minitouch,或者通过 -f <file> 从文件中读取命令。

adb shell/data/local/tmp/minitouch

如果你选择使用套接字,则需要分别连接它。 除非出现错误消息,而且二进制文件退出,我们现在应该在设备上打开一个服务器。 现在我们只需要创建一个本地转发,这样我们就可以连接它。

adb forward tcp:1111 localabstract:minitouch

现在你可以使用本地端口连接到套接字。 注意,目前仅有一个连接,每次仅有一个连接。 这主要是因为在重新引导( 顺便说一下,由于没有响应的屏幕,你最可以能需要使用 adb reboot。) 之前,提交中断的事件流,混淆驱动程序,可能会冻结设备。 好了,让我们连接。

nc localhost 1111

下面的部分解释了如何与minitouch交互。

用法

假设你现在有到minitouch套接字的开放连接,或者在 stdin/文件模式下运行 minitouch。 如果没有,请按照上面的指令。

minitouch协议基于lf分离行。 每一行都是一个单独的命令,每一行都以一个指定命令类型的ASCII字母开始。 空格分隔命令特定参数然后跟随。

当你首先打开到套接字的连接时,你将收到一个 header,你将需要从套接字读取元数据。 除此之外,不会有任何的React。

从插槽读取

v <version>示例输出:v 1

协议版本。这一行保证在输出中首先出现。 参数布局可能在版本之间更改,因此你可能希望检查代码是否支持这里版本。

^ <max-contacts> <max-x> <max-y> <max-pressure>示例输出: ^ 2 320 480 255

这将给出参数的上限,如触摸设备所报告的。 如果使用较大的值,很可能会混淆驱动程序( 可能会冻结屏幕需要重启),或者该值将被忽略。

最重要的是要注意,最大的X 和Y 坐标可以能,但通常不是,MATCH 显示大小。 如果需要,你需要将显示坐标映射到触摸坐标,可以能是使用屏幕坐标的百分比。

$ <pid>示例输出:$ 9876

这是minitouch进程的pid。 如果要终止进程,则为有用。

可以写入插槽

c示例输入:c

提交当前更改的触摸集,使它的在屏幕上播放。 请注意,在你提交之前,不会出现任何可见的。

提交并不需要列出所有活动联系人。 从以前的状态更改足够。

多触点接触同样适用。 联系人可以在单独的提交中移动,甚至可以在相同的提交中移动。 如果一个联系人移动,则不需要其他。

单个提交中的触摸顺序并不重要。 例如你可以在联系人 0之前列出联系人 5.

但是注意,对于同一行,不能有一个上的dm 或者 u 插件。

r示例输入:r

Attemps通过创建适当的u 事件并提交它们来重置当前的触摸集。 由于有无效的事件序列可能会导致屏幕冻结,如果你对事件的完整性有任何疑问,你应该调用它。 例如同一联系人的两个 touchstart 事件非常可疑,很可能意味着你丢失了 touchend 事件。

我们试图自动丢弃out-of-order事件,但有时它是不够的。

如果屏幕冻结,你必须重新启动设备。 小心使用这将不会发生。

d <contact> <x> <y> <pressure>示例输入: d 0 10 10 50

<x>,<y> 上调度联系人 <contact>,并为下一次提交提供 <pressure> 压力。

不能有一个上的dm 或者 u 用于同一 <contact>

m <contact> <x> <y> <pressure>示例输入: m 0 10 10 50

在下一次提交时,在 <x>,<y> 上安排接触 <contact>的触摸移动,以及 <pressure> 压力。

不能有一个上的dm 或者 u 用于同一 <contact>

u <contact>示例输入:u 0

调度联系人 <contact> 上的联系人。 如果需要首先移动联系人,请使用 mu的组合,以提交的方式分隔。

不能有一个上的dm 或者 u 用于同一 <contact>

w <ms>示例输入:w 50

立即等待 <ms> 毫秒。 将不提交队列或者执行其他操作。

示例

用单个触点按住 50压力的( 10,10 )。


d 0 10 10 50


c


u 0


c


使用单个触点在( 10,10 ) 上长按 50个压力。


d 0 10 10 50


c


<wait in your own code>


u 0


c


点击( 10,10 ) 和( 20,20 ) 同时使用 50个接点进行压力。


d 0 10 10 50


d 1 20 20 50


c


u 0


u 1


c


点击( 10,10 ),保持按下,然后点击( 20,20 ),然后按下,然后释放第一个接触,最后释放第二个接触。


d 0 10 10 50


c


<wait in your own code>


d 1 20 20 50


c


<wait in your own code>


u 0


c


<wait in your own code>


u 1


c


使用单个联系人将( 0,0 ) 从滑动到( 100,0 )。 你将需要在自己代码中提交之间等待,以使它的降低。


d 0 0 0 50


c


m 0 20 0 50


c


m 0 40 0 50


c


m 0 60 0 50


c


m 0 80 0 50


c


m 0 100 0 50


c


u 0


c


从( 0,100 ) 到( 50,50 ),( 100,0 ) 到( 50,50 )的两个联系人。 你将需要在自己代码中提交之间等待,以使它的降低。


d 0 0 100 50


d 1 100 0 50


c


m 0 10 90 50


m 1 90 10 50


c


m 0 20 80 50


m 1 80 20 50


c


m 0 20 80 50


m 1 80 20 50


c


m 0 30 70 50


m 1 70 30 50


c


m 0 40 60 50


m 1 60 40 50


c


m 0 50 50 50


m 1 50 50 50


c


u 0


u 1


c


同样的压缩,但有更多的混乱( 自然自然) 排序。


d 1 100 0 50


c


d 0 0 100 50


c


m 1 90 10 50


m 0 10 90 50


c


m 0 20 80 50


c


m 1 80 20 50


c


m 0 20 80 50


m 1 80 20 50


c


m 0 30 70 50


c


m 1 70 30 50


c


m 1 60 40 50


c


m 0 40 60 50


c


m 0 50 50 50


m 1 50 50 50


c


u 0


c


u 1


c


赞 (3)