Android INJECT_EVENTS权限

Foa*_*Guy 41 permissions android rom

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

Bre*_*ust 19

要将事件注入单独的进程,需要将应用程序安装到/ system/app 使用系统证书对APK进行签名.

1.添加应用清单的权限

<uses-permission android:name="android.permission.INJECT_EVENTS"/>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您将应用程序构建为完整AOSP构建的一部分,则只需将"LOCAL_CERTIFICATE:= platform"添加到应用程序的Android.mk即可. (3认同)

Yos*_*ssi 12

实际上,这在root设备上非常简单.我认为任何正在运行的应用程序/系统都可以访问它所需的任何权限.因此,只需手动将您的应用程序安装到/ 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
Run Code Online (Sandbox Code Playgroud)

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

adb remount
adb shell cp /sdcard/APP.apk /system/app
Run Code Online (Sandbox Code Playgroud)

一些用户使用了Google市场上的root explorer来简化此过程.


或者,检查一下:如何使用系统权限编译Android应用程序

  • 实际上错误的是权限是基于签名的,并且将apk放到系统/应用程序将无法解决它必须使用签署rom图像的签名进行签名的任何问题. (13认同)
  • 我无法在有根据的Transformer Prime上使用ICS.查看保护级别的INJECT_EVENTS权限,它表示"签名",而不是"signatureOrSystem",它建议将应用程序移动到系统分区将不起作用.使用系统certifcate进行编译应该可以正常工作...... (4认同)
  • 我不知道为什么这是接受的答案,并且当它不正确时票数最多.只需安装到/ system/app就不会授予此权限.正如其他人所说,它也必须与系统证书签署. (4认同)
  • 作为参考,您可以看到INJECT_EVENTS权限是保护级别"签名"而不是"signatureOrSystem":https://github.com/android/platform_frameworks_base/blob/master/core/res/AndroidManifest.xml#L1720 (3认同)

wwj*_*jdm 8

使用触摸事件:

  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/


Ser*_*kov 6

从API 18开始,有UiAutomation类,它不受用户权限的约束.

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