【问题标题】:Android INJECT_EVENTS permissionAndroid INJECT_EVENTS 权限
【发布时间】:2011-07-19 23:55:53
【问题描述】:

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

【问题讨论】:

  • 您说得对,您需要将此应用程序烘焙到 ROM 中。注入事件是常规应用无法授予的系统权限。
  • 正如我向其他人解释的那样......此权限不是常规类型,因此将其添加到清单中几乎没有效果。要使此权限生效,apk 必须使用系统证书进行签名。不适合普通开发者,只适合平台厂商

标签: android permissions rom


【解决方案1】:

要将事件注入到一个单独的进程中,需要安装您的应用到 /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 构建和调用您自己的原生库,则需要手动执行此操作。

【讨论】:

  • 如果您已经使用平台密钥签名,则不必另外安装到/system分区。
  • 如果您将应用构建为完整 AOSP 构建的一部分,您只需将 LOCAL_CERTIFICATE := platform 添加到应用的 Android.mk。
【解决方案2】:

实际上,这在有根设备上非常简单。我认为任何运行 /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

【讨论】:

  • 我猜描述有点混乱。将 apk 从 SD 卡复制到 /system/app 的行被视为“正在安装”
  • 我无法在 ICS 中使用已根植的 Transformer Prime。查看 INJECT_EVENTS 权限的 protectionLevel,它显示“签名”,而不是“signatureOrSystem”,这表明将应用程序移动到系统分区将无效。使用系统证书编译应该可以工作......
  • 实际上错误的是,权限是基于签名的,并且将 apk 放到系统/应用程序不会解决它必须使用签名 rom 映像的签名的任何问题。
  • 作为参考,您可以在这里看到 INJECT_EVENTS 权限是保护级别“签名”而不是“签名或系统”:github.com/android/platform_frameworks_base/blob/master/core/…
  • 我不知道为什么这是公认的答案,并且当它不正确时得票最多。简单地安装到 /system/app 不会授予此权限。正如其他人所说,它还必须使用系统证书进行签名。
【解决方案3】:

使用触摸事件:

  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/

【讨论】:

  • 什么是{Android Source}?我在任何地方都找不到它
  • 安装 Android 源代码的路径
  • 你的意思是 Android Studio 或 Eclipse 把他们的 sdks 放在哪里了?还是别的什么?
【解决方案4】:

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

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

【讨论】:

  • 是否可以模拟单点触摸等不同的触摸事件,并使用此方法滑动?谢谢。
  • @Dania 当然。但我的回答可能有点令人困惑。我假设作者有测试目的,这意味着他提到的“服务”将通过 adb 运行(通常使用 USB 连接到开发人员的机器)。如果是这种情况,你有,然后从这里开始:developer.android.com/intl/ru/training/testing/ui-testing/… 在那个示例 UI Automator 测试框架中使用的是 UiAutomation 类。您可以使用 UI Automator 方法或通过 getInstrumentation().getUiAutomation() 获取 UiAutomation 实例,以对事件拥有更多权力。
  • @Sergey Krasilnikov,谢谢你的回答。
【解决方案5】:

如果有人正在寻找绕过此签名级别权​​限并想要创建触摸事件的解决方案。

我查看了 C++ 级别的源代码,在该级别实际检查是否允许应用程序创建触摸事件。以下是实际检查应用程序是否应该被允许的函数:

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

所以函数返回true的应用程序的用户id设置为0。

现在我通过编辑文件/data/system/packages.xml 将我的应用程序的 uid 更改为 0。此文件包含分配给每个应用程序的 uid。通过将与您的应用对应的 userId 属性设置为 0 来编辑此文件。

现在您只需强制关闭应用并重新启动即可。您将能够绕过INJECT_EVENTS 权限。

【讨论】:

  • /data/system/packages.xml 会在哪里?
  • 在 /data 分区内。设备必须 root 才能访问。
  • 我找到了 packages.xml。我正在将应用程序开发为在后台运行的服务,该服务从启动完成开始。如果我更改 packages.xml 文件,我必须重新启动它以获取该 uID=0,并且修改后的 packages.xml 也会在我重新启动时恢复。还有其他方法可以从 /out 目录中更改 packages.xml 吗?或者,有没有其他方法可以更改我的应用程序的 uId?
  • 更改 packages.xml 中的 userId 不会更改应用程序的用户 ID。这个方法不是真的。
【解决方案6】:

我之前也遇到过同样的问题,通过以下方式我解决了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

【讨论】:

    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

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

      不管怎样,我们走吧:

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

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

      【讨论】:

      • 在运行单元测试时是否应该在 android 模拟器上工作?
      • 我不确定。如果您可以让 Xposed 在模拟器上正确安装,那么它应该从那里一帆风顺,但 Xposed 并不以在不同架构上工作而闻名。另外:stackoverflow.com/questions/18142924/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 2023-02-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多