47

我正在尝试创建一个应用程序,该应用程序将在后台运行一项服务,该服务能够将触摸屏事件注入到正在运行的任何活动中。我可以通过调用将事件注入作为我的应用程序一部分的 ActivityInstrumentation.sendPointerSync(motionEvent);但是,如果我尝试在没有运行我的应用程序的活动的情况下执行此操作,我会收到一个权限错误,指出我没有 INJECT_EVENTS 权限。我已将此权限添加到我的清单中,如下所示:<uses-permission android:name="android.permission.INJECT_EVENTS"></uses-permission>它仍然抛出相同的权限异常。经过一番搜索,我得到了答案,为了获得 INJECT_EVENTS 权限,您的应用程序必须使用与系统签名相同的签名。但是我不清楚这到底意味着什么。我将不得不找到一个自定义 rom 构建它并使用与应用程序签名相同的签名对其进行签名。然后在我的设备上安装自定义 rom,然后安装我的应用程序,我就可以正确注入触摸事件了?如果是这种情况,我最好从一个已经放在一起的自定义 rom 开始,比如这个页面中的一个还是我需要获取 android 项目的 git 副本并构建整个 myslef 的情况?无论哪种方式,有没有人知道你可以指出一个地方,让我朝着正确的方向努力以实现这一目标?

4

8 回答 8

19

要将事件注入单独的进程,需要将您的应用程序安装到 /system/app并使用系统证书签署您的 APK。

1. 为应用清单添加权限

<uses-permission android:name="android.permission.INJECT_EVENTS"/>

2. 使用系统证书签署您的 APK

这要求您拥有 AOSP 源,以便使用用于构建在手机上运行的系统的 google 密钥构建密钥库。

鉴于您有一个 AOSP 目录,@Eli 出色地展示了如何使用名为“keytool-importkeypair”的漂亮脚本构建密钥库

以 IntelliJ 为例,从 Build 菜单中选择 Generate Signed APK..。找到上面创建的密钥库,输入给定的密码(例如,android),如果需要,为密钥提供相同的密码。请注意,签名的 apk 被写入项目根目录 (!) 而不是典型位置 (./out/production//)。

3.安装到/system/app/

adb root
adb remount
adb push MyApp.apk /system/app

“安装”会自动发生。但是请注意,与正常的应用程序安装过程不同,您的 APK 中的任何本机库都不会复制到 /system/lib/ 中。如果您使用 NDK 构建和调用您自己的本机库,则需要手动执行此操作。

于 2014-04-07T02:48:46.247 回答
13

实际上,这在有根设备上非常简单。我认为任何运行 /system 的应用程序都可以访问它需要的任何权限。所以只需手动将您的应用程序安装到 /system (如此处所述http://androidforums.com/droid-all-things-root/64603-installing-apk-system-app-directory.html):

在终端模拟器中执行以下命令,将 /system 目录重新挂载为读/写,并将应用程序从 SDCARD 安装到 /system/app 目录中:

su
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
cp /sdcard/APP.apk /system/app

如果您更喜欢在计算机上使用 adb,请执行以下命令:

adb remount
adb shell cp /sdcard/APP.apk /system/app

一些用户已使用 Google 市场的根浏览器来简化此过程。


或者,看看这个:How to compile Android Application with system permissions

于 2011-09-07T01:49:02.723 回答
9

使用触摸事件:

  1. 使用与 ROM 签名相同的签名对应用程序进行签名

  2. 下载 keytool-importkeypair 来执行此操作

  3. 找到platform.pk8 + platform.x509.pem:{Android Source}/build/target/product/security

  4. 然后生成证书:

    ./keytool-importkeypair -k google_certificate.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform

  5. 现在从 Eclipse 中导出您的应用程序并使用您生成的新证书进行签名

  6. 构建ROM,刷入设备,安装应用程序

查看http://code.google.com/p/android-event-injector/

于 2014-02-04T14:31:21.873 回答
6

从 API 18 开始,有 UiAutomation 类,它不绑定到用户权限。

有关更多信息,请参阅http://developer.android.com/reference/android/app/Instrumentation.html#getUiAutomation()

于 2015-06-03T12:10:51.763 回答
3

In case if anyone is looking for a solution to bypass this signature level permission and want to create touch events.

I looked at the source down to the C++ level where it is actually checked whether to allow the app to create touch events or not. The following is the function which actually checks if the app should be allowed or not :

bool InputDispatcher::hasInjectionPermission(int32_t injectorPid, int32_t injectorUid) {
return injectorUid == 0
        || mPolicy->checkInjectEventsPermissionNonReentrant(injectorPid, injectorUid);
}

So the function returns true of the user id of the app is set to 0.

Now I changed the uid if my app to 0 by editing the filee /data/system/packages.xml. This file contains the uid assigned to every app. Edit this file by setting the userId attribute corresponding to your app to 0.

Now all you need is to force close the app and restart again. You will be able to bypass the INJECT_EVENTS permission.

于 2014-07-29T11:18:34.663 回答
1

我之前也遇到过同样的问题,下面我解决了这个KEY_INJECT_EVENT_PERMISSION问题。

第 1 步:您需要获取设备 ROM 的签名(对我来说文件名为 signapk)。

第二步:接下来需要获取platform.pk8和platform.x509.pem文件。

第 3 步:生成应用程序的调试 apk。

第 4 步:将上述所有文件放在一个文件夹中。

第 5 步:获得所有上述文件后,运行下面提到的命令。

java -jar signapk.jar platform.x509.pem platform.pk8 your_debug_app.apk customname.apk

第 6 步:在此之后,您可以在同一个文件夹中获得一个签名的 apk(customname.apk)。一旦获得,运行以下命令。

adb install -r app-release-signed.apk

第7步:现在Inject_Event_Permisson将启用。

请参考以下链接:

https://steveandro.blogspot.com/2019/09/key-injection-android.html

于 2019-09-11T11:06:51.070 回答
0

如果您使用的是三星实体设备,在设备设置中将导航类型从滑动手势更改为按钮似乎可以解决此问题。

于 2021-02-02T11:39:17.573 回答
-1

好吧,我终于明白了。当我这么说的时候相信我,如果你甚至可以这样称呼它,这可能是最糟糕的解决方案。这需要 root 并且将禁用系统范围内所有包的签名验证。这可能会使您面临一系列攻击,其中危险的应用程序取代了正常的应用程序。

无论如何,我们走了:

  1. 安装 Xposed
  2. 为 Xposed 安装 XInstaller 模块
  3. 在 XInstaller 选项中,转到名为“安装”的菜单并选中“检查签名”和“验证应用程序”框

重启后你应该很好。您的应用程序甚至不需要作为系统安装,它现在可以在用户空间中运行,我认为这使开发更容易,因为您不再需要复制到 /system/app

于 2015-09-28T02:45:53.753 回答