通过root访问Android中的事件输入节点

时间:2015-10-30 18:27:05

标签: android code-injection android-permissions chroot

我希望能够将不同的事件注入Android设备。经过一些搜索,我发现我可以通过访问Android操作系统中的事件输入节点来实现这一点,这些节点位于dev/input/eventX中。一旦访问它们,就可以进行读写操作,因此我可以注入事件。

问题是这些节点只能在root设备中访问。如果我尝试在没有生根的情况下使用它们,则该过程将失败,如本文所述,

http://www.pocketmagic.net/programmatically-injecting-events-on-android-part-2/

我不想让设备生根以保证其保修。我在网上搜索了访问Android操作系统的可能方法,但我只发现了root。

我认为它可行的替代方法是将应用程序编译为系统应用程序,但我无法确定这是否允许它对事件输入节点具有访问权限(读取和写入权限)。这种方法会提供这些特权吗?

如果没有,是否有其他替代方法可以生根,我可以在没有设备生根的情况下为我的应用程序提供系统权限?

感谢任何帮助。

感谢。

编辑:为了详细说明,我想要注入不同的触摸事件。例如,单点触摸,滑动等。

1 个答案:

答案 0 :(得分:1)

您可以通过执行Android附带的/system/bin/input实用程序在设备上注入输入事件。您可以在this question中看到一些使用它的示例(通过adb)。输入实用程序似乎不需要任何特殊权限来执行。

要创建系统应用程序,您需要访问在为您的设备构建Android操作系统时使用的签名密钥 - 您不能只修改普通应用程序以获得系统权限。即使你可以,它也不会给你root访问权限(尽管你可能使它成为/dev/input/eventX设备似乎也允许访问的输入用户组的一部分)。

如果要注入触摸事件,可以使用Java Runtime class/system/bin/input方法执行exec()实用程序,或者只使用injectMotionEvent()方法/** * Builds a MotionEvent and injects it into the event stream. * * @param inputSource the InputDevice.SOURCE_* sending the input event * @param action the MotionEvent.ACTION_* for the event * @param when the value of SystemClock.uptimeMillis() at which the event happened * @param x x coordinate of event * @param y y coordinate of event * @param pressure pressure of event */ private void injectMotionEvent(int inputSource, int action, long when, float x, float y, float pressure) { final float DEFAULT_SIZE = 1.0f; final int DEFAULT_META_STATE = 0; final float DEFAULT_PRECISION_X = 1.0f; final float DEFAULT_PRECISION_Y = 1.0f; final int DEFAULT_DEVICE_ID = 0; final int DEFAULT_EDGE_FLAGS = 0; MotionEvent event = MotionEvent.obtain(when, when, action, x, y, pressure, DEFAULT_SIZE, DEFAULT_META_STATE, DEFAULT_PRECISION_X, DEFAULT_PRECISION_Y, DEFAULT_DEVICE_ID, DEFAULT_EDGE_FLAGS); event.setSource(inputSource); Log.i(TAG, "injectMotionEvent: " + event); InputManager.getInstance().injectInputEvent(event, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); } 3}}。

以下是从Android源码中获取的方法,显示如何注入MotionEvent - 您可以查看完整的InputManager以获取更多信息。

dictionary

这些方法只允许您将事件注入您自己的应用程序窗口

如果您想将事件注入不属于您的应用程序的其他窗口,您需要在应用程序清单中声明其他权限(READ_INPUT_STATE和INJECT_EVENTS)使用Android操作系统签名密钥对您的应用程序进行签名。换句话说,将事件注入其他应用程序所需的权限永远不会授予普通应用程序(出于显而易见的原因)。