vysor如何在非根设备上创建触摸事件?

3
这是Koushik Dutta的Vysor链接 - https://chrome.google.com/webstore/detail/vysor-beta/gidgenkbbabolejbgbpnhbimgjbffefm,它可以让你从电脑上控制Android设备。然而,长期以来困扰我的一个问题是,即使未root,它也能在手机上创建触摸事件。经过一些对应用程序和Chrome扩展的调试,我意识到他使用以下方式创建了一个单独的进程 -
sh -c "CLASSPATH=/data/app/com.koushikdutta.vysor-1/base.apk /system/bin/app_process32 /system/bin com.koushikdutta.vysor.Main"

Main类包含的代码通过反射将触摸事件传递给框架。

上述代码将Main类作为单独进程执行,该进程的用户是shell

目前,据我所知,除非您是root,否则创建应用程序外的触摸事件的唯一方法。

有人对此有什么想法吗?


考虑到它提示我进行adb调试并验证MAC地址(对于已经在此计算机上设置好调试的设备),我认为他正在使用adb传递触摸命令。 - CommonsWare
他正在使用adb将事件传递到apk内的“Main”类。 - omerjerk
而无论是adb还是其他任何东西,都需要root权限。 - omerjerk
我指的是Android SDK中的adb二进制文件。在Windows、OS X或Linux上运行adb不需要Root权限(例如,Windows没有像OS X和Linux那样的“Root”)。我有印象,在开发机器上通过adb有办法向设备上的应用程序发送触摸事件(例如,monkeyrunner等工具的方式)。但我不知道具体细节。 - CommonsWare
我也在想这在非root设备上是如何可能的。我刚刚在安装并运行了来自Chrome扩展的vysor应用之前和之后检查了ps。正如@omerjerk发现的那样,有几个shell进程正在运行。我尝试从shell中使用"am startservice",但我的服务没有获取到shell用户ID。你能告诉我我漏掉了什么吗? - Anil Maddala
1个回答

13

我已经想通了。

问题在于shell用户也被允许在屏幕上创建触摸事件。当您通过USB电缆将手机连接到PC并从PC执行adb shell时,您会自动分配用户shell

他所做的是,然后使用这个shell用户将他的Main类作为一个单独的进程启动。现在,Main类内部的Java代码具有与shell用户相同的权限(因为它是linux)。

而且,在那个类中,他使用反射将触摸事件传递给Android框架。然后,框架自动将触摸事件传播到窗口。

看看我在自己的应用程序中实现的这两个类- Main.javaEventInput.java

但是请记住,由于这个Main类必须在一个单独的进程中运行,它无法访问打包在其中的应用程序的内存。为此,我必须使用套接字机制传输数据。甚至可以使用aidl。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接